【发布时间】:2020-04-30 09:27:46
【问题描述】:
前言
我故意谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用模拟,而那些不会去任何地方。系统测试应该是对单元测试的补充,因此模拟不是一种选择。
问题
我有一个相当复杂的系统,它只通过 REST 和 websocket 事件进行通信。 我的团队有相当多的(历史发展的)基于 JUnit 的系统测试。 我目前正在将此代码库迁移到 JUnit5。
测试通常由@BeforeAll 组成,其中系统以特定于测试类的配置启动,大约需要一分钟。然后对这个系统进行了一些独立的测试。
我们经常遇到的问题是引导系统需要相当长的时间,甚至可能会失败。可以说引导本身可以被认为是一个测试用例。 JUnit 处理生命周期方法有点奇怪——报告中没有显示它们所花费的时间;如果他们失败了,它就会影响测试的数量;它不是描述性的;等等
我目前正在寻找一种解决方法,但我的团队在过去几年所做的工作与 JUnit 的核心理念有些正交(因为它是一个单元测试框架)。
如果我将@BeforeAll 替换为测试方法(我们称之为@Test public void boot(){...})并引入强制boot 运行的顺序依赖性(使用JUnit 5 很容易),这些问题就会消失在运行任何其他测试之前。
到目前为止一切顺利!这看起来和工作得很好。当测试不是由 CI 服务器执行,而是由试图排除故障的开发人员执行时,实际问题就开始了。当我尝试启动单个测试时,boot 从测试执行中被过滤掉,测试失败。
在 JUnit5 中有什么解决方案吗?还是我应该采取完全不同的方法?
我怀疑使用@TestTemplate 可能有解决方案,但我真的不确定如何继续。同样 afaik 只允许我生成新的命名测试,这些测试也会被过滤。我必须编写自定义测试引擎吗?这似乎并不令人信服。
【问题讨论】:
-
是否可以选择使用依赖注入并提供模拟/存根,这样您就不需要启动整个工作环境?
-
我故意谈论系统测试。我们确实有一套相当详尽的单元测试,其中一些使用模拟,而那些不会去任何地方。系统测试应该是对单元测试的补充,因此模拟不是一种选择。