2009-10-29 99 views
16

我必须写一个非常大的测试套件一套复杂的业务规则当前在几个表格形式(例如,如果参数X Y Z为如此这般,则该值应为V1和V2之间)捕获。每个规则都有一个名称和它自己的语义。是否有可能以编程方式生成JUnit测试用例和套件?

我的最终目标是将测试套件组织到子测试套件中,并为每个规则提供测试用例。

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

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

然而,理想情况下,我想有一个测试套件来读取文件,然后定义它们中的子套件和测试。所有这些测试都可以从表文件采取了一定的值进行初始化,在我们的系统中运行的固定入口点,然后调用基于预期值的结果会验证功能。

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

更新:我可能有所简化我们的一种规则。其中一些确实是表格(excel风格),其他则更加模糊。一般问题仍然存在,因为我可能不是第一个有这个问题的人。

+0

非常有兴趣了解这个;我需要更多地了解测试用例。 – I82Much 2009-10-29 21:34:51

回答

17

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

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

8

你考虑过使用FIT吗?

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

FIT是一个基于带有输入 - >预期输出映射的表检查测试的系统,并且提供了用于运行这些测试的开源java库。

+0

也有它的Java驱动程序。 – 2009-10-29 21:49:59

+0

那就是我要说的;你的情况听起来就像是合适的事情要解决的事情;我推荐fitnesse(http://fitnesse.org),因为这是我能想到的最新和最新的实现。 – Kevlar 2009-10-29 21:56:27

+0

谢谢。我熟悉FIT,但对新的实现不熟悉;我会检查他们。不过,我想知道是否有一种编程方式留在JUnit中。 – Uri 2009-10-30 13:18:46

1

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

  • 测试可以检查在旁边的代码库(成Subversion存储库,例如)
  • 它们由一个标准的JUnit运行执行
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,我确实做到了你是什么样的飞行saying--发电试验。然而,用Java做这件事很复杂,我不认为这是值得的,因为还有另一种非常合理的方法。

希望这会有所帮助。

相关问题