【问题标题】:Pycharm : Cant run unit tests with command line argumentsPycharm:无法使用命令行参数运行单元测试
【发布时间】:2019-03-22 13:28:06
【问题描述】:

这是我的测试课

class TestProjectCreation(unittest.TestCase):

    def setUp(self):
        self.project_path = os.path.dirname(os.path.abspath(__file__))
        self.project = ClassA('adasdasd', self.project_path)

    def test_etl_project(self):
        self.assertEqual(self.project.project_name,'adasdasd')


if __name__ == '__main__':
    unittest.main()

这里是ClassA

class ClassA(BaseClass):

    def __init__(self, project_name, project_path):
        super(ClassA, self).__init__(project_name, project_path)

最后,这里是BaseClass

class BaseClass(object):

    def __init__(self, project_name, project_path):
        self.project_path = project_path
        self.project_name = project_name
        self.parser = self.create_option_parser()
        (self.options, args) = self.parser.parse_args()
        self.check_mandatory_options(self.options)
        self.check_project_name(self.options)

    def check_mandatory_options(self, options):
        missing_arguments = []

        if not options.para1:
            missing_arguments.append('para1')
        if not options.para2:
            missing_arguments.append('para2')
        if len(missing_arguments) > 0:
            raise ValueError('Required argument(s) missing: {}'.format(missing_arguments))

注意

self.parser = self.create_option_parser()
(self.options, args) = self.parser.parse_args()

因此BaseClass 需要一些命令行参数

在我的 pycharm 配置中

Additional Arguments: --para1 val1 --para2 val2

但是当我运行测试时,我得到了

Testing started at 11:05 AM ...
/path/to/python "/Applications/PyCharm CE.app/Contents/helpers/pydev/pydevd.py" --multiproc --qt-support=auto --client 127.0.0.1 --port 51688 --file "/Applications/PyCharm CE.app/Contents/helpers/pycharm/_jb_unittest_runner.py" --path /path/to/project/tests/project_unit_tests.py -- --para1 val1 --para2 val2
pydev debugger: process 98200 is connecting

Connected to pydev debugger (build 181.5087.37)
Usage: python -m unittest discover [options]

python -m unittest discover: error: no such option: --para1
Launching unittests with arguments python -m unittest discover -s /path/to/project/test -p project_unit_tests.py -t /path/to/project/test --para1 val1 --para2 val2 in /path/to/project/test


Process finished with exit code 2
Empty test suite.

为什么我会得到这个 python -m unittest discover: error: no such option: --para1 ?

如何通过单元测试将命令行参数传递给我的对象?请注意,当我运行 main_project.py

def main():

    project_path = os.path.dirname(os.path.abspath(__file__))
    project = ClassA('adasdasd', self.project_path)

if __name__ == "__main__":
    sys.exit(main())

作为

python main_project.py --para1 val1 --para2 val2

这运行得很好。我也试过了

if __name__ == '__main__':
    if len(sys.argv) != 2:
        sys.exit("ERROR command-line parameter must be supplied for these tests")
    command_line_param = sys.argv[1]
    del sys.argv[1:]
    unittest.main()

作为我的TestProjectCreation 的一部分,但仍然出现同样的错误。

我错过了什么?

【问题讨论】:

    标签: python python-2.7 unit-testing pycharm command-line-arguments


    【解决方案1】:

    我提供这个答案有点晚了,但也许它会帮助其他看到这篇文章的人。

    您可以将单元测试中的每个测试用例视为运行测试目标的准备脚本。因为大多数单元测试框架应该在每个单独的测试用例开始时将系统重置回相同的状态,所以您可以在 setup 函数中将 sys.argv 设置为您希望测试的状态(大多数单元测试框架应该运行每个测试用例之间的设置函数)。

    话虽如此,如果此声明有例外情况,我想不起来了,因此,如果这不起作用,那么最好从确认您的单元测试框架如何开始using 在测试用例之间重置测试环境。

    考虑到这一点,创建设置函数看起来像这样似乎是明智的,至少对于您的情况:

    def setUp(self):
        import sys
        # first argument in argv is always the path and name of the script being
        # executed, in this case, it's your unit test script
        # followed by your various command args, in the order written into 
        # the terminal.
        sys.argv.extend(['--para1','val1','--para2','val2'])
        self.project_path = os.path.dirname(os.path.abspath(__file__))
        self.project = ClassA('adasdasd', self.project_path)
    

    对于我自己的测试,这很好用。但我不能说这种方法在更复杂的测试情况下的泛化效果如何,或者可能不会泛化。

    【讨论】:

      猜你喜欢
      • 2018-02-16
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 2016-08-19
      • 2015-12-10
      相关资源
      最近更新 更多