构建测试数据的策略

时间:2011-06-07 15:05:50

标签: java unit-testing

我是开发领域的新手,我想知道哪些是构建一致且连贯的复杂测试数据的最佳策略(我的意思是我的POJO很难填充)用于单元测试?

我听说过“测试数据生成器”,但网络上的话题太少了。

1 个答案:

答案 0 :(得分:0)

我经常需要完成同样的任务。 Fuzz testing是一种合适的方法,但我们应该小心区分原始模糊器和智能模糊器。智能模糊器与普通模糊工具(如zzuf)的不同之处在于它可以生成针对您的应用程序的数据。显然,在这种情况下,你需要一个智能模糊器。

要编写智能模糊器,您需要提取表示“一致且连贯”的规则并将它们作为逻辑。可能最好举个例子。下面的Model类有一些反对它的逻辑。

class Model {

    // Should always be between 0 and 10
    int a;

    // Children
    List<Model> children;

    // Only true at the root
    boolean isRoot;
}

我们可以通过编写这些规则来编写测试数据构建器。

class ModelGenerator {
   private Random random;

   // A seed is a good idea; you want your tests to be reproducible
   public ModelGenerator(int seed) {
       random = new Random(seed);
   }

   public Model arbitrary () {
       return generateSingleItem(true);
   }

   private Model generateSingleItem(boolean isRoot) {
       Model model = new Model();
       model.isRoot = isRoot;
       model.a = random.nextInt(10);

       int childrenCount = random.nextInt(100);
       model.children = new ArrayList<Model>(childrenCount);
       for (int i=0;i<childrenCount;++i) {
            model.children.add(generateSingleItem(false));
       }

       return model;
   }
}

现在你可以使用生成器来创建随机(但可以预测种子)模型,以便用它来测试断言。

这种方法与QuickCheck密切相关。有一个Java version可用,它提供了一个通用接口(以及更多!)上述方法。