《遗留系统现代化》读书笔记(模式篇-代码现代化(一))

news2024/11/15 18:38:28

本文地址:http://t.csdn.cn/vS0Za

文章目录

    • 代码现代化:你的代码可测吗?
      • 你的代码可测吗?
      • 标题如何让代码变得可测?
      • 接缝的位置
      • 接缝的类型
      • 新生和外覆
      • 为代码添加测试
      • 决策表模式
      • 测试的类型和组织
      • 遗留系统中的测试策略

代码现代化:你的代码可测吗?

一个软件的自动化测试,可以从内部表达这个软件的质量,我们通常管它叫做内建质量(Build Quality In)。

你的代码可测吗?

不可测代码的类型:

  • 在方法中构造了不可测的对象。
  • 在方法中调用了不可测的静态方法

在测试中,我们通常把被测的元素(可能是组件、类、方法等)叫做 SUT(System Under Test),把 SUT 所依赖的组件叫做 DOC(Depended-on Component)。导致 SUT 无法测试的原因,通常都是 DOC 在当前的测试上下文中不可用。
DOC 不可用的原因通常有三种:

  1. 不能访问。比如 DOC 访问了数据库或其他需要部署的中间件、服务等,而本地环境没有这些组件,也很难部署这些组件。
  2. 不是当前测试期望的返回值。
  3. 执行这些 DOC 的方法会引发不想要的副作用。

标题如何让代码变得可测?

可以让 DOC 的行为发生改变的位置,叫做接缝(seam)。
把在 SUT 中创建接缝从而使 SUT 变得可测的方式,叫做提取接缝模式。

接缝的位置

通过构造函数注入进来
接缝也可以位于方法参数中
使用了依赖注入工具(比如 Spring),也可以给字段加 @Autowired 注解,这样接缝的位置就成了字段

接缝的类型

接缝的类型是指,通过什么样的方式来改变 DOC 的行为。
通过继承 DOC 来改变默认行为的接缝类型叫做对象接缝。
通过将 DOC 提取为接口,并用其他实现类来改变默认行为的接缝类型,就叫做接口接缝。

新生和外覆

代码隔离的四大类方法:

  • 新生方法 sprout method
    • 新生方法是可测的,你可以对它添加测试,以验证过滤逻辑的正确性。原来的方法虽然仍然不可测,但我们也没有让它变得更糟。
  • 新生类 sprout class
    • 接口、观察者、直接加功能类
  • 外覆方法 wrapper method
  • 外覆类 wrapper class
    • 代理、装饰、aop方式

为代码添加测试

测试替身(Test Double)
Mock 框架:Mockito

决策表模式

对于这种分支条件较多的代码,我们可以梳理需求文档(如果有的话)和代码,找出所有的路径,根据每个路径下各个字段的数据和最终的值,制定一张决策表。
这种决策表不但清晰地提供了所有测试用例,而且给出了相应的数据,你可以很轻松地基于它来构建整个方法的测试。

测试的类型和组织

Mike Cohn 在十几年前曾经提出过著名的“测试金字塔”理论,遗留系统很难应用测试金字塔。
请添加图片描述

  • 最顶层的 UI 测试是指从页面点击到数据库访问的端到端测试,用自动化的方式去模拟用户或测试人员的行为。
  • 中间这层的服务测试也是某种意义的端到端测试,但它避开了 UI 的复杂性,而是直接去测试 UI 会访问的 API。
  • 最底层的单元测试就是对某个方法的测试,平时开发同学写的大多是这方面的测试。

一种观点认为不管任何依赖都应该使用测试替身来代替;一种观点则认为只要 DOC 不访问数据库、不访问文件系统、不访问进程外的服务或中间件,就可以不用测试替身。前者的学名叫 solitary unit test,我管它叫“社恐症单元测试”;后者学名叫做 sociable unit test,我管它叫“交际花单元测试”。

遗留系统中的测试策略

遗留代码有很多特点,导致它们并不适合完全应用测试金字塔来组织测试。

  • 首先,遗留系统的很多业务逻辑位于数据库的存储过程或函数中,代码只是用来传递参数而已。
  • 其次,遗留系统的很多业务还位于前端页面中,位于 JSP、PHP、ASP 的标签之中。

对于前端中的业务逻辑,你可以先重构这些逻辑,将它们迁移到后端中,然后再编写单元测试或服务测试。这时的测试策略有点像一个钻石的形状。
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/805297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习笔记】Softmax 回归

本专栏是网易云课堂人工智能课程《神经网络与深度学习》的学习笔记,视频由网易云课堂与 deeplearning.ai 联合出品,主讲人是吴恩达 Andrew Ng 教授。感兴趣的网友可以观看网易云课堂的视频进行深入学习,视频的链接如下: 神经网络和…

QuantMania!《快乐机器学习》和《Python 从入门到入迷》作者,FRM,CAIA

王的机器主理人 王圣元 (FRM, CAIA) 某加密货币公司 Head of Quant 冬海集团 SeaMoney 建模负责人 八方咨询 量化总监 新加坡国立大学金融数学硕士 新加坡国立大学量化金融学士 《快乐机器学习》的作者 《Python 从入门到入迷》的作者 第一本书 《快乐机器学习》 第二本书《Pyt…

