【发布时间】:2011-06-07 15:05:50
【问题描述】:
我是开发领域的新手,我想知道为单元测试构建一致且连贯的复杂测试数据(我的意思是我的 POJO 很难填充)的最佳策略是什么?
我听说过“Test Data Builder”,但网上谈论它的话题太少了。
【问题讨论】:
标签: java unit-testing
我是开发领域的新手,我想知道为单元测试构建一致且连贯的复杂测试数据(我的意思是我的 POJO 很难填充)的最佳策略是什么?
我听说过“Test Data Builder”,但网上谈论它的话题太少了。
【问题讨论】:
标签: java unit-testing
我经常需要做完全相同的任务。 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 可用,它提供了一个通用接口(以及更多!),就像上面描述的那样。
【讨论】: