我正在尝试测试一个非常简单的函数(由于多次尝试使用参数解析器作为参数来测试一个更复杂的函数而失败)。
#来自./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
答案 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'])