Правильно ли включать в тест зависимый тест?

Рейтинг: 2Ответов: 2Опубликовано: 11.03.2023

Например, хочу протестировать добавление и удаление элемента из списка.

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?

Ответы

▲ 0Принят

Все аргументы говорят - нет, не нужно.

Из общих соображений, стоит помнить что это юнит-тесты. Т.е. тестирование единиц функционала. Разумно исходить из общего предположения, что все остальное работает корректно (конструктор объекта, передача аргументов, семантика языка, компилятор, ОС, память, ЦП, электроны, и т.п.). Вы тестируете конкретные вещи:
Есть тест на добавление - он тестирует добавление.
Есть тест на удаление - он тестирует удаление.

Было бы странно в каждом из тестов тестировать ВСЁ нижележащие. В то же время, желательно, чтобы у вас были покрыты тестами все составные части - если добавление сломано, то соседний тест это покажет. Итоговая цель - прохождение 100% тестов, а не "95% сойдет" )

Ещё, кстати, вспомните и о принципе DRY - дублирование штука нехорошая, и о SRP - тестирование удаления должно отвечать за тестирование удаления.

Еще один момент - тестированию удаления не должно быть дела до того как элементы попадают в список (добавлением ли, десериализацией ли, методом ГСЧ списка, итд).

▲ 0

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