0

我想使用规范流测试服务接口。

该服务旨在运行测试以测试其他服务。我想做的是发送一些请求消息并得到响应并进行验证。

假设我有这个数据,我想使用下面的服务合同进行测试。.

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",}}}

以下是数据合同:

[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; }

}

使用特定关键字的规范流程:场景、给定、何时和然后。我可以将什么设置为场景、给定、何时和然后。

这是我想做的事情:

  1. 在场景 [Db setup] 之前
  2. 给定 ["Id 在 (.*) 表中找到"]
  3. 当 [准备要在表格中发送的数据] 例如。上面的请求数据
  4. 然后[通过循环验证传入的响应]

有人可以帮助我设计一种解决此问题的好方法。

谢谢你。

4

1 回答 1

0

对于 and 的定义,Given WhenThen建议您先阅读http://dannorth.net/introducing-bdd

一般来说,

给定

给定的是您可以保证的事情。实际上,这通常意味着Givens 是您创建实例并注入值以使事物进入正确状态的地方。如果您使用模拟,这肯定也是在这里创建的。

什么时候

这些步骤使您的测试执行将您从已完成的状态移动Given到您希望通过成功测试进入的状态的操作。

然后

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

最后,

设想

这是我们将Givens、Whens 和Thens 构建成一个内聚测试的地方。

现在举个例子

抱歉,如果不清楚,但我认为我没有足够的细节来真正欣赏您希望此设计如何工作。

1.Before scenario [Db set up] 您建议在您BeforeScenario的数据库中设置您的数据库。嗯,这是一种方式。就我个人而言,我不会在测试框架中使用数据库,我很确定 MS/Oracle 等不需要我们测试数据库存储和检索数据,你会发现运行多个测试有问题同时,测试执行顺序并能够将其重置回已知状态。取而代之的是嘲笑它。

在此说明中,您也在此处定义 WCF 合同,我们可以再次信任 WCF 为我们提供代理并使用通道与另一端进行通信。因此,在您的大部分测试中,您不必设置所有复杂的架构,而只需直接调用对象的实例。即使我们使用 SpecFlow,我们仍然可以创建不同级别的测试,从单个单元测试(只有一个类,通常通过 nUnit/MSTest 并行完成)到类的协作(毕竟这是最常见的功能) ,一直到最终的整合水平调整。如果您正在创建整个 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 是一个过程,可帮助您发现完全符合您需求的设计和架构。你可能会发现你并不需要一个可以处理所有情况的抽象框架,但至少当你进行切换时,你仍然有所有测试来证明新框架适用于现有的代码也是如此。

祝你好运。

于 2013-08-06T17:58:33.907 回答