Вступление

Модульное тестирование - важная часть «разработки через тестирование (TDD)». Он используется для проверки правильности модуля, функции или класса.

Начнем с вопроса: как проверить, работает ли функция правильно или нет?

Метод прост:

  • Разработайте несколько разных входов для функции и ожидаемых результатов.
  • Запустите функцию, используя входные данные, и проверьте, вернет ли она ожидаемые результаты.

Например, мы написали функцию abs(), которая используется для нахождения абсолютного значения числа, а затем мы можем разработать некоторые входные и выходные данные как тестовые примеры:

  • Введите положительное число, например 99, 3.14, и ожидайте, что возвращаемое значение будет таким же, как введенное: 99, 3.14.
  • Введите отрицательное число, например -10, -6.28, и ожидайте, что возвращаемое значение будет противоположным входному: 10, 6.28
  • Введите 0, ожидайте возврата 0.

Если функция проходит все тестовые примеры, она работает, как ожидалось, и ошибок не обнаружено. Если нет, то надо начинать отладку.

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

Есть ли методы получше?

Определенно! Python, как элегантный язык программирования, никогда не подводит разработчиков.

Встроенный модуль Python unittest дает нам возможность просто написать тестовые примеры один раз и запускать их снова и снова.

Как написать модульный тест?

Давайте возьмем простую функцию abs(), упомянутую выше, в качестве примера, чтобы увидеть, как написать модульный тест с помощью мощного модуля unittest. Функция abs() выглядит следующим образом:

Затем мы пишем скрипт модульного теста:

Наконец, мы запускаем тестовый скрипт и получаем следующий результат:

Отлично, наша abs() функция прошла тесты! 👌

Подробнее о классе модульного теста

Как показано в приведенном выше примере, при написании модульных тестов нам нужно написать тестовый класс, который наследуется от класса unittest.TestCase. В этом тестовом классе методы, которые начинаются с test_, являются тестовыми методами. Методы, которые не начинаются с test_, не считаются методами тестирования Python и не будут выполняться во время тестирования.

В нашем сценарии нам нужны три типа тестов, поэтому есть три разных test_xxx() метода. Распределять тестовые примеры по категориям - это хорошая привычка, чтобы сохранять ясность ума, особенно когда тестовых примеров много.

Поскольку unittest.TestCase предоставляет множество встроенных методов оценки, нам нужно только вызвать их, чтобы проверить, соответствуют ли результаты ожидаемым. Чаще всего используется утверждение assertEqual(). Другие:

Небольшой, но полезный совет

Есть подсказка, основанная на моем опыте.

Как известно, скрипт модульного теста можно запустить напрямую:

$ python unittest_abs.py

Это потому, что в unittest_abs.py есть следующий код:

if __name__ == '__main__':
    unittest.main()

Другой способ запустить наш скрипт модульного тестирования без написания приведенного выше кода:

$ python -m unittest unittest_abs.py
.....
----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

Это рекомендуемый стиль, потому что он позволяет нам запускать множество модульных тестов одновременно, и многие другие инструменты могут автоматически запускать эти модульные тесты.

Заключение

Тестирование - большая тема и важный шаг в разработке программного обеспечения. Модульный тест - это один из методов тестирования, с помощью которого отдельная единица программы, такая как функция, класс или модуль, помещается в различные тестовые примеры, чтобы определить, работают ли они должным образом. Это помогает нам писать надежный код.

Спасибо за внимание. Следуйте за мной и получите больше руководств по Python здесь: