Допустимо ли иметь функции specflow в зависимости от других функций?
Я хочу написать приемочный тест в соответствии с
given the first test has run
when I do this new test
then this new test passes
Это связано с тем, что первый тест оставит данные в допустимом состоянии для выполнения следующего теста.
Могу ли я сделать это в Specflow?
2 ответа
Да, вы можете сделать это в specflow, но с небольшой оговоркой. этот подход не будет запускать один сценарий, а затем запускать другой, он будет запускать первый сценарий самостоятельно, затем зависимый сценарий снова будет запускать первый сценарий, а затем второй сценарий. Их порядок не может быть детерминированным. Мы избежали этой проблемы путем @ignore
первый сценарий после написания зависимого сценария. Поскольку второй сценарий всегда запускает первый сценарий в любом случае, не имеет значения, что его @ignore
d, поскольку любой сбой в первом сценарии вызовет сбой во втором сценарии.
То, что мы сделали для достижения этой цели, таково:
Scenario: Some base scenario
Given some condition
When some action
Then some result
потом в другой функции:
Scenario: Some dependant scenario
Given some base scenario has happened
And some other condition
When some other action
Then some other result
Ключ находится в определении шага Given some base scenario has happened
если вы определите этот шаг следующим образом:
[Given("some base scenario has happened")]
public void SomeBaseScenarioHasHappened()
{
Given("some condition");
When("some action");
Then("some result");
}
вам нужно убедиться, что ваш класс, содержащий ваши определения шагов, является производным от базы Steps
класс в specflow, чтобы получить доступ к Given
, When
а также Then
методы:
[Binding]
public class MyStepClass: Steps
Вы можете найти больше информации об этом в вики specflow
Как говорит Sam Holder, вы можете сделать это с SpecFlow, однако я бы усомнился, хорошо ли это для ваших тестов.
Если вы посмотрите на ссылку Сэма на вики specflow, то увидите, что их пример составляет Given
из нескольких Given
s. Это имеет смысл для меня, так как Given
переводит тест в очень конкретное состояние, чтобы против него могли работать утверждения. Он также не имеет побочных эффектов, как в теории Given
s не может потерпеть неудачу.
Однако, когда мы приходим, чтобы составить Given
от When
s это вводит возможность того, что тест будет в неправильном состоянии, прежде чем мы сможем тогда утверждать, что все правильно. Я признаю, что если вы просто пишете Given
с шагами другого Scenario
это смягчено как оригинал Scenario
потерпит неудачу, и поэтому вы можете сначала решить эту проблему, но вам все равно придется найти этот провальный тест. Представьте, что вы строите свои тесты в течение нескольких лет, и в итоге получается несколько тысяч составленных таким образом. Одно простое серьезное изменение базового сценария и тысячи тестов не пройдены, что значительно затрудняет поиск реальной проблемы.