Java 删除或注释掉不工作的JUnit测试?

Java 删除或注释掉不工作的JUnit测试?,java,junit,continuous-integration,legacy,Java,Junit,Continuous Integration,Legacy,我目前正在为遗留应用程序构建CI构建脚本。有零星的JUnit测试可用,我将把所有测试的JUnit执行集成到CI构建中。然而,我想知道如何处理在未维护的JUnit测试中遇到的100%的失败。我是否: 1) 注释它们,因为它们似乎有合理的(如果没有维护的话)业务逻辑,希望有人最终取消注释并修复它们 2) 删除它们,因为不太可能有人会修复它们,注释掉的代码只会被忽略,或者永远是杂乱无章的 3) 找到那些把这堆乱七八糟的东西留在我手里的人,并用打印出来的代码(由于长时间的方法气味,足以胜任这项任务)狠狠

我目前正在为遗留应用程序构建CI构建脚本。有零星的JUnit测试可用,我将把所有测试的JUnit执行集成到CI构建中。然而,我想知道如何处理在未维护的JUnit测试中遇到的100%的失败。我是否:

1) 注释它们,因为它们似乎有合理的(如果没有维护的话)业务逻辑,希望有人最终取消注释并修复它们

2) 删除它们,因为不太可能有人会修复它们,注释掉的代码只会被忽略,或者永远是杂乱无章的


3) 找到那些把这堆乱七八糟的东西留在我手里的人,并用打印出来的代码(由于长时间的方法气味,足以胜任这项任务)狠狠地揍他们一顿,同时宣传维护良好、经过单元测试的代码库的好处,如果他们编译失败了:把它们留在里面。这将使您在使用CI时了解测试改进的良好历史。如果测试没有编译,但是破坏了构建,请注释掉它们,并让开发人员修复它们


显然,这并不排除使用选项3(击中它们的头部),不管您对测试做了什么,您都应该这样做。

如果您使用JUnit4,您可以使用注释对测试进行注释

如果您使用JUnit3,您可以重命名测试,这样它们就不会以
test
开头

此外,尝试修复您正在修改的功能的测试,以避免代码变得更混乱。

  • 将它们注释掉,以便以后可以修复它们
  • 生成测试覆盖率报告(例如)。您注释掉的测试应该包含的方法将被指示为未包含在测试中

我不知道你在公司的职位,但如果可能的话,把他们留在公司,并将问题作为你的票务系统中的错误进行归档。让开发人员自行修复或删除测试

如果这不起作用,请删除它们(你有版本控制,对吗?),并用类似“删除了失败的junit测试,显然无法修复”或其他更礼貌的评论来关闭记录单

关键是,junit测试是应用程序代码,因此应该可以工作。这就是开发者得到报酬的原因。如果一个测试不再合适(不再存在的东西被测试了),开发人员应该发出信号并删除该测试。

遵循原则,采取一些行动来解决问题。如果无法修复测试,至少:

  • 在单元测试中忽略它们(有不同的方法)
  • 根据需要输入尽可能多的问题,并指派人员修复测试
  • 然后要防止将来发生此类情况,请安装类似的插件。人员在持续集成过程中获得分配点,例如


    • -10破坏构建你现在绝对应该以某种方式禁用它们。无论是通过注释、删除(假设您可以从源代码管理中获得它们)还是其他方式来完成,都取决于您。您不希望这些失败的测试成为尝试提交新更改的人的障碍


      如果你觉得自己能解决的问题太少了,那就去做吧。如果它们太多,那么我倾向于使用“众包”方法。为每个失败的测试提交一个bug。如果可能的话,尝试将这些bug分配给测试/测试代码的实际所有者/作者,但是如果这太难确定,那么只要你告诉人们重新分配错误分配给他们的bug,那么随机选择就可以了。然后鼓励人们通过给他们一个最后期限或者定期通知每个人进度并鼓励他们修复所有的bug来修复这些bug。

      一个稳定的红色CI系统是毫无价值的。主要的好处是保持一个质量条,如果没有标志质量下降的过渡,这将变得更加困难

      因此,应立即禁用失败的测试,并为每个测试创建跟踪记录单/工作项。不管你如何分类,每一个问题都会得到解决——如果没有人关心这个测试,就把它扔掉。如果故障表示需要在装运前解决的问题,则禁用测试


      一旦您处于这种状态,您现在就可以依靠CI系统来告诉您需要采取紧急措施—回滚最后一次更改,或者立即让团队解决问题,或者诸如此类。

      JUnit测试失败表明

    • 测试中的源代码已经在没有维护测试的情况下运行。在这种情况下,方案3绝对值得考虑,或者
    • 你真的失败了
    • 无论哪种方式,您都需要修复/查看测试/源代码。因为听起来你的工作是创建CI系统,而不是修复测试,所以在你的位置上,我会在测试中留下一颗定时炸弹。使用JUnit 4(类似于
      @IgnoreUntil(date=“2010/09/16”)
      )和自定义运行程序的带注释方法,您可以非常喜欢,因此,您也可以简单地在每个测试的第一行添加一条if语句:

        if (isBeforeTimeBomb()) {
          return;
        }
      

      其中,
      isBeforeTimeBomb()
      只需根据您选择的未来日期检查当前日期。然后,您按照这里其他人给出的建议,通知您的开发团队,构建现在是绿色的,但是如果时间爆炸的测试没有修复,可能会在X天内爆炸

      @Ignore注释很有趣。至于从方法名中删除test,您必须小心,然后添加一条注释来解释这不是一个被遗忘/未使用的方法(否则有人可能会删除它),而是一个应该被修复的测试方法。您可以将方法重命名为类似fixittatertestblahblah的东西,不是吗?我们使用JUnit3,我考虑过重命名t