如何解决如何在pytest中使用sys.argv为一个函数创建多个测试
import argparse
import sys
def execute():
parser = argparse.ArgumentParser()
if (total_args := len(sys.argv)) == 1:
do_stuff()
if total_args == 2:
first = sys.argv[1]
do_stuff2()
if total_args == 3:
first,second = sys.argv[1:3]
do_stuff3()
if total_args > 3:
first,second = sys.argv[1:3]
del sys.argv[1:3]
add_args(parser)
parser.parse_args()
do_stuff4()
哪个应该有一个测试函数 test_execute
来尝试不同的给定参数,问题是:有没有一种干净的方法可以做到这一点,而无需使用 sys.argv
手动修改 sys.argv.extend(some_test_args)
并删除参数稍后?
注意:我不能通过在 argparse
中设置 nargs=?
来使用 parser.add_argument()
可选位置参数,因为前 2 个参数是可选的,并且每种情况 (1,2,3,> 3 个参数)执行不同的函数。要进一步了解,请查看下面的示例...
parser = argparse.ArgumentParser()
parser.add_argument('arg1',nargs='?')
parser.add_argument('arg2',nargs='?')
args = parser.parse_kNown_args()
print(args)
>>> python my_script.py --unkNown-arg 999
将打印:
(Namespace(arg1='999',arg2=None),['--unkNown-arg'])
这完全不是我需要的。我希望 arg1
具有 None
值。有时会出现未知参数的原因是 argparse
不支持通过指定组来解析参数。假设我有参数组 A
和参数组 B
,我只需要解析组 A
,我不能做 parser.parse_group('A')
我将不得不创建 {{1 }} 并添加组 parser_a = argparse.ArgumentParser()
参数并解析它们并重复 A
。
因此,我目前最好的解决方案是使用 parser_b
,尽管这不便于测试。在不分组的情况下添加所有选项会产生另一个问题,因为组 sys.argv
参数取决于从组 B
解析的值。
一种解决方法是指定使用 A
,但这会在文档和脚本的使用中造成不一致,这也不是我所需要的。
解决方法
您能否将 sys.argv
传入 execute()
?
像这样:
import argparse
import sys
def execute(argv):
parser = argparse.ArgumentParser()
if (total_args := len(argv)) == 1:
do_stuff()
if total_args == 2:
first = argv[1]
do_stuff2()
if total_args == 3:
first,second = argv[1:3]
do_stuff3()
if total_args > 3:
first,second = argv[1:3]
del argv[1:3]
add_args(parser)
parser.parse_args(argv)
do_stuff4()
if __name__ == "__main__":
execute(sys.argv)
在您的测试中,您可以执行以下操作:
def test_execute():
test_argv = ["some","args","list"]
execute(test_argv)
# assert something
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。