python - 如何使用接受命令行参数的嵌套模块对 python 脚本进行单元测试?
问题描述
我有一个这样的示例代码。如何使用不同的输入 a、b、c(通过命令行)对 gen_a、gen_b、gen_c、...、gen_z 进行单元测试?我知道,我的代码组织得非常糟糕......这些模块不接受任何输入。那么,如何在单元测试中设置命令行参数呢?谢谢!
import argparse
def parse_args():
parser = argparse.ArgumentParser(description='Davidson')
parser.add_argument('-a', '--a', type=int, default=1,)
parser.add_argument('-b', '--b', type=int, default=2)
parser.add_argument('-c', '--c', type=int, default=3)
return parser.parse_args()
def gen_d():
args = parse_args()
a = args.a
b = args.b
c = args.c
'''using a,b,c to create d '''
return d
def gen_e():
d = gen_d()
'''using d create e '''
return e
def gen_f():
e = gen_e()
'''using e create f '''
return f
def gen_g():
f = gen_f()
'''using f create g '''
return g
'''and so on'''
def gen_z():
y = gen_y()
'''using y create z '''
return z
解决方案
命令行由 Python 中的列表变量表示,该sys.argv
变量可以在每个单元测试中使用要指定的参数显式设置。
该parse_args()
函数默认使用 sys.argv 作为参数列表,但您可以通过指定显式参数列表来覆盖它;例如parser.parse_args(args=myargs)
。
== mylib.py ==
import argparse
def parse_args(s):
parser = argparse.ArgumentParser(description='Davidson')
parser.add_argument('-a', '--a', type=int, default=1)
parser.add_argument('-b', '--b', type=int, default=2)
parser.add_argument('-c', '--c', type=int, default=3)
return parser.parse_args()
def gen_d():
args = parse_args()
a = args.a
b = args.b
c = args.c
# using a,b,c to create d
d = a + b + c
return d
'''and so on'''
这是调用您的代码的示例单元测试类。
== mytest.py ==
import unittest
import sys
import mylib
class MyTest(unittest.TestCase):
def test_gen_d(self):
# mock command-line args to your script:
sys.argv = ['python', '--a=100', '--b=20']
value = mylib.gen_d()
self.assertEqual(123, value)
if __name__ == '__main__':
unittest.main()
推荐阅读
- audio - 用新的视频音频替换现有的视频音频并循环播放音频直到视频完成 [FFMPEG]
- python - 如何从给定的输入创建列表列表?
- fetch-api - 使用交叉获取的文件上传导致服务器上的套接字异常
- python - 如何使用 python/django 在 PDF 中添加数字签名或签名图像?
- xcode - 每当添加断点时 LLDB 就会崩溃
- r - 在 R 中设置边距
- csv - Google Drive API v3 - 在工作表中导入 CSV - 是否可以禁用智能转换?
- reactjs - 有没有办法改变 reactjs 中状态变量的值,即使在页面刷新后它仍然保持变化
- vagrant - PC重新启动后,流浪机器无法启动。它显示端口冲突
- spring - Spring Boot 在 BasicAuthenticationFilter 上抛出 NumberFormatException