1

我创建了一个单元测试框架 pFUnit,它在很大程度上遵循了 JUnit 的当前设计,并且正在寻找有关如何扩展该框架以处理特定情况的建议。出于好奇,这个框架 pFUnit 是用 OO Fortran 编写的(是的——Fortran 现在具有 OO 功能!)并支持使用 MPI 进行分布式编程。但我认为关于语言选择的唯一相关方面是,如果 SUT 真的崩溃了,那么测试框架也会崩溃。幸运的是,这是一种相对罕见的情况,但它仍然经常发生,足以让人们尖叫着寻求解决方案。

我的意图是提供一个替代的 TestRunner,它将每个测试作为一个单独的可执行文件作为 RPC 或类似的东西运行。这样做的运行时开销可能很大,尤其是在重复启动 MPI 时,所以我不想让它成为默认行为。不幸的是,当我研究如何编写这种方法时,我发现 TestRunner 似乎并不适合这样的扩展,因为它只管理嵌套的 TestSuite 系列的顶部的运行。

通过让 TestRunner 导航嵌套结构,我可以看到一种使其工作的笨拙方式,但这会在很大程度上破坏 TestSuite 的作用。

实际上,我想出的最简单的方法是继承 TestResult。TestResult 在每个 TestCase 上调用 runBare(),因此扩展可能只是启动一个单独的可执行文件,该可执行文件只调用该 runBare() 方法并返回任何异常。这个解决方案打扰了我的审美,因为它不是 TestResult 应该负责的事情。

我还可以向 TestCase 添加一个 launch() 方法,该方法检查一些全局参数以确定是作为过程运行还是作为单独的可执行文件启动。这看起来不优雅,但可能并不比我之前提到的 TestResult 扩展难多少。

希望这是足够的背景知识,对 JUnit 的设计有更深入了解的人可以提出比我提出的替代方案更好/更清洁的方法。或者如果失败,可以为我提出的设计罪提供宽恕。

4

1 回答 1

0

JUnit 本身并不会进行分叉,而是将其留给调用 JUnit 的事物,例如 Eclipse 或 Maven 万能。

Eclipse 分叉 jvm,然后在单独的 JVM 中执行,并通过与分叉的 JVM 的连接来传达结果。

Maven Surefire 具有用户可以控制分叉方式和时间的选项 - 它有不同的分叉选项,请参阅Maven Surefire - 分叉选项和并行测试执行

一种选择是拥有一个 ForkingTestRunner,一个分叉的 TestRunner。然后你可以做相当于@RunWith(ForkingTestRunner.class),每个测试方法分叉一次。

如果这仍然太慢,您可以分叉一个跑步者,并通过套接字或其他东西将结果传达回监视器进程。如果 SUT 崩溃,则监控进程会检测到这一点并导致测试失败并重新启动运行器(但带有一个缩减列表)。

这样一来,每组测试只有一个 fork,除非 SUT 经常崩溃。

于 2013-04-10T15:37:28.243 回答