如何在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.extend(some_test_args)手动修改sys.argv,然后删除参数?

注意:我不能通过在parser.add_argument()中设置nargs=?来使用argparse可选的位置参数,因为前两个参数是可选的,并且每种情况(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'),我必须创建parser_a = argparse.ArgumentParser()并添加组A参数,解析它们,然后为parser_b重复。

因此,到目前为止,我拥有的最好的解决方案是使用sys.argv,尽管这对测试来说很不方便。另外,在不分组的情况下添加所有选项将产生另一个问题,因为组B参数取决于从组A解析的值。

一种解决方法是指定使用--unknown-arg=999,但这会在文档和脚本的使用中造成不一致,这也不是我所需要的。

你能把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

相关内容

  • 没有找到相关文章

最新更新