根据我的经验,绝大多数应用程序提供了大量的“未知”功能。毕竟,我们编写软件的原因是帮助我们以超越我们作为普通人的能力来管理信息。随着时间的推移,我们的软件大小和复杂性不断增长,直到包含大量的“未知”功能。未知的功能在某个时候可能被认为是“正确”的并得到验证,并且通过源代码详细记录。然而,随着时间的推移,没有人完全记得/知道所有功能,甚至不知道为什么它是“正确”的。全部功能只有源代码“记住/知道”,团队“测试更改”,其余部分假定是正确的,除非出现问题。这在许多人多年来扩展和更改的系统中尤其如此。当然,这会带来风险,我们可以做得更好,像TDD这样的流程和自动化单元测试工具正在帮助,但对于许多老系统而言,缺乏系统理解和不完整的测试是生活中的事实。技术理想主义者不喜欢这一点,但商业现实主义者接受它。
所有这些都意味着对于迁移团队来说存在一个重大问题。从理论上讲,这些团队正在“改变一切”。在VB6到.NET的迁移中,“测试我们所更改的内容”意味着测试全部内容。哎呀。此外,迁移的功能要求通常是“只需使其在新平台上像现在一样运行即可”。当人们不知道/记得系统执行的每件事情,更不用说如何验证它正确执行了,这并没有什么用。我正在与几个客户合作,他们拥有巨大的VB6应用程序,包含数十万行代码,分为数百个表单和类以及数千个方法、属性和事件处理程序。我喜欢问迁移团队如果我进入VB6并“破坏”某个小东西,他们需要多长时间才能找到错误。我很少得到答案...
我推崇使用
辅助重写工具方法。这个过程中最关键的输入之一是经过生产测试的源代码。我们假设这个代码是“正确的”,因为您或者您的客户正在运行业务。源代码是对问题“系统做什么”的一个非常详细、正式和完整的回答。在我们的方法中,迁移团队通过迭代定制、校准和验证VB6源代码到完整的.NET源代码的自动化、系统化翻译和重构。我们翻译、测试、调整并重复;每次都会提高翻译的质量,包括功能正确性和符合.NET编码标准。验证和改进工具的功能对于这种方法至关重要。
为了验证代码质量,我们使用代码审查和“并排”测试。通过使用眼睛和其他工具(如.NET编译器、FXCop、NDepends等)检查.NET代码来进行代码审查。我们还使用类似BeyondCompare的产品比较翻译代码的连续几代,以验证每个翻译调整更改是否产生了预期效果并且没有不良副作用。 “并排”测试就像听起来的那样:总体思路是在并排测试环境中运行旧版和.NET应用程序,并确保它们的结果和行为匹配。这里至少有两个挑战:
1.当您“运行应用程序”时该怎么办;
2.如何确保结果和行为匹配?
第一个问题通常通过测试数据、用例和自动化单元测试来回答;第二个问题则通过查看应用程序UI以及两个系统的结果(数据、网页、报告)并进行比较(也称为批准测试)来回答。当然,测试工具可以大大提高效率。大规模迁移是讨论开始使用测试工具的好时机。
如果您计划迁移一个庞大的复杂代码库,您需要计划进行智能测试。如果操作得当,工具辅助方法可以高效地生成生产就绪代码,这将释放资源以生成QC文档并改进QC流程,这些将在迁移之后长期存在。
免责声明:我为Great Migrations工作。
vb6-migration
的问题。我要强调的是,如果您不了解原始VB6应用程序的功能,则成功迁移是不可能的。 - MarkJ