具有取决于其他功能的specflow功能是否有效?

时间:2014-07-24 08:06:51

标签: winforms specflow user-acceptance-testing

我想按照

的方式写一份验收测试
given the first test has run
when I do this new test
then this new test passes

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

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

2 个答案:

答案 0 :(得分:2)

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

如果您查看Sam对specflow wiki的链接,您可以看到他们的示例是来自多个Given的{​​{1}}。这对我来说很有意义,因为Given正在将测试带入一个非常特定的状态,以便断言可以针对它运行。它也没有副作用,因为理论上Given不能失败。

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

答案 1 :(得分:1)

是的,你可以在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");
}

您需要确保包含您的步骤定义的类派生自specflow中的基础Steps类,以便访问GivenWhenThen方法:

[Binding]
public class MyStepClass: Steps

您可以在specflow wiki

上找到有关此内容的更多信息