В моем программном обеспечении многие сервисы ожидают, что пользователь будет аутентифицирован перед выполнением.
В положительных сценариях у меня есть такой контекст:
Given I am authenticated
When I create meeting X
Then meeting X is well created
Я привык писать подобный симметричный сценарий для каждой из моих служб, связанных с требованием аутентификации пользователя:
Given I am not authenticated //note the 'not' word
When I create meeting X
Then meeting X is not created
And an authentication error should be thrown
Это заставляет разработчика выполнять проверку аутентификации пользователя в верхней части реализации службы, чтобы предотвратить прямой вызов API любым потенциальным «хакером» или вредоносным кодом (в этом примере «создание собрания») без аутентификации.
Это практика, которую я должен соблюдать?
Правильно ли я считаю этот «защитный» сценарий реальным бизнес-правилом, которое я могу обсудить с командой «Бизнес»?
Обратите внимание, что мои приемочные тесты не проверяются через часть графического интерфейса, а только непосредственно через часть вариантов использования (сервисы/бизнес-правила).
Краткий ответ: да, совершенно нормально учитывать отрицательные случаи.
Я привык смотреть на это несколько иначе. Обычно User Story — это один шаг вверх, например:
Как пользователь, я хотел бы иметь возможность добавлять встречи в календарь, чтобы я мог отслеживать свое расписание на день"
Тогда я бы использовал оба эти критерия приемлемости для этой истории.
Однако эта рекомендация больше относится к стилю. Мне это нравится, потому что так они лучше группируются, чтобы важные бизнес-кейсы не упускались из виду. То, что вы делаете, безусловно, не так уж плохо.
Это практика, которую я должен соблюдать?
Может быть. Отрицательные тестовые случаи, как и граничные условия, хороши для тестирования с точки зрения обеспечения качества. Однако с точки зрения разработки или управления продуктом стоит задаться вопросом, почему вам нужен такой узкий сценарий, а не более полная функция или схема сценария. А с точки зрения бизнеса низкоуровневые детали в приемочных тестах, как правило, являются анти-шаблоном.
Например, вместо того, чтобы использовать всевозможные нечетные точки входа в качестве отдельных вариантов использования, более комплексная функция может говорить:
Given that a user is not authenticated
When the user performs any action
Then the user is redirected to the login page.
Это лучше и яснее отражает реальный бизнес-кейс, хотя вам, вероятно, потребуется, чтобы отдельные шаги или план сценария тестировали все возможные точки входа и могли более эффективно сообщать об отдельных сбоях.
Преимущество этого типа историй в том, что они отражают бизнес-логику намного лучше, чем истории, ориентированные на реализацию. С другой стороны, сбой на одном из шагов гораздо менее коммуникативен и требует знания основных шагов, чтобы сузить круг конкретных сбоев.
Есть золотая середина: очертания Сенарио.
Основная проблема с выражением только бизнес-домена без определения некоторого контекста или целевых вариантов использования заключается в том, что вы не можете точно определить, где тестовая группа дает сбой. Вот где могут помочь наброски сценария Cucumber.
Например:
Scenario Outline: force authentication on all pages
Given an unauthenticated user
When the user connected to the <function> page
Then the user should be redirected to the login page.
Examples:
| function |
| meeting |
| calendar |
| profile |
| launch thermonuclear warheads |
С этим типом плана бизнес-цель ясна, и у вас также есть набор высокоуровневых тестов, которые могут пройти или не пройти независимо друг от друга. Отчеты верхнего уровня являются детализированными и целостными, при этом избегая своего рода «разрастания тестов», которое вы получили бы, добавляя негативные сценарии для каждого поведения.
Тестирование — это больше форма искусства, чем наука, поэтому ваш пробег может варьироваться. Однако гибкое тестирование должно функционировать как самодокументируемое поведение, а не низкоуровневая детализация, а критерии приемки должны быть больше сосредоточены на бизнес-логике или видимом пользователю поведении, чем на основных деталях реализации.
TL;DR: Да, вы можете оставить это так.
Длинный ответ
В зависимости от того, для чего вы используете сценарии или бизнес-правила , существует несколько способов их записи.
Первый случай: сценарий используется для критериев приемлемости
История
Как пользователь, я хочу создавать собрания, чтобы...
Критерии приемлемости
Первый случай: Сценарий используется для приемочных / регрессионных тестов , которые представляют собой фрагментированные инструкции по клику по приложению. Все эти тесты должны проходить после каждой истории (или хотя бы перед каждым релизом).
Неполный пример:
счастливый путь
без аутентификации
Примечание
Я бы рекомендовал пользователю проводить регрессионные тесты через графический интерфейс. Если они хорошо написаны, их можно реализовать в коде и запускать автоматически.
Как писали другие, учет отрицательных случаев — это хорошо. Однако структура вашего отрицательного падежа таковой не является, поскольку содержит внутреннее противоречие.
Проблема в том, что вы описываете результаты так, как если бы они были действиями пользователя. Но на самом деле это действия, предпринимаемые программным обеспечением в ответ на действия пользователя. Сбои вызывают действия пользователя, но ожидаемый результат никогда не происходит, потому что сбой не позволяет ему произойти на самом деле, поэтому история, основанная на событии, никогда не будет удовлетворена.
Плохой:
Учитывая, что я аутентифицирован
Когда я создаю встречу X
Лучше:
Учитывая, что я аутентифицирован
Когда я отправляю запрос на создание встречи
Это все еще работает на уровне серверной части, оно не относится к конкретным элементам пользовательского интерфейса, таким как меню или кнопки, и охватывает сетевую активность, не созданную утвержденным внешним интерфейсом (покрывая проблему «взлома»).
Тодд А. Джейкобс
Тодд А. Джейкобс