gpt4 book ai didi

java - 如何为不同的测试上下文重用 JUnit 测试方法?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:05:20 25 4
gpt4 key购买 nike

到目前为止,我一直在为我的项目中的某个应用程序的支持开发测试。现在我已经启动并运行了一组测试,我需要为另一个类似的应用程序提供支持。这两个应用程序的结果在我的系统中应该是相同的,因为它们都产生相同的操作但来自不同的上下文。问题是,我正在寻找一种方法,可以重用我为第一个测试所做的测试,而无需为另一个测试用例复制它们的代码。

我目前在 Java EE 8 下使用 JUnit 4。

我的情况是这样的。给定如下所示的测试:

class TestExample {
Context context;

@Before
public void setUp() {
context = new ContextA();
}

@After
public void terminate() {
context.dispose();
}

@Test
public void test1() {
context....
}
}

abstract class Context {
@Override
public void dispose() {
...
}
}

class ContextA extends Context {
}

class ContextB extends Context {
}

我希望能够对 ContextA 进行一次测试,然后对 ContextB 进行一次测试。

---o---

所以在一段时间后回到这个问题之后,我从这个线程中收集了三个可能的解决方案来解决我的问题:

  1. 参数化
  2. 测试继承
  3. 语境构成

但是,在对真实测试用例进行全部尝试后,我发现它们都不是完美的解决方案。他们确实解决了我在这个问题上提出的问题,但是当出现真实案例并且他们之间的上下文开始略有不同时,这些选项开始变得复杂和丑陋。

最后,我选择了最简单的解决方案:为每个不同的上下文复制测试源代码。它有效,但问题是随着时间的推移,维护测试变得越来越困难,因为必须将对单个测试的更改复制到它的所有副本。

最佳答案

How do I reuse JUnit test methods for different testing contexts?

通常,您不会

单元测试的一个核心点是:它们可以帮助您在稍后更改生产代码时快速识别错误。意思是:单元测试的一个主要要求是您能够快速阅读和理解它们。任何使它变得更难的东西,比如避免代码重复的“复杂”解决方案都是有问题的。

从这个角度来看,测试代码的“规则”有时与生产代码的“规则”不同。在生产代码中,您希望(几乎)不惜一切代价避免代码重复。

然而,对于测试代码,两个不同的测试类做非常相似的事情......两次是完全没问题的。也许,只是也许你将通用代码提取到辅助方法中(比如做一个特定的、复杂的断言)到一些实用程序类中。

话虽如此,一个潜在的解决方案是:如果您真的想对多个“输入”运行完全相同的测试,那么我建议您查看 parameterized例如测试。无需在 @Before 代码中硬编码您的 context 实例,您可以简单地拥有多个不同的 context 对象,并为每个对象运行所有测试。

关于java - 如何为不同的测试上下文重用 JUnit 测试方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58063106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com