【问题标题】:Which strategy to build test data构建测试数据的策略
【发布时间】:2011-06-07 15:05:50
【问题描述】:

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

我听说过“Test Data Builder”,但网上谈论它的话题太少了。

【问题讨论】:

    标签: java unit-testing


    【解决方案1】:

    我经常需要做完全相同的任务。 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 可用,它提供了一个通用接口(以及更多!),就像上面描述的那样。

    【讨论】:

    • 感谢您的回复,但在测试我的应用程序的稳健性之前,我需要为单元测试提供可行的数据。
    • 我想我一定是解释得很糟糕,对不起!在上面的示例中,ModelGenerator 为您的单元测试创​​建数据。
    • 好吧,如果我理解你的话,你的方法看起来像这个网站上的描述:link?
    • 类似,但不完全相同。我认为 ObjectMother 模式(我以前没见过,所以感谢链接!)只专注于生成一组对象,而我提倡的生成器方法生成随机(但满足一些约束)对象。
    • 好的,非常感谢您抽出宝贵的时间,如果您对“Object Mother”模式感兴趣,您可能会对此处描述的“Test Data Builder”模式更感兴趣link,看看这个one 也是。如果您有时间,请给我您的反馈。
    猜你喜欢
    • 2012-03-29
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 2011-04-20
    • 2023-03-18
    相关资源
    最近更新 更多