如何运行单元测试来测试具有 argparse 属性的脚本?
Posted
技术标签:
【中文标题】如何运行单元测试来测试具有 argparse 属性的脚本?【英文标题】:How to run unit test which testing the script with argparse attributes? 【发布时间】:2021-05-03 03:39:42 【问题描述】:我有一个带有 argparse 的简单程序 my_code.py 和带有测试代码的 test_code.py。请帮助我了解如何正确运行 test_code.py。当我尝试基本命令时,出现如下错误:
测试:python -m unittest test_code.py
AttributeError: 'module' 对象没有属性 'py'
测试用例:python -m unittest test_code.Test_Code
python -m unittest: 错误:参数太少
测试方法:python -m unittest test_code.Test_Code.test_double_name
python.exe -m unittest: 错误:需要以下参数:名称
# my_code.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
parser.add_argument('-d', '--double', action="store_true")
def double_name(new_name):
if args.double:
return new_name + new_name
else:
return new_name
if __name__ == "__main__":
args = parser.parse_args()
print(double_name(args.name))
# test_code.py
import unittest
import my_code
class Test_Code(unittest.TestCase):
def test_double_name(self):
my_code.args = my_code.parser.parse_args([])
self.assertEqual(my_code.double_name('test-name'), 'test-name')
my_code.args = my_code.parser.parse_args(["test-name", "-d"])
self.assertEqual(my_code.double_name('test-name'), 'test-nametest-name')
if __name__ == "__main__":
unittest.main()
【问题讨论】:
code
是 Python 中的包名 - 不要将它用于您的模块。
另外,将 arg 解析代码与您的函数分开,例如将 arg 解析的结果传递给函数。如果您也想测试,也可以将 arg 解析放在一个单独的函数中。
【参考方案1】:
您好,您的解析器使用不正确,无法调用变量
code.py
code.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument(
"--name",
metavar="name",
type=str,
)
parser.add_argument(
"--double",
metavar="double",
type=str,
)
def double_name(new_name):
if args.double:
return new_name + new_name
else:
return new_name
if __name__ == "__main__":
args = parser.parse_args()
print(double_name(args.name))
测试 argparse,您可以查看This Post
【讨论】:
以上是关于如何运行单元测试来测试具有 argparse 属性的脚本?的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?