我想使用spec flow测试服务接口。
该服务旨在运行测试以测试其他服务。我想要做的是发送一些请求消息并获得回复并进行验证。
假设我有这个数据我想使用下面的服务合同进行测试。
var testData = new TestData
{ Definition = new TestDefinition
{
Steps = new List<TestStep>(){ new TestStep{StepId = "1", Actions = new List<TestAction>()
{new TestAction{ActionType = TestActionType.SendRequest, Parameters = new Dictionary<string, string>(){{"MessageId", "1"}}},
}
} ,
new TestStep{StepId="2",Actions=new List<TestAction>
{new TestAction
{ActionType=TestActionType.GetResponse,
Parameters=new Dictionary<string, string>()
{{"MessageId","2"},{"Wait","30000"}} }}}}
},
Requests = new List<Request>()
{new Request(){
MessageId = "1",
Content = new List<Element>()
{ new Element{Key= "TransactionID.Value", Value = "XX0001"},}}},
Response = new List<Response>{new Response
{MessageId="2", ElementValidations = new List<ValidationRule>
{new ValidationRule
{Element=new Element{ Key = "TransactionID.Value",,
Value="XXX0006"},Description="Failed to match [Transaction ID] value",}}}
以下是DataContracts:
[DataContract]
public class TestData
{
[DataMember]
public TestDefinition Definition { get; set; }
[DataMember]
public List<Request> Requests { get; set; }
[DataMember]
public List<ExpectedResponse> Response { get; set; }
}
[DataContract]
public class TestDefinition
{
[DataMember]
public string TestId { get; set; }
[DataMember]
public List<TestStep> Steps { get; set; }
}
[DataContract]
public class Request
{
[DataMember]
public string TransactionId { get; set; }
[DataMember]
public string TransactionType { get; set; }
[DataMember]
public List<Element> Content { get; set; }
}
[DataContract]
public class TestStep
{
public TestStep()
{
Timeout = 60000;
}
[DataMember]
public ICollection<TestAction> Actions { get; set; }
}
使用特定关键字的规范流程:Scenario,Given,When和Then。我可以将什么设置为场景,给定,何时,然后。
以下是我的想法:
有人可以帮我设计一个好方法来解决这个问题。
谢谢。
答案 0 :(得分:0)
有关Given
When
和Then
的定义,我建议您先阅读http://dannorth.net/introducing-bdd
一般来说,
<强>鉴于强>
鉴于你能保证的事情。实际上,这通常意味着Given
是您创建实例并注入值以使事物进入正确状态的位置。如果你正在使用模拟,这肯定也是在这里创建的。
:当强>
这些步骤使您的测试执行将您从Given
状态转移到您希望成功进行测试的状态的操作。
,然后强>
当您检查代码是否符合您的期望时。
最后,
<强>方案强>
这是我们将Given
,When
和Then
构建成一个有凝聚力的测试的地方。
现在为您的例子
很抱歉,如果目前还不清楚,但我认为我没有足够的细节来真正了解您希望这种设计如何运作。
1.Before scenario [Db set up]
您建议您在BeforeScenario
中设置数据库。那是一种方式。我个人不会在测试框架中使用数据库,我很确定MS / Oracle等,不需要我们测试db存储和检索数据,你会发现运行多个测试时遇到问题并行地,测试执行顺序并能够将其重置回已知状态。嘲笑它。
在本文中,您还在此处定义WCF合同,我们再次可以信任WCF为我们提供代理并使用通道与另一端进行通信。因此,在大多数测试期间,您不必设置所有复杂的体系结构,而只需直接调用对象的实例。即使我们使用SpecFlow,我们仍然可以创建不同级别的测试,从单个单元测试(只有一个类,通常通过nUnit / MSTest并行完成),再到类的协作(毕竟这是最常见的功能) ,一直到最终的集成级别shakedown。如果您正在创建一个完整的WCF堆栈(最终会出现端口重叠等),请不要指望集成级别测试每次都会通过。
2.Given ["Id is found on (.*) table"]
此时我们不应该测试任何东西。您应该将系统置于该状态,以便准备开始测试。由于您尚未定义有关数据库的任何信息,因此它也是一个非常糟糕的实现细节,无法添加到您的方案中。
相反,我建议将服务器置于上述问题的第一个代码块中描述的状态时。您可能会说Given the standard starting state
或更有意义的事情,例如Given that we can handle XX0001 requests
,但在[Binding]
内,您将进行设置。
3.When [Prepare data to send in a table] Ex. The request data above
可能不是。您再次没有定义具有执行测试方法的合同(尽管您已使用validate the incoming response by looping
提及它)。如果你有一个异步设计,(即发送要测试的TestDefinition
,检查一个标志,看看测试是否已经完成,然后检查结果是否已经结束),那么When
是从发送数据直到你得到结果,即如果你必须循环(有更好的方法),也可以在这里做。
4.Then[validate the incoming response by looping]
是的(除了循环)。这里我们有一个结果,现在可以验证它的所有属性/属性,以确保它符合我们的预期。
如果这是您的第一个SpecFlow测试套件,我建议您稍微开始一点。只选择整个过程的一个方面,并为此定义您的方案。随着你越来越有能力,建立更复杂的例子。
不要忘记BDD是一个帮助您发现完全符合您需求的设计和架构的过程。你可能会发现你不需要这样一个可以处理每个案例的抽象框架,但至少当你进行切换时,你仍然需要所有测试来证明新框架适用于现有代码。
祝你好运。