Могу ли я перехватить аргументы командной строки для pytest? - PullRequest
1 голос
/ 21 января 2020

Мне очень нравится pytest и особенно его способность просто запускать unittest тесты просто отлично. Тем не менее, у меня есть некоторые хаки, связанные с юнит-тестами, которые я не знаю, как воспроизвести с помощью pytest, поэтому я пока не могу написать полные тесты только для pytest.

Лучше всего показывать, а не объяснять.

import unittest

import sys

def active():
    print("active")

def f_default():
    print("inactive")


class Test(unittest.TestCase):

    def test_it(self):
        print("passed")


if __name__ == '__main__':

    flag = "--systrace"

    if flag in sys.argv:
        f_default = active
        sys.argv.remove(flag)

    f_default()
    unittest.main()

Обычно, если передать в командной строке --systrace, я перехватываю его, переворачиваю в тестовом скрипте какое-то состояние, которое необязательно передается тестам юнитов, а затем удаляю его из sys.argv. unittest не имеет смысла.

с переключателем:

python test_unittest_commandline.py --systrace
active
passed
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

OK

без переключателя:

$ python test_unittest_commandline.py
inactive
passed
.
----------------------------------------------------------------------
Ran 1 test in 0.000s

pytest не впечатлен

Это следовало ожидать, так как я не на __main__, поэтому я никогда не убираю неожиданный аргумент. Есть ли ловушка pytest, которую я могу использовать, чтобы вычистить sys.argv и отметить значение аргумента? Опять же, я не хочу параметризировать тесты или сам pytest. Мне никогда не повезло с nose в качестве тестового бегуна, но это не вносит собственных улучшений в тесты юнитов.

pytest test_unittest_commandline.py --systrace
ERROR: usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --systrace
  inifile: None
  rootdir: /explore
...