MySQL 8.0详细安装配置教程

一. 前言 MySQL是目前最为流行的开源数据库产品,是完全网络化跨平台的关系型数据库系统。它起初是由瑞典MySQLAB公司开发,后来被Oracle公司收购,目前属于Oracle公司。因为开源,所以任何人都能从官网免费下载MySQL软件&#xff0c…

【4】-多个User执行测试

目录 一个locustfile中有多个User 使用--class-picker指定执行 小结 一个locustfile中有多个User from locust import task, HttpUserclass User01(HttpUser):weight 3 # 权重host https://www.baidu.comtaskdef user_01_task(self):self.client.get(url/, nameuser_01_…

echarts柱状图每根柱子添加警戒值/阈值,分段警戒线

需求:柱状图每根柱子都添加单独的警戒值(黄色线部分),效果图如下: 实现方式我这有两种方案,如下介绍。 方案1:使用echarts的标线markLine实现(ps:此种方案有弊端&#x…

小程序通过ip+port+路径获取服务器中的图片

配置IIS 首先需要配置IIS。 打开控制面板,接下来的流程按下图所示。 安装好后,按“win”键,搜索IIS 选择一个ip地址,或手动填写,端口号按需更改 填写别名和物理路径,别名就是后续通过url访问物理…

初步了解预训练语言模型BERT

本文字数::4024字 预计阅读时间:12分钟 BERT是由Google提出的预训练语言模型,它基于transformer架构,被广泛应用于自然语言处理领域,是当前自然语言处理领域最流行的预训练模型之一。而了解BERT需要先了解注…

Mock-MOCO使用过程

一、jar包下载:https://github.com/dreamhead/moco 二、准备mock的json文件 data.json内容: ####GET请求 [{"description": "response使用Content-Type为charsetGBK编码格式来查看返回信息为中文的内容","request": {&q…

LeetCode101. 对称二叉树

101. 对称二叉树 一、题目 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示&am…

一百三十七、Hive——HQL运行报错(持续更新中)

一、timestamp字段与int字段相加 (一)场景 change_time字段是timestamp字段,代表一个红绿灯周期的开始时间(先是绿灯、再是黄灯、最后红灯),而green是int字段,代表绿灯的秒数,现在…

Linux常用基础命令-------你想要的我都有❀

文章目录❀ ❀ls命令 ❀cd命令 ❀pwd命令 ❀date命令 ❀创建、删除文件和目录命令 ❀alias命令 ❀复制、移动、重命名、查看(文件、目录)命令 ❀find查找、wc统计命令 ❀vi/vim命令 1、打开文件 2、工作模式 vi与vim的四个模式 进入编辑模式…

Verilog语法学习——LV2_异步复位的串联T触发器

LV2_异步复位的串联T触发器 题目来源于牛客网 [牛客网在线编程_Verilog篇_Verilog快速入门 (nowcoder.com)](https://www.nowcoder.com/exam/oj?page1&tabVerilog篇&topicId301) 题目 题目描述: 用verilog实现两个串联的异步复位的T触发器的逻辑&#x…

MacOS本地安装Hadoop3

金翅大鹏盖世英,展翅金鹏盖世雄。 穿云燕子锡今鸽,踏雪无痕花云平。 ---------------- 本文密钥:338 ----------------- 本文描述了在macbook pro的macos上安装hadoop3的过程,也可以作为在任何类linux平台上安装hadoop3借鉴。 …

传染病模型

title: 传染病模型 date: 2023-7-24 10:55:00 updated: 2023-7-24 10:55:00 tags: 算法数学建模传染病模型matlab categories: 数学建模 传染病模型中的符号表示 SI模型(艾滋传染模型) %% 直接求微分方程的解析解 dsolve(Dx1 -0.1 * x1 * x2 / 1000, D…

微服务契约测试框架Pact-Python实战

Pact是一个契约测试框架,有多种语言实现,本文以基于pact-python探究契约测试到底是什么?以及如何实现 官网:自述文件 |契约文档 (pact.io) 契约测试步骤 1、为消费者写一个单元测试,让它通过,并生成契约…

阿里Java开发手册~集合处理

1. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则: 1 ) 只要重写 equals ,就必须重写 hashCode 。 2 ) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断&#xff…

MySQL之深入InnoDB存储引擎——物理文件

文章目录 一、参数文件二、日志文件三、表结构定义文件四、InnoDB 存储引擎文件1、表空间文件2、重做日志文件 一、参数文件 当 MySQL 实例启动时,数据库会先去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数。在默认情况…

vue启动失败问题

解决办法情况1:确认自己是否进入了vuedemo项目的目录。 解决办法情况2:目录进入正确npm start错误,这时可以进入自己电脑的项目文件中去删除node_modules和package-lock.json,然后回到控制台npm i或npm install安装依赖&#xff0…

SAP ABAP 自定义表数据导入

一:效果展示: 读取 Excel 数据到 SAP 数据库表。 二:源码: *&---------------------------------------------------------------------* *& Report ZTEST_DRW02 *&----------------------------------------------------------…

Unity游戏源码分享-2.5D塔防类游戏

Unity游戏源码分享-2.5D塔防类游戏 项目地址: https://download.csdn.net/download/Highning0007/88118947