如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?

2023-12-30

  • 我正在使用 Python 库编写单元测试pytest
  • 我需要指定一个目录用于测试文件以避免自动发现测试文件,因为有一个很大的子目录结构,包括库中的许多文件名称中包含“_test”或“test_”但不适合pytest
  • 库中的一些文件使用argparse用于指定命令行选项
  • 问题在于,将 pytest 的目录指定为命令行参数似乎会干扰使用 argparse 的命令行选项

举个例子,我的根目录中有一个文件,名为script_with_args.py如下:

import argparse

def parse_args():
    parser = argparse.ArgumentParser(description="description")

    parser.add_argument("--a", type=int, default=3)
    parser.add_argument("--b", type=int, default=5)

    return parser.parse_args()

我还有一个名为tests在根目录中,包含一个名为的测试文件test_file.py:

import script_with_args

def test_script_func():
    args = script_with_args.parse_args()
    assert args.a == 3

如果我打电话python -m pytest从命令行来看,测试顺利通过。如果我从命令行指定测试目录python -m pytest tests,返回以下错误:

============================= test session starts =============================
platform win32 -- Python 3.6.5, pytest-3.5.1, py-1.5.3, pluggy-0.6.0
rootdir: C:\Users\Jake\CBAS\pytest-tests, inifile:
plugins: remotedata-0.2.1, openfiles-0.3.0, doctestplus-0.1.3, arraydiff-0.2
collected 1 item

tests\test_file.py F                                                     [100%]

================================== FAILURES ===================================
______________________________ test_script_func _______________________________

    def test_script_func():
        # a = 1
        # b = 2
>       args = script_with_args.parse_args()

tests\test_file.py:13:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
script_with_args.py:9: in parse_args
    return parser.parse_args()
..\..\Anaconda3\lib\argparse.py:1733: in parse_args
    self.error(msg % ' '.join(argv))
..\..\Anaconda3\lib\argparse.py:2389: in error
    self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = ArgumentParser(prog='pytest.py', usage=None, description='description', f
ormatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_h
elp=True)
status = 2, message = 'pytest.py: error: unrecognized arguments: tests\n'

    def exit(self, status=0, message=None):
        if message:
            self._print_message(message, _sys.stderr)
>       _sys.exit(status)
E       SystemExit: 2

..\..\Anaconda3\lib\argparse.py:2376: SystemExit
---------------------------- Captured stderr call -----------------------------
usage: pytest.py [-h] [--a A] [--b B]
pytest.py: error: unrecognized arguments: tests
========================== 1 failed in 0.19 seconds ===========================

我的问题是,如何指定 pytest 的测试文件目录,而不干扰 argparse 的命令行选项?


parse_args()不带参数读取sys.argv[1:]列表。这将包括“测试”字符串。

pytests也用那个sys.argv[1:]有自己的解析器。

使你的解析器可测试的一种方法是提供一个可选的argv:

def parse_args(argv=None):
    parser = argparse.ArgumentParser(description="description")

    parser.add_argument("--a", type=int, default=3)
    parser.add_argument("--b", type=int, default=5)

    return parser.parse_args(argv)

然后你可以用以下方法测试它:

parse_args(['-a', '4'])

并真正使用它

parse_args()

改变sys.argv也是个好办法。但是,如果您打算将解析器放入这样的函数中,那么您不妨为其提供额外的灵活性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在使用 argparse 的文件上使用指定的测试目录运行 pytest? 的相关文章

