Тесты не гарантируют правильность вашей программы

Перевод статьи Итамара Тернера-Трауринга «Tests won’t make your software correct».

Автоматизированные тесты не обеспечивают правильность программы

Автоматизированные тесты чрезвычайно полезны. Когда вы начнете их писать и сможете оценить их значимость, сама идея написания программы без них станет для вас просто невообразимой.

Но, как и в случае с любыми другими технологиями, следует понимать пределы возможностей тестов. Когда речь заходит об автоматизированном тестировании – модульных и сквозных тестах, BDD («разработка через поведение»), – есть соблазн прийти к выводу, что если тесты успешно пройдены, то программа верна.

Но тесты не могут сказать и не говорят о том, что программа в принципе правильна. Давайте рассмотрим, почему.

Как пишутся правильные программы

Чтобы реализовать какой-то функционал или исправление бага, вы проходите через множество этапов. Они могут быть урезаны, но они всегда необходимы:

  1. Идентификация. Определение того, в чем заключается проблема, которую вы пытаетесь решить.
  2. Решение. Выдвижение идеи решения.
  3. Спецификация. Определение спецификаций, деталей того, как решение должно быть реализовано.
  4. Реализация. Воплощение спецификаций в коде.

Ваша программа может в конечном итоге быть неверной по любой из следующих причин:

  1. Вы могли неправильно определить проблему.
  2. Могло быть выбрано неправильное решение.
  3. Вы могли создать спецификации, не соответствующие решению.
  4. Ваш код может не соответствовать спецификациям.

Только человек может определить правильность программы

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

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

[code]def test_addition():
assert add(2, 2) == 5[/code]

С точки зрения кода – а это точка зрения автоматизации без понимания – правильный ответ «4» приведет к провалу теста. Но вы, человек, можете легко обнаружить ошибку даже просто просматривая код. Поэтому именно человек имеет ключевое значение.

Только человек способен определять правильность.

В тестах главное это процесс

Значение тестирования: процесс

Хотя прохождение тестов не доказывает правильность программы, сам процесс их написания и прохождения может способствовать этой самой правильности. Такой эффект достигается благодаря тому, что написание тестов требует человеческого суждения. Что должен проверять этот тест? Соответствие спецификациям или то, решает ли программа нашу проблему?

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

Вы пишете тест (например, указанный выше), затем перечитываете его, затем говорите: «Погодите-ка, это ж неправильно, 2+2=4». Вы вносите исправления, затем, возможно, добавляете к вашим захардкоженным тестам какие-то дополнительные тесты на основе базовых принципов арифметики. Правильность рождается в процессе, она не проистекает из результатов процесса.

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

Ценность тестирования: стабильность

Тесты обеспечивают стабильность

Но если на правильность программы влияет написание тестов, а не сами тесты, то зачем мы продолжаем с ними возиться?

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

(А также стабильность имеет свою цену, например, если вы сделаете стабильным неправильный уровень абстракции).

Тесты полезны, но недостаточны

Подведем итоги:

  1. Пишите автоматизированные тесты.
  2. Запускайте их.
  3. Не путайте успешное прохождение тестов с правильностью. Для ее достижения вам скорее всего понадобятся и другие процедуры и подходы.


[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Прокрутить вверх