pytest-测试解析器错误:无法识别的参数

时间:2019-03-20 11:10:43

标签: python testing pytest

我正在尝试测试一个非常简单的函数(由于多次尝试使用参数解析器作为参数来测试一个更复杂的函数而失败)。

  

#来自./runfile.py

import argparse
import os


def get_input_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('--priv_raw_name', default='private_data.csv', type=str,
                    help='Set raw private/source datafile name')
    args = parser.parse_args()
    return args
  

#来自./tests/test_args.py

import pytest
from runfile import get_input_args

def test_parser():
    parser = get_input_args()
    assert 1

当我运行脚本runfile.py时,所有工作均按预期方式进行,但是,当我调用pytest tests/test_args.py时,却收到以下无法识别的自变量错误消息。

我尝试设置conftest.py文件并使用addoption,但似乎遇到的错误远远超出了我的修复经验。谁能指出我使用核心脚本中的默认参数来运行测试的正确方向,但没有tests/test_args.py被称为实际测试本身的参数吗?

    (Project_Cascade) ➜  Project_Cascade git:(WIP) ✗ pytest tests/test_args.py
========================================================================= test session starts =========================================================================
platform darwin -- Python 3.6.5, pytest-4.3.1, py-1.8.0, pluggy-0.9.0
rootdir: /Users/davidmellor/Code/Spend_Network/Data_Projects/Project_Cascade, inifile:
collected 1 item

tests/test_args.py F                                                                                                                                            [100%]

============================================================================== FAILURES ===============================================================================
_____________________________________________________________________________ test_parser _____________________________________________________________________________

    def test_parser():
>       parser = get_input_args()

tests/test_args.py:5:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
runfile.py:50: in get_input_args
    args = parser.parse_args()
/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/argparse.py:1733: in parse_args
    self.error(msg % ' '.join(argv))
/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/argparse.py:2389: in error
    self.exit(2, _('%(prog)s: error: %(message)s\n') % args)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _

self = ArgumentParser(prog='pytest', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)
status = 2, message = 'pytest: error: unrecognized arguments: tests/test_args.py\n'

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

/usr/local/Cellar/python/3.6.5_1/Frameworks/Python.framework/Versions/3.6/lib/python3.6/argparse.py:2376: SystemExit
------------------------------------------------------------------------ Captured stderr call -------------------------------------------------------------------------
usage: pytest [-h] [--priv_raw_name PRIV_RAW_NAME]
pytest: error: unrecognized arguments: tests/test_args.py

1 个答案:

答案 0 :(得分:1)

问题来自parser.parse_args调用,该调用接受可选的args参数。如果未提供此参数,则从sys.argv中获取args。

执行pytest tests/test_args.py时,sys.argv包含['pytest', 'tests/test_args.py']。列表的第一个元素是被调用程序,第二个是第一个参数。

因此,在没有其parser.parse_args参数的情况下调用args会将 tests / test_args.py 视为解析器的第一个声明参数的值。幸运的是,它无法解析它,并且显式消息无法识别的参数出现错误:tests / test_args.py

要进行检查,可以在测试中添加断点,然后再调用parser.parse_args并检查sys.argv

调用pytest而不指定要运行的文件(仅pytest)应该没有问题。

无论如何,您的测试应以任何方式通过。您要做的就是为测试中的args调用指定明确的parser.parse_args

例如,传递一个空列表将起作用:

parser.parse_args([])

但是您可能希望使用priv_raw_name选项的值对其进行测试:

parser:parse_args(['--priv_raw_name', 'any/test/path'])