如何在集成测试中组织测试数据

时间:2015-02-25 19:27:12

标签: c# integration-testing readability

我正在开展一个由数千个集成测试组成的大型测试项目。 有很多代码重复,有点乱。大多数测试由几个步骤组成,并且很多"虚拟"对象已创建。假人我的意思是这样的:

new Address {
    Name = "fake address",
    Email = "some@email.com",
    ... and so on
}

通常情况下,数据通常并不重要。这种代码在测试,测试基类和帮助程序中展开并重复。

我想要的是拥有一个单独的测试数据构建器",只有一个责任,生成测试所消耗的测试数据。

一种方法是让一个类包含一堆静态方法,如下所示:

Something CreateSomething(){
    return new Something {
    // set default dummy values
}

和过载:

Something CreateSomething(params){
    return new Something {
    // create the Something from the params
}

另一种方法是让xml文件包含数据,但我担心它会离测试太远。

目标是将这种代码移出测试,因为现在测试很大而且不可读。在典型情况下,50行测试代码,20-30是这种代码。

有没有完成此项目的模式?或者任何大型开源代码库的例子,我可以看一下类似的内容?

2 个答案:

答案 0 :(得分:1)

我会回避指定测试依赖项的xml文件。

我的思维过程源于缺乏重构工具,这些xml文件无法在Visual Studio生态系统中利用。

相反,我会创建一个TestAPI。 此API将负责为测试客户端提供依赖关系数据。

请注意,正在请求的依赖关系数据已经使用常规数据初始化,并且已准备好用于请求依赖关系的客户端。

任何作为特定测试所需测试输入的值都将在测试本身内分配。这是因为我希望测试能够自我记录其意图或目标,并抽象出未经测试的依赖关系。

XUnit Test Patterns为编写测试提供了很多见解。

答案 1 :(得分:1)

对于代码,请使用简单的方法链接构建器模式:

public class TestOrderBuilder
{
    private order = new Order();

    //  These methods represent sentances / grammar that describe the sort   
    //  of test data you are building
    public AnObjectBuilder AddHighQuantityOrderLine()
    {
         //... code to add a high quantity order line

         return this; // for method chaining
    }

    //  These methods represent sentances / grammar that describe the sort   
    //  of test data you are building
    public AnObjectBuilder MakeDescriptionInvalid()
    {
         //... code to set descriptions etc...

         return this; // for method chaining
    }

    public Order Order
    {
         get { return this.order; }
    }
}

// then using it:
var order = new TestOrderBuilder()
                 .AddHighQuantityOrderLine()
                 .MakeDescriptionInvalid()
                 .Order