我正在开发一个库,需要测试它。在我的类中定义了几个操作(作为函数),可以按客户端的任何顺序调用它们。生成随机测试用例
Operation1(param1, param2)
Operation2(param3)
.
.
.
OperationN(paramX, paramY, paramZ)
参数1,参数2等是整数/双
现在,我想编写一个测试代码随机化操作的执行,使得M动作的顺序将随机进行的。每次调用操作时,都需要随机生成参数。
在Java中这样做的最好方法是什么?
我正在开发一个库,需要测试它。在我的类中定义了几个操作(作为函数),可以按客户端的任何顺序调用它们。生成随机测试用例
Operation1(param1, param2)
Operation2(param3)
.
.
.
OperationN(paramX, paramY, paramZ)
参数1,参数2等是整数/双
现在,我想编写一个测试代码随机化操作的执行,使得M动作的顺序将随机进行的。每次调用操作时,都需要随机生成参数。
在Java中这样做的最好方法是什么?
随机化测试似乎很有吸引力,因为它们似乎可以避免编写大量单独的测试。问题是,你永远无法确定随机序列会碰到可能失败的边缘情况等。国际海事组织他们不能取代精心设计和实施的白盒测试。
对于像您这样的情况,我尝试设计一堆测试助手,以便轻松构建输入数据结构。例如一个简单的语言+解析器,它允许我将输入和期望的输出表示为文本,嵌入到单元测试用例中或作为单独的文件。
“你永远不能确定随机序列会碰到边缘情况”随机测试数据的一个优点是,它使你有机会检测边缘情况的错误处理,这些边缘情况你没有想到。我同意他们不能替代良好的单元测试。 – Raedwald 2011-09-08 16:01:23
您需要的操作,如
public interface Operation {
public void do();
}
创建要执行一个类实现该接口的每个操作的接口。各个参数可以传递给构造函数。
然后将所有实例放入类型操作的列表中,随机化它并遍历它。
List<Operation> ops = new Vector<Operation>();
ops.add(new ...);
Collections.shuffle();
for (Operation o: ops) {
o.do();
}
如果你确实按照随机生成的测试路线走下去,重要的是它们仍然是可重复的。大多数随机生成器允许您指定用于生成随机性的种子,以便如果您的测试产生了错误,那么可以通过为它提供相同的种子来重新运行完全相同的测试。否则,你将运行不同的测试,并不知道你是否已经解决了问题。 – Nick 2010-10-27 10:16:00
我正在计划记录随机生成的序列。 – devnull 2010-10-27 10:17:29
这是不够的。你需要能够在修复一个bug之后再运行*相同的“随机”测试序列*,或者简单地作为回归。如果测试是真正的随机测试,那么您无法知道给定的运行是否会执行将会失败的组合。 – 2010-10-27 10:39:20