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

标签 python command-line-interface pytest argparse

  • 我正在使用 为 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 ===========================
    

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

    最佳答案

    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也是不错的办法。但是,如果您打算将解析器放入这样的函数中,您不妨给它这种额外的灵活性。

    关于python - 如何在使用 argparse 的文件上使用指定的测试目录运行 pytest?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51710083/

    相关文章:

    python - 用户使用 DRF token 身份验证登录后,如何在 HTTP 响应中返回用户 ID?

    php - PHP 脚本中的最大执行时间错误,这是绕过它的好方法吗?

    linux - 如何在 Linux 中操作重启一个 bash shell 脚本

    python - 检索当前运行的测试用例的名称

    python - 如何设置使用 pipelinev 运行 pytest 的 GitHub 操作?

    python - 针对字符串中字符频率的优化计数器

    python - 如何在特定日期的特定时间运行 Airflow?

    python - 如何从 HexBytes 对象中获取十六进制字符串?

    javascript - 在 Windows 10 机器上已经启动了一些其他 Node.js 文件后如何启动一个新的 Node.js 文件?

    python-2.7 - 如何使用pytest测试使用数据库连接的python函数?