【问题标题】:Unit testing while migrating legacy code迁移遗留代码时进行单元测试
【发布时间】:2015-01-13 09:31:25
【问题描述】:

我们有一个旧的 C# 库需要“清理”、重构,基本上是重做。该库没有任何关联的单元测试(也没有相关文档)。 我们希望确保从头开始重新制作所有内容后,所有功能都将保留,并且不会引入任何错误。为此我问你,你将如何处理考虑单元测试的这种情况。 我应该为旧项目库和新项目库创建单元测试吗?为遗留代码创建单元测试毫无意义。还是这样?

【问题讨论】:

  • 您打算从头开始编写整个项目吗?这个项目有多大?
  • 没那么复杂,有 6 个类:大多数是 +/-100 行,一个是 +/-1100 行
  • 这个问题可能更适合programmers.stackexchange.com,但新旧项目应该使用基本相同的黑盒测试。

标签: c# unit-testing


【解决方案1】:

不幸的是,这取决于您计划如何重写。如果您想完全重新设计,那么为遗留代码编写单元测试或多或少是没有用的,您将无法迁移它们。单元测试与他们测试的 unit 紧密耦合。重新设计被测单元通常会使他们的单元测试无效。

我建议考虑为旧库编写集成测试,即验证大型进程(如果可能的话)。它们可能更容易挽救,并且应该让您确信大图仍然完好无损。但这可能是高度特定于领域的,即,如果您正在迁移某种工具库,可能没有全局可供查看!

【讨论】:

    【解决方案2】:

    因此,遗留代码也不存在单元测试。从理论上讲,我们甚至不确定它是否没有错误。

    对遗留代码进行单元测试需要一些重构技术,这也需要您更改遗留代码。如果计划是编写一个新库,那么对旧库进行单元测试会使工作加倍,并且不会给您任何好的见解。

    您想知道是否没有引入任何错误:构建新项目测试驱动。您想知道功能是否相同?最终用户验收测试,因为没有自动化的方法来验证新旧设备的行为是否相同。

    我错过了它是由其他组件而不是用户使用的内部组件的部分。在这种情况下,您可以编写黑盒测试。这确实要求您保持公共合同不变,但允许您识别新旧项目之间的差异。

    【讨论】:

      【解决方案3】:

      如果您的目标是保持现有 API 不变并且只改进库的内部实现,您应该使用单元测试覆盖旧库的公共 API。然后你就可以安全地进行重构和改进了。

      如果您的改进需要更改公共 API,那么旧库的单元测试将无济于事 - 您应该使用单元测试覆盖新 API。

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-05
        • 1970-01-01
        • 1970-01-01
        • 2010-09-09
        • 1970-01-01
        相关资源
        最近更新 更多