2010-10-27 76 views
1

我正在开发一个库,需要测试它。在我的类中定义了几个操作(作为函数),可以按客户端的任何顺序调用它们。生成随机测试用例

Operation1(param1, param2) 
Operation2(param3) 
. 
. 
. 
OperationN(paramX, paramY, paramZ) 

参数1,参数2等是整数/双

现在,我想编写一个测试代码随机化操作的执行,使得M动作的顺序将随机进行的。每次调用操作时,都需要随机生成参数。

在Java中这样做的最好方法是什么?

+3

如果你确实按照随机生成​​的测试路线走下去,重要的是它们仍然是可重复的。大多数随机生成器允许您指定用于生成随机性的种子,以便如果您的测试产生了错误,那么可以通过为它提供相同的种子来重新运行完全相同的测试。否则,你将运行不同的测试,并不知道你是否已经解决了问题。 – Nick 2010-10-27 10:16:00

+0

我正在计划记录随机生成的序列。 – devnull 2010-10-27 10:17:29

+0

这是不够的。你需要能够在修复一个bug之后再运行*相同的“随机”测试序列*,或者简单地作为回归。如果测试是真正的随机测试,那么您无法知道给定的运行是否会执行将会失败的组合。 – 2010-10-27 10:39:20

回答

1

随机化测试似乎很有吸引力,因为它们似乎可以避免编写大量单独的测试。问题是,你永远无法确定随机序列会碰到可能失败的边缘情况等。国际海事组织他们不能取代精心设计和实施的白盒测试。

对于像您这样的情况,我尝试设计一堆测试助手,以便轻松构建输入数据结构。例如一个简单的语言+解析器,它允许我将输入和期望的输出表示为文本,嵌入到单元测试用例中或作为单独的文件。

+0

“你永远不能确定随机序列会碰到边缘情况”随机测试数据的一个优点是,它使你有机会检测边缘情况的错误处理,这些边缘情况你没有想到。我同意他们不能替代良好的单元测试。 – Raedwald 2011-09-08 16:01:23

1

您需要的操作,如

public interface Operation { 
    public void do(); 
} 

创建要执行一个类实现该接口的每个操作的接口。各个参数可以传递给构造函数。

然后将所有实例放入类型操作的列表中,随机化它并遍历它。

List<Operation> ops = new Vector<Operation>(); 
ops.add(new ...); 
Collections.shuffle(); 
for (Operation o: ops) { 
    o.do(); 
}