Pycharm: не могу запустить модульные тесты с аргументами командной строки - PullRequest
0 голосов
/ 17 октября 2018

вот мой тестовый класс

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

enter image description here

но когда я запускаю тест, я получаю

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, но все равно получил ту же ошибку.

Чего мне не хватает?

1 Ответ

0 голосов
/ 22 мая 2019

Я немного опоздал с предложением этого ответа, но, возможно, он поможет другим, кто сталкивается с этим сообщением.

Вы можете рассматривать каждый тестовый пример в модульном тесте как сценарий подготовки к запускуцель теста.Поскольку большинство платформ модульных тестов должны сбрасывать систему обратно в одно и то же состояние в начале каждого отдельного тестового случая, вы можете установить 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)

Для моих собственных тестов это работает отлично.Но я не могу сказать, насколько хорошо этот подход может или не может быть обобщен для более сложных тестовых ситуаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...