1

我想按照以下方式编写验收测试

given the first test has run
when I do this new test
then this new test passes

这是因为第一次测试将使数据处于有效状态以执行下一次测试

我可以在 Specflow 中执行此操作吗?

4

2 回答 2

2

正如Sam所说,您可以使用 SpecFlow 执行此操作,但是我会质疑这对您的测试是否有好处。

如果您查看 Sam 到specflow wiki的链接,您可以看到他们的示例由Given多个Givens 组成。这对我来说是有道理的,因为Given这是让测试进入一个非常特定的状态,以便可以针对它运行断言。它也没有副作用,因为理论上Givens 不会失败。

但是,当我们编写Givenfrom Whens 时,这会引入测试处于错误状态的可能性,然后我们才能断言一切都是正确的。我承认,如果你只是简单地Given用另一个的步骤组成一个,Scenario这会得到缓解,因为原来的Scenario会失败,因此你可以先解决这个问题,但你仍然必须找到那个失败的测试。想象一下,您在几年内构建了您的测试,并最终以这种方式编写了数千个测试。对基本场景进行了一项简单的重大更改,导致数千次测试失败,这使得找到真正的问题所在变得更加困难。

于 2014-07-24T15:03:40.343 回答
1

是的,您可以在 specflow 中执行此操作,但需要注意一点。这种方法不会运行一个场景,然后运行另一个,它将自己运行第一个场景,然后依赖的场景将再次运行第一个场景,然后是第二个场景。这些顺序可能不是确定性的。@ignore一旦编写了依赖场景,我们就通过第一个场景避免了这个问题。由于无论如何第二个场景总是运行第一个场景,它的 d 并不重要@ignore,因为第一个场景中的任何失败都会触发第二个场景中的失败。

我们为实现这一目标所做的工作如下:

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");
}

您需要确保包含步骤定义的类派生自Stepsspecflow 中的基类,以访问Given,WhenThen方法:

[Binding]
public class MyStepClass: Steps

您可以在specflow wiki上找到更多信息

于 2014-07-24T08:28:30.033 回答