【问题标题】:Tips for testing data intensive legacy application测试数据密集型遗留应用程序的技巧
【发布时间】:2010-11-04 03:34:48
【问题描述】:

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

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

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

【问题讨论】:

    标签: unit-testing legacy


    【解决方案1】:

    获取 Michael Feathers 的 Working Effectively with Legacy Code 的副本。对于处理大型、未经测试的代码库,它充满了有用的建议。

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

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

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

    要避免的事情:

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

    【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-12
        • 2016-08-27
        • 1970-01-01
        • 2010-09-22
        • 2020-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多