Основы юнит-тестирования

Основы юнит-тестирования

Limera1n

В разработке программного обеспечения существует такое понятие, как юнит-тестирование. Юнит-тестирование - это практика, которая призвана предотвращать ошибки, нежели исправлять их после того, как они возникли. Смысл ее заключается в том, что у нас есть так называемый production code, то есть код, который решает какие то задачи, и к этому коду мы пишем автоматизированные тесты, которые исполняются и эти тесты вызывают наш production code, и проверяют, какие результаты он выдает, если он выдает правильные результаты - значит наш код работает правильно, если выдает неправильные результаты, значит работает неправильно. Преимущество этого подхода состоит в том, что мы модем обнаруживать ошибки до того, как они всплывут при эксплуатации.

Давайте напишем простой пример:

В этот раз я воспользовался программой NotePad++.

Предположим, что у нас есть функция get_reply, которая реализует FizzBuzz, это тоже популярная программа типа Hello World!. Смысл ее в том, что на вход функции подаются числа, в случае, если число делится на 5 без остатка , то выводится Buzz, если делится без остатка на 3, то выводится Fizz, а если делится и на 3 и на 5 без остатка, то выводится FizzBuzz. В остальных случаях возвращается просто пустая строка.

unit-test

Вот у нас есть программа и мы хотим протестировать ее, действительно ли все здесь правильно. Для этого можем написать unit-test создав новый файл. Для того, чтобы написать юнит-тесты нам нужно импортировать библиотеку, которая называется unittest, так же импортировать саму библиотеку, которую будем тестировать (я сохранил программу под именем Fizz_Buzz), и для того, чтобы написать юнит-тест нужно создать class class поговорим в следующей статье), он должен наследовать от типа TestCase, который лежит в модуле unittest. Затем определяем тестировочные случаи, методы, которые будут исполняться тест-ранером, то есть исполнителем тестов, и в этих методах мы должны проверить поведение нашей программы. Мы объявляем функцию и внутри нее тестируем нашу программу. assertEqual - специальный метод, который проверяет, действительно ли результат полученный от вызова тестируемой функции совпадает с тем, что мы ожидаем, вторым аргументом мы передаем в нее то, что мы ожидаем передавая 6 в качестве аргумента. Если вернется не Fizz, а что-то другое, то тест будет провален и мы это увидим. Так же с другими случаями Buzz и FizzBuzz. В конце проверка, запущен ли этот скрипт напрямую, если да, то нам нужно запустить функцию __main__ (об этом чуть позже), а уже она будет по порядку будет прогонять эти функции. Сохраняем и запускаемся.

Запускать мы будем через Anaconda Promt:

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

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

Вот так происходит юнит-тестирование.


Отдельно будет посвящен пост о class и о __main__, но это чуть позже, сейчас я лишь показал, как это работает.


Report Page