Данный урок открывает череду обучающих материалов на тему "Тестирование в Python". В данном мини-курсе будет рассказано об основных инструментах применяющиеся для тестирования.
Этот урок имеет вводный характер и знакомит с общей информацией о тестировании и простой конструкцией, которая позволяет значительно улучшить Python-код.
Тестирование программного обеспечения (Software Testing) - проверка соответствия между реальным и ожидаемым поведением программы, осуществляемая при конечном наборе тестов, выбранном определенным образом. [IEEE Guide to Software Engineering Body of Knowledge, SWEBOK, 2004].
В более широком смысле, тестирование - это одна из техник контроля качества, включающая в себя действия по планированию работ (Test Management), проектированию тестов (Test Design), выполнению тестирования (Test Execution) и анализу полученных результатов (Test Analysis).
Для разработчика же интересней следующее определение:
Тестирование — это проверка соответствия программы требованиям, осуществляемая путём наблюдения за её работой в специальных, искусственно созданных ситуациях, выбранных определённым образом.
Хочется обратить внимание на слова “искусственно созданных ситуациях, выбранных определённым образом”. Это означает, что не имеет смысла тестировать вообще все ситуации, стоит выбирать критически важные места и сценарии.
Тестирование для разработчика состоит из написания тестов. Тест – это такой же программный код, который пишется аналогично коду для реализации бизнес-логики. Тесты проверяют сценарии работы программы (test-case).
Тест-кейсы встречаются самые различные, один от другого может резко отличаться. По желанию можно тестировать ВСЕ возможные и невозможные ситуации. Однако стоит соблюдать адекватность и покрывать код тестами ровно настолько, насколько требуется для уверенного понимания, что бизнес-логика работает как задумано.
Например, функция, которая возвращает числовое значение от 0 до 100. В тестах стоит проверить не только правильность значений из этого диапазона, но и то, что других значений не возникает.
Негласное правило – если на участке кода проявилась ошибка, то стоит написать тест на этот случай.
Тестирование смело делится на несколько уровней глубины. Наиболее показательная классификация по уровням тестирования в данном случае такая:
Когда говорят "тестирование", не выделяя конкретный тип, то говорят скорее всего о модульном тестировании.
Пойдем с низу вверх (от 3 к 1)
Модульное тестирование, или юнит-тестирование (англ. unit testing) — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже протестированных местах программы и облегчает обнаружение и устранение таких ошибок.
В Python для модульного тестирования применяют
Об этих инструментах будет описано в следующих статьях.
Интеграцио́нное тестирование или функциональное тестирование предназначено для проверки связи между компонентами, а также взаимодействия с различными частями системы (операционной системой, оборудованием либо связи между различными системами).
Для автоматизации интеграционного тестирования применяются системы непрерывной интеграции (Continuous Integration System, CIS). Принцип действия таких систем состоит в следующем:
Примеры инструментов:
Основной задачей системного тестирования является проверка как функциональных, так и не функциональных требований в системе в целом. При этом выявляются дефекты:
Для минимизации рисков, связанных с особенностями поведения в системы в той или иной среде, во время тестирования рекомендуется использовать окружение максимально приближенное к тому, на которое будет установлен продукт после выдачи.
Стоит выделить два подхода к системному тестированию:
По конкретному случаю использования можно определить один или более сценариев. На проверку каждого сценария пишутся тест кейсы (test cases), которые реализуются в виде тестов.
Для описания сценариев можно использовать BDD (behavior-driven development)
Так как этот урок почти полностью состоит из теории, то разбавлю конструкцией языка, которая помогает писать код и тесты более высокого качества.
Python – язык с динамической типизацией. Это значит, что при написании Python-кода мы явно не указываем тип данных, а во время исполнения не гарантируется явный тип переменной.
В следствии этого возникают сложности. Например, в функции ожидаем целое число, а нам передали list. Это может привести к самым неожиданным ошибками. Чтобы попытаться обойти эту проблему стоит воспользоваться assert.
Assert — это специальная конструкция, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы.
Assert'ы позволяют отлавливать ошибки в программах на этапе компиляции либо во время исполнения.
Использование конструкции весьма простое:
# -*- encoding: utf-8 -*-
def simple_func(value):
assert type(value) == int
assert value > 0
return value*value
Assert вызывает ошибку, если аргумент равен False. Например так:
>>> print(simple_func(2))
4
>>> print(simple_func(set()))
Traceback (most recent call last):
File "/tmp/testing/app.py", line 11, in <module>
print(simple_func(set()))
File "/tmp/testing/app.py", line 4, in simple_func
assert type(value) == int
AssertionError
>>>
>>> print(simple_func(-1))
Traceback (most recent call last):
File "/tmp/testing/app.py", line 21, in <module>
print(simple_func(-1))
File "/tmp/testing/app.py", line 5, in simple_func
assert value > 0
AssertionError
Traceback показывает строчку, с которой полетело исключение AssertionError, что порой открывает много нового в понимании, как же в реальности работает написанный код.
В уроке были кратко описаны виды тестирования: модульное или юнит-тестирование, интеграционное, системное. Для каждого озвучен список инструментов для создания тестов.
В качестве практики описана конструкция assert, позволяющая проверять предположения о значениях произвольных данных в произвольном месте программы.
Вам ответят команда поддержки Хекслета или другие студенты.
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Наши выпускники работают в компаниях:
Зарегистрируйтесь или войдите в свой аккаунт