如何与使用argparse文件规定的试验目录中运行pytest?(How to run pytest

2019-09-30 21:10发布

  • 我编写单元测试使用pytest一个Python库
  • 我需要指定测试文件的目录 ,以避免自动测试文件发现,因为有一个大的子目录结构,包括在名称含“_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命令行选项的干扰?

Answer 1:

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也是不错的方法。 但是,如果你打算把解析器这样的功能的工作,你还不如给它更高的灵活性。



Answer 2:

为了增加hpaulj的回答,您还可以使用库像unittest.mock暂时掩盖的价值sys.argv 。 这样,你的解析ARGS命令将运行使用“嘲笑”的argv但实际 sys.argv保持不变。

当你的测试中调用parse_args()他们能做到这一点是这样的:

with unittest.mock.patch('sys.argv', ['--a', '1', '--b', 2]):
    parse_args()


文章来源: How to run pytest with a specified test directory on a file that uses argparse?