如何在pytest中使用sys.argv为一个函数创建多个测试

如何解决如何在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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?