2

我已经实现了一个新类,Holder。以下是目标:

  1. 三个领域。字段 1 和 2 是整数,字段 3 是布尔值。
  2. 一旦构建,它就不会改变(不可变的)。因此,这些字段将只有吸气剂。
  3. 通过从 5 种可能的类型(字符串格式 1、字符串格式 2、int、类类型 A 和类类型 B)中提取信息来初始化字段 1 和 2。字段 3 设置为真/假。

这给我留下的问题是有 50 个可能的构造函数选项。5 X 5 X 2。这既不明智也不可扩展(添加第 6 种类型,我必须编写一个巨大的更改),所以我使用了构建器模式:

class Builder {
    Builder s1SetField1(String Format1),
    Builder s2SetField1(String Format2),
    ...
    Builder s1SetField2(String Format1),
    ...
    Builder setField3(boolean b)
    Holder build()
}

这真的很好用。我有 5 个用于字段 1 初始化的构建器方法,5 个用于字段 2 初始化的构建器方法和一个用于布尔值的构建器方法。设置字段后,调用 build() 方法,该方法使用正确格式的字段调用私有构造函数并返回一个新对象。

我遇到的问题是单元测试。我想设置一个列表,其中填充了一个具有代表性的对象,这些对象是使用 Builder 方法的每个排列构建的。现在我回到了 50 个新的 Build() 调用。我考虑过创建 3 个列表 - field1List、field2List 和 field3List。然后,分层迭代每一个:

for (Object f1 : field1List) {
    for (Object f2 : field2List) {
        for (boolean f3 : field3List) {
            returnList.add(new Builder().setField1(f1).setField2(f2).setField3(f3).build());
        }
    }
}
return returnList;

当然,在列表中保存混合对象似乎很笨重。有没有更好的方法来使用每个排列进行初始化?

4

1 回答 1

3

试图测试系统输入的每一个排列是疯狂的。即使是小型系统,排列的数量也是巨大的。

取而代之的是使用等价划分将这些许多排列分类为一组较小的等价类,并且每个等价类只有一个测试用例。利用您对代码正在解决的问题及其编写方式(或可能编写,如果您正在测试其他人的代码)的知识来选择一组具有以下属性的等价类,如果程序正常工作等价类中的一个测试用例,如果很可能对类中的所有其他用例正确工作。这提供了具有成本效益的测试用例。

在你的情况下,我会build ()单独测试,然后为每个setXXX ()方法加上一个测试,然后是该build ()方法。

于 2013-06-21T23:21:20.810 回答