10

我正在开发一个非常大的、数据密集型的遗留应用程序。代码库和数据库的规模都很大。大量业务逻辑分布在包括存储过程在内的所有层中。

是否有人对如何以有效的方式开始将“单元”测试(技术上的集成测试,因为他们需要跨层测试几乎任何给定流程的单个方面)应用到应用程序有任何建议?当前的架构不容易支持任何类型的注入或模拟。正在编写新代码以方便测试,但是遗留代码呢?由于对数据本身和数据库中的业务逻辑有很强的依赖性,我目前正在使用内联 sql 来查找要用于测试的数据,但这些都非常耗时。创建视图和/或存储过程是不够的。

您采取了哪些方法(如果适用)?什么有效?什么没有&为什么?任何建议,将不胜感激。谢谢。

4

3 回答 3

12

获取Michael Feathers的《有效使用遗留代码》的副本。对于处理大型、未经测试的代码库,它充满了有用的建议。

另一本好书是Object Oriented Reengineering Patterns。本书的大部分内容并不特定于面向对象的软件。全文可免费下载 PDF 格式。

根据我自己的经验:尝试...

  • 自动化构建和部署
  • 将数据库模式放入版本控制中(如果还没有的话)。通常,数据库包含事务代码在其工作之前需要存在的参考数据。也可以将其置于版本控制之下。dbdeploy 之类的工具可以帮助您轻松地重建模式并从一系列增量中引用数据。
  • 在您的开发工作站上安装一个版本的数据库(和任何其他基础设施服务)。这将使您无需不断地通过 DBA 就可以处理数据库。它也比在远程数据中心的共享服务器上使用模式更快。所有主要的商业数据库服务器都有可在 Windows 上运行的免费(如啤酒)开发版本(如果您陷入在 Windows 上开发和在 Unix 上部署的令人羡慕的境地)。
  • 在开始处理代码的某个区域之前,请编写大致涵盖您正在处理的区域的行为的端到端测试。端到端测试应该从外部运行系统——通过控制其用户界面或通过网络服务进行交互——因此您无需更改代码即可将其放置到位。它将充当(不完美的)回归测试,并让您更有信心将系统内部重构为更易于单元测试的结构。
  • 如果有手动测试计划,请阅读它们并查看可以自动化的内容。大多数手动测试计划几乎完全是脚本化的,因此自动化也是唾手可得的成果
  • 一旦你获得了端到端的测试覆盖率,就可以在修改和/或扩展代码时将代码重构为更松散耦合的单元。用单元测试围绕这些单元。

要避免的事情:

  • 将生产数据库中的数据复制到您用于自动化测试的环境中。这将使您的测试变得不可预测。当然,针对生产数据的副本运行系统,但将其用于探索性测试,而不是回归测试。
  • 在测试结束时回滚事务以将测试彼此隔离。这不会测试仅在提交事务时发生的行为,并且会丢弃对诊断测试失败有价值的数据。相反,测试应确保数据库在启动时处于已知的初始状态。
  • 为要运行的测试创建一个“小”数据集。这使得测试难以理解,因为它们不能作为一个单元来阅读。随着您为不同场景添加测试,“微小”数据集很快就会变得非常大。相反,测试可以将数据插入数据库以设置测试夹具。
于 2009-06-18T21:24:09.197 回答
0

“测试遗留应用程序现代化”重点介绍:

  1. 在 AscentialTest 中如何创建测试的高级概述

  2. 将遗留对象转换为新平台对象定义组件的方法

  3. 如何确保应用程序的现代化版本产生相同的结果

有关使用测试遗留应用程序的更多详细信息,请在此处查看:

http://application-management.cioreview.com/whitepaper/testing-legacy-application-modernization-wid-529.html

于 2016-11-22T06:42:33.813 回答
0

如前所述,那里有一些非常好的书。强烈建议查看有效地使用旧代码。

您可以做的事情是遵循数据驱动的方法,观察您的应用程序并在您有更多“痛苦”的地方引入测试。一种您可能会发现有用的半确定性方法:https ://link.medium.com/zY9Tysfne9

于 2020-08-25T05:49:35.700 回答