是否可以以编程方式生成JUnit测试用例和套件?

时间:2009-10-29 21:28:45

标签: java unit-testing junit junit4

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

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

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

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

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

有没有合理的方法可以仅使用Java来解决这个问题?

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

4 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:8)

您是否考虑过使用FIT

您似乎已准备好表格,“业务规则”听起来像“商务人士使用Excel撰写它们”。

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

答案 2 :(得分:1)

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

  • 可以在代码库旁边检查测试(例如,进入Subversion存储库)
  • 它们由标准的JUnit runner
  • 执行

答案 3 :(得分: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中执行此操作非常复杂,我认为这不值得,因为还有另一种非常合理的方法。

希望这有帮助。