Подтвердить что ты не робот

Py.test пропускает тестовый класс, если конструктор определен

У меня есть следующий код unittest, запущенный через py.test. Простое присутствие конструктора делает весь класс пропускаемым при запуске py.test -v -s

собрано 0 предметов /1 пропущено

Может ли кто-нибудь объяснить мне такое поведение py.test?

Мне интересно понять поведение py.test, я знаю, что конструктор не нужен.

Спасибо, Зденек

class TestClassName(object):
    def __init__(self):
       pass

    def setup_method(self, method):
       print "setup_method called"

    def teardown_method(self, method):
       print "teardown_method called"

    def test_a(self):
       print "test_a called"
       assert 1 == 1

    def test_b(self):
       print "test_b called"
       assert 1 == 1
4b9b3361

Ответ 1

Как уже упоминалось в ответе Матти Лиры, py.test намеренно пропускает классы, у которых есть конструктор. Причина этого в том, что классы используются только по структурным причинам в py.test и не имеют какого-либо неотъемлемого поведения, тогда как при написании кода наоборот и гораздо реже не иметь метода .__init__() для класса. Таким образом, на практике пропуск класса с конструктором, скорее всего, будет желательным, обычно это просто класс, который имеет конфликтующее имя.

Наконец, py.test должен создать экземпляр класса для выполнения тестов. Если конструктор принимает любые аргументы, он не может его создать, поэтому повторное пропущение - это правильная вещь.

Ответ 2

В документации для py.test указано, что py.test реализует следующее стандартное обнаружение теста:

  • коллекция начинается с исходных аргументов командной строки, которые могут быть каталогами, именами файлов или идентификаторами тестов. переписывать в каталоги, если они не соответствуют norecursedirs
  • test _ *. py или * _test.py файлы, импортированные по их имени пакета.
  • Test префиксные тестовые классы (без метода __init__) [ < - отметить это здесь]
  • test_ префиксные тестовые функции или методы являются тестовыми элементами

Так что не то, что конструктор не нужен, py.test просто игнорирует классы, у которых есть конструктор. Существует также руководство для изменения стандартного обнаружения теста.