Для теста зачастую необходимо, чтобы для его запуска система находилась в определенном состоянии. Хотя можно теоретически рассмотреть приведение системы в данное состояние как часть исполнения теста, чаще гораздо более разумно сделать, чтобы определенные предусловия были реализованы перед запуском теста. Это необходимо для многих тестов, которые проверяют не математические чистые функции.
Примеры предусловий:
1. Система запущена.
2. В базе данных содержится запись о пользователе Joe с паролем EXAMPLE.
3. Для флага SORT_ASCEND установлено значение true.
4. В корзине покупателя уже находятся три товара.
Давайте рассмотрим последний пример и поймем, почему лучше иметь выполненное предусловие, чем включать его в шаги теста. Мы хотим протестировать, что добавление товара в корзину, в которой уже находятся три товара, приведет к отображению информации о четырех товарах в корзине. Читая описание этого теста, вы можете понять, что добавление первых трех товаров не упоминается. С точки зрения этого теста шаги по добавлению этих товаров не относятся к делу; всё, что важно, — это то, что в начале теста три товара находятся в корзине.
С прагматической точки зрения способность устанавливать предусловия добавляет гибкость и краткость тестам. Предположим, что вместо размещения предусловия о наличии в корзине трех товаров, мы включим в тест следующие шаги:
1. Найти товар "1XB".
2. Выбрать товар "1XB".
3. Нажать кнопку Добавить в корзину три раза.
Это может сработать, когда вы запускаете тест в первый раз. Но этот тест оказывается очень хрупким — существует множество способов разрушить его, если система вдруг меняется. Что, если товар "1XB" больше не существует? Что, если у функции поиска имеется дефект и предметы, название которых начинается с "1", не могут быть найдены? Что, если кнопка Добавить в корзину поменяла название?
Также существует недостаток с точки зрения краткости. Мы только что добавили три шага в тест, где всего одно предусловие. Краткость, помимо того, что она сестра таланта, очень полезна в гарантировании того, что фокусирование будет идти на важных частях теста. Шаблонный тест — враг внимания и фокусирования
Разделительная линия между предусловиями и шагами выполнения иногда может оказаться скорее искусством, чем наукой. Вообще, чем более критична с точки зрения безопасности наша рабочая область, тем более точными будут предусловия. Например, допустим, вы тестируете хостинг изображений, где все изображения являются общедоступными и видимыми для всех пользователей. Тест-кейс включает в себя проверку, что определенное изображение показывается на экране, когда пользователь открывает соответствующий URL. Для этого теста могут быть достаточны следующие предусловия:
1. Пользователь залогинился.
2. Изображение было загружено по URL /pictures/foo.
Однако если мы тестируем банковское ПО и используем изображение для предупреждения о неправильной транзакции, то здесь, вероятно, будет больше предусловий, а те, что уже имеются, будут более точными:
1. Пользователь X залогинился с паролем Y.
2. У пользователя X в аккаунте нет предупреждений или сообщений о необходимости проверки.
3. Сберегательный счет пользователя X содержит $0,00.
4. Расчетный счет пользователя X содержит $50,00.
5. У пользователя X нет других счетов в банке, кроме сберегательного и расчетного.
6. Пользователь X попытался снять $50,01 с расчетного счета.
В обоих случаях шаги исполнения будут одинаковыми или, по крайней мере, очень похожими — перейти по URL-адресу и проверить, что отображается определенное изображение. Однако состояние системы может быть значительно более детализированно в случае использования банковского программного обеспечения. И не только из-за того, что такая система гораздо более сложная, но и из-за того, что последствия ошибки для банка окажутся более значительными, чем для хостинга изображений. В этом случае имеет смысл точно определить, что должно происходить и что должно быть создано перед шагами выполнения. Чем более точно вы опишете предусловия, тем легче будет воспроизвести определенную ситуацию, и, как мы говорили, воспроизводимость является ключом к разрешению проблемы.