在场景Specflow之间共享数据

时间:2016-05-11 13:29:11

标签: specflow

我目前在一个功能文件中有大约15个场景,并希望在它们之间共享数据。我认为上下文注入可以工作,并且它在单个场景中的步骤之间工作,但我无法将数据从一个场景传递到另一个场景。其他人如何实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以在另一个类static IDictionary<String, Object> globalData中创建变量Global.cs

现在,在方案1中:保存任何对象

Globle.globalData.Set("Key", Object);

在场景2中:通过其键检索对象并将其转换为先前的类型

var dataFromScen1 = Global.globalData.Get("Key");

通过这种方式,您可以将场景1中的数据用于场景2,但在并行执行过程中会遇到问题

答案 1 :(得分:0)

简短回答:

没有人这样做,因为它是一个坏主意™

答案很长:

如果您的数据对整个功能有效,请将其放在功能上下文中。但是这些数据不能在一个场景中修改,而在另一个场景中访问。

测试将按照测试运行员确定的顺序执行。不同的跑步者可以选择不同的订单。执行顺序可以从跑步者的一个版本更改为下一个版本。测试之间的时间耦合或隐式依赖性也会导致其他问题,例如,如果我想自己运行测试会发生什么?现在它将失败,因为之前的测试尚未首先运行。如果我想并行运行测试怎么办?现在我不能因为测试具有需要首先运行的依赖项。

那我该怎么办?

我的建议是使用后台步骤(或您的配置中的明确步骤)来设置您的个人场景所需的数据。 Specflow重复使用这些步骤,或让这些步骤重用其他步骤,相当简单。因此,如果您需要客户和产品来创建订单,并且您有以下情况:

Scenario: Creating a customer
Given a create a new customer called 'bob'
When I query for customers called 'bob'
Then I should get back a customer

Scenario: Creating a product
Given a create a new product called 'foo'
And 'foo' has a price of £100
When I query for products called 'foo'
Then I should get back a product
And the price should be £100

Scenario: customer places an order
Given I have a customer called 'bob'
And I have a product called 'foo' with a price £100
When 'bob' places an order for a 'foo'
Then an order for 1 'foo' should be created

这里最后一个场景创建了它需要的所有数据。它可以重复使用与Given相同的步骤(具有不同的Given a create a new customer called 'bob'属性),并且可以使用新步骤And I have a product called 'foo' with a price £100来调用现有的两个步骤Given a create a new product called 'foo' And 'foo' has a price of £100

这可以确保测试是隔离的,并且没有任何依赖关系。