Как узнать, является ли текущий тест последним?

Как я могу узнать из текущего теста, был ли он последним? (Python unittest/носовые тесты)

В самом конце тестового прогона мне нужно разобрать какой-то конкретный прибор, и было бы намного проще, если бы на основе тестирования за тестом я мог просто определить:

if last_test:
   hard_fixture_teardown()
else:
   soft_fixture_teardown()

У меня есть разрыв пакета, который будет работать отлично, но кажется очень грязной передача информации о приспособлении обратно в файл __init__.teardown_package().


person Jele    schedule 15.12.2015    source источник


Ответы (2)


Вы можете использовать комбинацию TestCase.tearDown() и TestCase.tearDownClass() для достижения этой цели. tearDown() вызывается для каждого тестового метода, а tearDownClass() вызывается после выполнения всех тестов в классе.

person Eugene Yarmash    schedule 15.12.2015
comment
Спасибо, но что, если вы хотите запустить «жесткий разбор» только в конце всего цикла, который может включать множество тестовых классов? - person Jele; 15.12.2015
comment
@Jele: как вы можете догадаться, есть также tearDownModule. - person Eugene Yarmash; 15.12.2015
comment
Евгений, здравствуйте. Я пробовал это раньше и, похоже, не мог заставить его работать. Куда бы это лучше всего поставить? У меня есть существующий модуль установки/снятия, который работает выше в структуре, что было бы отличным местом для «жесткого срыва», но он передает ему соответствующую информацию о приспособлениях, что кажется неправильным/грязным. Есть идеи? - person Jele; 15.12.2015
comment
@Jele: Вы помещаете это на уровень модуля. Однако похоже, что вам нужно реорганизовать свои тесты, чтобы модули были независимы друг от друга. - person Eugene Yarmash; 15.12.2015

Как указано здесь, модульный тест не предназначен для порядка, юнит-тесты в зависимости от ордера либо не продуманы, либо просто должны быть объединены в монолитный. (объединение отдельных функций в одном тесте является принятым ответом)

[править после комментария]

Если порядок не важен, вы можете сделать это (довольно грязно, imo, мы все еще навязываем границы того, как следует использовать модульные тесты)

в каждом тестовом пакете, который вы помещаете:

def tearDownModule():
    xxx = int(os.getenv('XXX', '0')) + 1
    if xxx == NUMBER_OF_TEST_PACKAGES:
        print "hard tear down"
    else:
        print "not yet"
        os.environ['XXX'] = str(xxx)

с NUMBER_OF_TEST_PACKAGES, импортированными из какого-то глобального источника.

также, если порядок не важен, я полагаю, что при использовании прибор только читается, а не изменяется, если это так, вы можете настроить это как метод класса

@classmethod
def setUpClass(cls):
    print "I'll take a lot of time here"
person simone cittadini    schedule 15.12.2015
comment
Порядок тестов в данном случае не имеет значения, он больше сокращает время на создание длительного фикстура и делает необходимую очистку в самом прогоне теста, а не между каждым отдельным тестом. - person Jele; 15.12.2015