代码之家  ›  专栏  ›  技术社区  ›  Uri

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

  •  16
  • Uri  · 技术社区  · 16 年前

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

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

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

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

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

    有没有一种合理的方法来使用Java呢?

    更新:我可能已经简化了我们的规则。其中一些确实是表格(Excel样式),另一些则更模糊。但一般的问题仍然存在,因为我可能不是第一个有这个问题的人。

    4 回复  |  直到 16 年前
        1
  •  17
  •   Kathy Van Stone    16 年前

    在6月4日,你会想看看 Parameterized runner .它是为您描述的目的(数据驱动测试)而创建的。但它不会把它们组织成套房。

    在JUnit3中,可以通过编程创建测试套件和测试。答案在 Junit Recipes ,如果需要,我可以扩展它(记住JUnit4可以运行JUnit3测试)。

        2
  •  8
  •   Kevin Sadler    13 年前

    你考虑过使用吗 FIT 为了这个?

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

    FIT是一种基于输入和期望输出映射的表来检查测试的系统,而运行这些测试的开源Java库是可用的。

        3
  •  1
  •   Vladimir    16 年前

    我们试着合身,决定一起去 Concordion . 这个图书馆的主要优势是:

    • 可以将测试与代码库一起签入(例如,签入到Subversion存储库中)。
    • 它们由标准的JUnit运行程序执行
        4
  •  0
  •   ndp    16 年前

    我用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做这件事很复杂,我认为它不值得,因为还有另一种非常合理的方法。

    希望这有帮助。