17

我必须为目前以几种表格形式捕获的一组复杂的业务规则编写一个非常大的测试套件(例如,如果参数 XYZ 是这样那样,则值应该在 V1 和 V2 之间)。每个规则都有一个名称和它自己的语义。

我的最终目标是拥有一个测试套件,组织成子测试套件,每个规则都有一个测试用例。

一种选择是将所有这些规则实际硬编码为测试。这是丑陋的、耗时的和不灵活的。

另一种方法是编写一个 Python 脚本来读取规则文件并使用单元测试生成 Java 类。如果可以的话,我宁愿避免这种情况。另一种变体是使用 Jython。

但是,理想情况下,我希望有一个可以读取文件的测试套件,然后在其中定义子套件和测试。这些测试中的每一个都可能使用从表文件中获取的某些值进行初始化,在我们的系统中运行固定的入口点,然后根据预期值对结果调用一些验证器函数。

有没有一种合理的方法可以仅使用 Java 来实现这一点?

更新:我可能在某种程度上简化了我们的规则。其中一些确实是表格(excel 风格),另一些则比较模糊。不过,一般问题仍然存在,因为我可能不是第一个遇到这个问题的人。

4

4 回答 4

17

在 JUnit 4 中,您需要查看Parameterized runner。它是为您描述的目的(数据驱动测试)而创建的。但是,它不会将它们组织成套件。

在 Junit 3 中,您可以以编程方式创建测试套件和测试。答案在Junit Recipes中,如果您需要,我可以扩展它(请记住,JUnit 4 可以运行 Junit 3 测试)。

于 2009-10-29T22:00:49.190 回答
8

您是否考虑过为此使用FIT

您似乎已经准备好表格,并且“业务规则”听起来像“业务人员使用 excel 编写它们”。

FIT 是一个基于具有输入->预期输出映射的表检查测试的系统,并且可以使用用于运行这些测试的开源 Java 库。

于 2009-10-29T21:37:18.083 回答
1

我们尝试了 FIT 并决定选择Concordion。这个库的主要优点是:

  • 测试可以与代码库一起签入(例如,进入 Subversion 存储库)
  • 它们由标准的 JUnit 运行器执行
于 2009-10-31T21:52:37.540 回答
0

我使用 JUnit 写了一些非常相似的东西。我在一个 XML 文件中有大量测试用例(30 页)。我没有尝试生成不同的测试,而是在一个测试中完成了这一切,效果很好。

我的测试看起来像这样:

void setup() { 
  cases = read in the xml file
}

void test_fn_works() {
  for case in cases {
    assert(case.expected_result, fn(case.inputs), 
        'Case ' + case.inputs + ' should yield ' + case.expected_result);

  }
}

使用 Ruby,我完全按照您所说的做了——即时生成测试。但是,在 Java 中这样做很复杂,而且我认为这不值得,因为还有另一种非常合理的方法。

希望这可以帮助。

于 2009-11-05T08:30:12.050 回答