随机推荐

  • 如何在 FastAPI 中上传 CSV 文件并将其转换为 Pandas Dataframe?

    我想将文件上传到 FastAPI 后端并将其转换为 Pandas DataFrame 但是 我似乎不明白如何使用 FastAPI 来做到这一点UploadFile https fastapi tiangolo com tutorial re
  • React Router Switch 和确切路径

    我读过这份文件反应路由器开关 https github com ReactTraining react router blob master packages react router docs api Switch md 我了解交换机和路
  • 周围物体算法

    我正在开发一款游戏 该位置可能只存在一个对象 x y where x and y are ints 例如 一个对象可能存在于 0 0 也可能不存在 但不可能同时存在多个对象 我正在尝试决定使用哪个 STL 容器来解决当前的问题以及解决此问题
  • iPhone 相机对焦

    我使用下面的代码来对焦 iPhone 相机 但它不起作用 我从Apple的AVCam示例代码中获取了这段代码 我做错了什么吗 有什么方法可以 检测iPhone是否对焦 void focusAtPoint CGPoint point AVCa
  • Chrome 有内置的调用堆栈吗?

    在 Visual Studio 中 我习惯于在任何断点处显示调用堆栈 Chrome 是否具有调用堆栈功能 可以让我查看断点之前的函数 如果没有 是否有替代方案 适用于 Chrome 的第三方解决方案 供开发人员用来查看哪些函数导致了断点 编
  • Microsoft SQL Server 中表的事务隔离级别

    这更多的是对我想法的确认 而不是一个问题 可以在 SQL Server 中以表为基础更改隔离级别 还是只能在会话级别上定义 更改 如下面的语句所示 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 那
  • 点击 NavigationLink 后如何执行操作?

    我的第一个视图中有一个加号按钮 看起来像一个 FAB 按钮 我想在点击 NavigationLink 中包含的某个步骤后隐藏它 到目前为止我有这样的事情 ForEach 0 lt 12 item in NavigationLink dest
  • Winforms ListView - 双击时停止自动检查

    如何使列表视图在双击某个项目时不自动检查该项目 我可以尝试挂钩 MouseDoubleClick 事件 并将 Checked 属性设置为 false 但这感觉有点像黑客 当实际检查某个项目时 我还会运行相当昂贵的计算 并且不希望此代码在双击
  • java中如何识别检查异常和非检查异常?

    在阅读有关异常的内容时 我总是会遇到受控异常和非受控异常 所以想知道如何区分哪个是什么 编辑 我想知道我是否创建任何异常类 那么如何创建为已检查或未检查的异常类 每个的意义是什么 All Throwables 除了以下子类java lang
  • 在未安装 Excel 的服务器上生成 Excel 文件

    我在用Microsoft Office Interop Excel并使用生成 Excel 文件SaveAs方法 这一切都可以在安装了 Excel 的计算机上正常运行 但是 我的服务器没有安装 Excel 如何生成我的文件 If you ge
  • 从 Shell 脚本将日期传递给 C 程序

    我想将用户以 YYYY MM DD HH24 MI SS 格式输入的日期传递给 C 程序 该程序进一步在数据库中输入条目 当我将命令行参数中输入的日期作为 2010 07 15 12 13 14 传递时 C 程序将其视为 2 个参数而不是
  • 当针对 ES5 / ES3 时,Typescript 会转译什么?

    我试图了解 Typescript 编译器何时会转译代码以使其与我指定的目标 ECMAScript 版本 ES5 或 ES3 兼容 例如 TSC 将转译for var int of intArray 很好 但它不转译Number isInte
  • 时间:2019-03-17 标签:c#EnumFunctionParameters

    作为后续这个问题 https stackoverflow com questions 492115 c enums as function parameters 如何调用函数并传入枚举 例如我有以下代码 enum e1 public voi
  • 生成器无法按特定标识符分割字符串。蟒蛇2

    到目前为止 我已经找到了一种生成名称 字符串和额外字符串的方法 它适用于第二个但不适用于第一个 这很奇怪 因为格式非常相似 是因为它是多行吗 我以为if line pass将绕过该问题 我在打印中添加了 n 以显示差异 Input firs
  • 计算统计模式

    我目前正在尝试验证 给定一个长度为 N 的未排序数组 A 和一个整数 k 是否存在某个元素出现 n k 次或更多次 我对这个问题的想法是计算众数 然后将其与 n k 进行比较 但是 我不知道如何快速计算此模式 我的最终结果需要是nlog k
  • LLVM 做了哪些类型的优化以及其前端必须自行实现哪些类型的优化?

    注意 我注意到了这个问题 https stackoverflow com questions 6672008 llvm and the future of optimization与这个问题有很多相关性 所以如果您对我的问题感兴趣 您绝对应
  • json 库将空格字符解释为“\xa0”

    当我将 json 文件加载到 python 中时 只要该文件被视为字符串 编码就没有问题 但是 使用文件上的 json load 或字符串上的 json loads 将文件加载为 json 格式时 所有空格字符都会显示为 xa0 以下代码产
  • iOS 发行版 - plist 的 itms-services 协议链接中的参数

    我想在 itms services 链接中传递用户 ID 和密码 以便可以访问受保护的 plist 澄清一下 在下面的链接中 无法直接访问 plist 因为访问需要输入用户名和密码才能访问 plist a href 目前上面的链接出现错误
  • AWS ELB 自己处理 HA 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 也许是一个愚蠢的问题 但我已经搜索了一段时间 为了确保 aws ELB HA 我是否应该在控制台中显式创建两个 ELB 实例 还是 aws
  • 如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?

    我正在使用 Python 库编写单元测试pytest 我需要指定一个目录用于测试文件以避免自动发现测试文件 因为有一个很大的子目录结构 包括库中的许多文件名称中包含 test 或 test 但不适合pytest 库中的一些文件使用argpa