如何构建测试数据的策略

3

我刚进入开发领域,想知道构建一致且连贯的复杂测试数据的最佳策略是什么(我的POJO需要填充的内容很复杂),以便进行单元测试?

我听说过“测试数据生成器”,但网络上很少有相关话题。

1个回答

0

我经常需要完成完全相同的任务。模糊测试是一个合适的方法,但我们应该注意区分原始模糊测试工具和智能模糊测试工具。智能模糊测试工具与正常的模糊测试工具(如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版本,它提供了一种通用接口(以及更多!)上述方法的类型。

感谢您的回复,但在测试我的应用程序的健壮性之前,我需要为单元测试提供可行的数据。 - jakcam
我想我一定解释得很糟糕,抱歉!在上面的例子中,ModelGenerator为您的单元测试创建数据。 - Jeff Foster
1
好的,如果我理解正确的话,你的方法看起来像这个网站上描述的:链接 - jakcam
相似,但不完全相同。我认为ObjectMother模式(我之前没有见过,所以感谢提供链接!)只专注于生成单一对象集,而我所倡导的生成器方法则生成随机的(但满足某些限制条件的)对象。 - Jeff Foster
非常感谢您的时间。如果您对“对象工厂”模式感兴趣,您可能会对此处描述的“测试数据构建器”模式更感兴趣[链接](http://www.natpryce.com/articles/000714.html),也可以看看这个 [链接] (http://code.google.com/p/make-it-easy/)。如果您有空,请给我您的反馈。 - jakcam
非常感谢这些链接。这些链接提供了很酷的构建代码界面,但它们仍然无法捕捉逻辑(如您所述的一致和连贯)。我想你可以结合这两种方法,使用构建器界面生成随机但一致的对象。 - Jeff Foster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接