使用规范流测试服务

时间:2013-08-02 18:00:47

标签: specflow

我想使用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。我可以将什么设置为场景,给定,何时,然后。

以下是我的想法:

  1. 在场景[Db设置]之前
  2. 鉴于[“Id在(。*)表格上找到”]
  3. 当[准备要在表格中发送数据]时
  4. 上面的请求数据
  5. 然后[通过循环验证传入的响应]
  6. 有人可以帮我设计一个好方法来解决这个问题。

    谢谢。

1 个答案:

答案 0 :(得分:0)

有关Given WhenThen的定义,我建议您先阅读http://dannorth.net/introducing-bdd

一般来说,

<强>鉴于

鉴于你能保证的事情。实际上,这通常意味着Given是您创建实例并注入值以使事物进入正确状态的位置。如果你正在使用模拟,这肯定也是在这里创建的。

:当

这些步骤使您的测试执行将您从Given状态转移到您希望成功进行测试的状态的操作。

,然后

当您检查代码是否符合您的期望时。

最后,

<强>方案

这是我们将GivenWhenThen构建成一个有凝聚力的测试的地方。

现在为您的例子

很抱歉,如果目前还不清楚,但我认为我没有足够的细节来真正了解您希望这种设计如何运作。

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是一个帮助您发现完全符合您需求的设计和架构的过程。你可能会发现你不需要这样一个可以处理每个案例的抽象框架,但至少当你进行切换时,你仍然需要所有测试来证明新框架适用于现有代码。

祝你好运。