java - JUnit:针对不同实现和细粒度结果状态的相同测试

标签 java unit-testing junit automated-tests

我们有相同接口(interface)的两种不同实现。将其视为引用和生产实现。这两个实现由不同的团队实现,目标是从两个实现中获得相同的结果。

创建引用实现的团队已经创建了大量基于 Junit 的测试用例(目前约有 700 个测试用例),并且这些单元测试在开发过程中经常运行。我们可以针对生产实现运行同一组测试用例。

生产实现的功能通过回归测试进行测试。但是,能够针对生产实现运行单元测试让我们能够在每次获得新版本的生产代码时快速反馈是否存在严重问题。

但由于生产版本中缺少某些功能,或者由于已知错误导致结果不同,因此并非所有测试都通过此实现。这使得很难及早发现回归。

这里有几个类别:

  • (A) 只对引用实现有意义,对生产实现永远不重要的测试用例

  • (B) 测试生产实现时只需要省略某些断言的测试用例(即引用实现中报告的附加值)

  • (C) 已知在生产实现中不起作用的测试用例,因为某些功能的开发滞后,但应该在以后包括在内

到目前为止,我们有以下选择:

  • 用仅在引用实现中有效的断言周围的 if 语句使我们的代码困惑。这解决了 (B) 但难以维护。

  • 使用 assumeTrue。这对 (A) 来说没问题,但给人的印象是 (B) 一切都很好。

我想要的是

  • 能够基于运行时条件跳过某些测试,例如 assumeTrue,但对于 (C),这些应该被报告为已跳过而不是成功

  • 有更多的结果状态考虑到一个测试用例之前是否已知有效,这给出了

    • 之前已知有效的测试用例成功
    • 修复了之前已知无效的测试用例
    • 之前已知无法运行的测试用例失败
    • 对已知有效的测试用例进行回归
    • 跳过

以前有没有人做过类似的事情,或者甚至可以使用 JUnit(最好结合使用 eclipse JUnit 插件)?

最佳答案

要跳过具有运行时条件的测试,您可以使用 Filter ,您可以根据测试的一个方面(名称,最好是测试方法上的注释 @Development() 或 @Version())选择忽略或不忽略测试。

要使用它来解决 (B),您需要针对每个版本使用不同的测试方法,一种用于 3.1,一种用于 3.2,等等。这似乎使您的单元测试变得困惑,但实际上它使您的工作更容易选择出适用于 3.1 的测试。

对于问题的“时间机器”部分,junit 很难知道测试之前是否已通过。您需要在某处记录旧结果。

要分析哪些测试已更改状态(从通过变为失败),例如通过 CI 系统让您的 junit 测试以系统的方式运行,然后将结果保存在可以进行后处理的地方以提供回归.例如,surefire xml 报告很容易解析。

关于java - JUnit:针对不同实现和细粒度结果状态的相同测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323832/

相关文章:

具有并行支持的 C# 模拟框架

c# - NSubstitute:如何访问返回中的实际参数

unit-testing - 如何模拟 MSMQ 消息队列

maven - Tycho 无法解析 tycho-surefire-plugin 中配置的依赖项

java - 无法模拟方法响应

java - 无法让机器人类右键单击

java - 为什么不可能测试 boolean 值以外的任何东西?

java - 搜索的实现给我错误 客户端发送的请求在语法上不正确

java - ArrayList 不允许扫描仪输入

java - 运行 Jenkins 给出 "package org.junit does not exist"