我正在研究自动测试框架(使用pytest)来测试应用程序的多种风格。测试框架应该能够解析常见的(针对所有风味)命令行args和特定于风味的args。 代码如下:
parent.py:
T
MainScript.py:
Comparable
Test_Cases.py
import argparse
ARGS = None
PARSER = argparse.ArgumentParser()
PARSER.add_argument('--arg1', default='arg1', type=str, help='test arg1')
PARSER.add_argument('--arg2', default='arg2', type=str, help='test arg2')
def get_args():
global ARGS
if not ARGS:
ARGS = PARSER.parse_args()
return ARGS
执行MainScript.py失败,并出现以下错误:
E ArgumentError:参数--arg3:冲突的选项字符串:--arg3
答案 0 :(得分:1)
所以问题是您已经声明
PARSER.add_argument('--arg3', default='arg3', type=str)
在MainScript.py
内部的全局范围内。这意味着该代码行将在每次导入时都像在Test_Cases.py
中那样执行,因此为什么会出现冲突错误,所以您将arg 3两次添加到argparse中。
最简单的解决方案是将PARSER.add_argument('--arg3', default='arg3', type=str)
移到您的main()
函数中,因为该函数只会被调用一次。
def main():
PARSER.add_argument('--arg3', default='arg3', type=str)
pytest.main(['./Test_Cases.py', '-v'])
但是这样做会导致另一个问题,这源于您对get_args()
的多重定义。当您在get_args()
之前调用main()
时,它仅包含parent.py
中的两个已定义参数,因此缺少arg3。如果您将通话移至main()
或至少在main()
被呼叫后才可以使用。
我个人只是从get_args()
中删除了MainScript.py
的定义和调用,效果很好。