Правильно ли включать в тест зависимый тест?
Например, хочу протестировать добавление и удаление элемента из списка.
import unittest
class ListTest(unittest.TestCase):
def setUp():
self.l = list()
def test_add():
self.l.add(42)
self.assertEqual(l[0] == 42)
def test_del():
self.l.add(42)
self.assertEqual(l[0] == 42) # Допустим ли этот тест?
del l[0]
self.assertEqual(len(l) == 0)
Допустимо ли добавлять указанный ассерт или он уже есть в test_add? С другой стороны, добавление должно быть и если оно неправильно работает, то удаление нет смысла тестировать дальше. Если в будущем тест добавления удалится, то всё продолжит работать с этим ассертом. Может в таком случае лучше использовать expect а не assert?
Ответы (2 шт):
Все аргументы говорят - нет, не нужно.
Из общих соображений, стоит помнить что это юнит-тесты. Т.е. тестирование единиц функционала. Разумно исходить из общего предположения, что все остальное работает корректно (конструктор объекта, передача аргументов, семантика языка, компилятор, ОС, память, ЦП, электроны, и т.п.). Вы тестируете конкретные вещи:
Есть тест на добавление - он тестирует добавление.
Есть тест на удаление - он тестирует удаление.
Было бы странно в каждом из тестов тестировать ВСЁ нижележащие. В то же время, желательно, чтобы у вас были покрыты тестами все составные части - если добавление сломано, то соседний тест это покажет. Итоговая цель - прохождение 100% тестов, а не "95% сойдет" )
Ещё, кстати, вспомните и о принципе DRY - дублирование штука нехорошая, и о SRP - тестирование удаления должно отвечать за тестирование удаления.
Еще один момент - тестированию удаления не должно быть дела до того как элементы попадают в список (добавлением ли, десериализацией ли, методом ГСЧ списка, итд).
В тесте удаления вообще не нужно использовать другие функции, а нужно использовать уже готовый список или что там у вас за тип данных.