簡體   English   中英

Pycharm:無法使用命令行參數運行單元測試

[英]Pycharm : Cant run unit tests with command line arguments

這是我的測試課

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一部分,但仍然出現相同的錯誤。

我錯過了什么?

我提供這個答案有點晚了,但也許它會幫助遇到這篇文章的其他人。

您可以將單元測試中的每個測試用例視為運行測試目標的准備腳本。 因為大多數單元測試框架應該在每個單獨的測試用例開始時將系統重置回相同的狀態,所以您可以在 setup 函數中將 sys.argv 設置為您希望測試的狀態(大多數單元測試框架應該運行每個測試用例之間的設置函數)。

話雖如此,如果這個聲明有例外,我無法回憶起我的頭頂,所以如果這不起作用,一個好的開始是確認你正在使用的單元測試框架如何重置測試用例之間的測試環境。

考慮到這一點,至少對於您的情況,創建設置函數看起來像這樣似乎是明智的:

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)

對於我自己的測試,這很好用。 但是我不能說這種方法可能有多好,或者可能無法推廣到更復雜的測試情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM