08 | 代码现代化:你的代码可测吗?
你的代码可测吗?
- 深入了解
- 翻译
- 解释
- 总结
代码现代化的主要模式包括可测试化重构、安全重构和代码分层。作者强调了代码可测性对于遗留系统现代化的基本功,并提出了提取接缝模式和对象接缝、接口接缝两种接缝类型来改善代码可测试性。此外,文章介绍了新生和外覆两种模式,以及如何为复杂遗留代码添加测试。作者还探讨了测试的类型和组织,以及遗留系统中的测试策略。最后,强调了自动化测试的重要性。整体而言,本文提供了实用的代码现代化技术指导,对于开发人员在现代化遗留系统方面具有重要的参考价值。
《遗留系统现代化实战》,新⼈⾸单¥59
全部留言(15)
- 最新
- 精选
- 黄叶老师的课很棒,这里可以的话可以参考一下下面资料: 1.《重构2》3.8,关于霰弹式修改的问题 2.关于祖传代码:可以去这个网站看看,这是一个针对祖传代码的练习,看他是如何对祖传代码做重构的:https://linesh.gitbook.io/refactoring/xiang-jin-mei-gui/2-project-analyze 3.感觉老师的课,和TDD项目实战70讲很搭,可以结合看看
作者回复: 感谢分享。
2022-04-289 - aoe再分享一个测试 public class SplitUtil { public static final List<Long> toLongList(String str) { return Arrays.stream(StringUtils.split(str, ",")) .map(Long::parseLong) .collect(Collectors.toList()); } } class SplitUtilTest { @Test void to_long_list() { List<Long> list = SplitUtil.toLongList(""); assertThat(list).asList(); list = SplitUtil.toLongList("1"); assertThat(list.size() == 1).isTrue(); assertThat(list.contains(1L)).isTrue(); list = SplitUtil.toLongList("1,2"); assertThat(list.size() == 2).isTrue(); assertThat(list.contains(1L)).isTrue(); assertThat(list.contains(2L)).isTrue(); } }
作者回复: 感谢分享。 不过这里面一共测试了3个场景,应该把它们分解到三个不同的测试中,并用测试名称进行区分
2022-05-0521 - 2022老师,请教一下,如果是端到端的自动化测试,怎么保证结果的正确性呢? 比如,从UI修改配置后,下发到另外一个设备,有什么好的办法得到期望的结果?
作者回复: 涉及硬件的端到端测试,如果数据发送给了另一个设备,你可以看看该设备有没有接口可以获取这些数据,就能验证了;如果没有,测的时候就把设备隔离,分开测,系统这边的测试可以测数据被发给了一个设备(的mock),设备那边的测试去测接到什么样的数据之后会有什么样的变化。两个测试合起来就是一个端到端测试了(除了连通性没有测到)。
2022-04-281 - peter请教老师两个问题: Q1:数据比较,有开源工具吗? Q2:网站测试,有比较通用的自动化测试工具吗?
作者回复: 1. 我目前没有看到专门用于A/B测试的数据对比工具,即使有也不太能适配你自己的数据库,不如自己按项目需要开发一个 2. Cypress是目前比较流行的E2E测试工具
2022-04-271 - Geek_682837如果遇到需要mock的数据比较多,怎么比较方便构建mock数据,比如我需要mock一个List,可能有几十条数据的大小,自己mock的话就比较麻烦,如果直接访问数据库就可以比较方便拿到,但此时就依赖数据库了
作者回复: 如果是单元测试,不应该有需要mock这么多数据的场景,你可以具体说说看你的场景是什么样的。
2023-06-14归属地:广东 - 跫音老师,请教一个问题,将单个类的测试都放在同一个包中,将不同方法的测试放在单独的测试类里。这样会不会导致测试类以及包很多?目前我们都是一个类对应一个测试类
作者回复: 都可以,测试类和包多本身并不是问题
2023-04-12归属地:上海 - Geek_70dc13既然访问 db 的操作都是 mock ,那我如何保障 sql 那部分的正确性呢?看老师给的方案是集成测试。然而我一般使用的策略就是起 inmemory db,通过塞测试数据的方式,也会测 sql 那部分,缺点就是造数据和运行稍慢。 另外单元测试和集成测试的界限我可能并没有分的很清,单元测试是指每一层只测自己层的功能吗?比如:service 只测 service 的逻辑,mock掉 dao就是单元测试,不mock 掉dao也算是集成测试,还是说集成测试一定要构造 request 的方式
作者回复: 如果没有存储过程,那么用内存数据库是可以测试SQL语句的,一般的工具都做好了SQL方言的适配。但如果有存储过程,就只能访问真实数据库了。 集成测试是指需要和当前SUT的外部进行交互的,数据库和其他服务都算,因此直接访问数据库或其他服务的测试都属于集成测试;而只要没有访问这些外部的东西,在我看来都属于单元测试。当然,这一点很多人有不同观点,没必要纠结,重要的是把测试写出来。
2022-07-23归属地:河北 - 飞翔老师 有没有手把手教怎么创建决策表 还是不是很理解怎么创造出来的
作者回复: 根据原有代码的分支逻辑一步一步推导出来的
2022-07-08 - 飞翔老师 决策表里边throw error的测试 在原code中没有throw error的逻辑呀
作者回复: 好眼力,如果只是重构,可以不加throw error的测试,但这一部分其实是原有代码中缺失的逻辑,后面需要补上。
2022-07-08 - IanFaye老师,请问浏览器兼容性问题如何测试定位问题呢?
作者回复: 一般来说,前端的测试框架都是headless的,无法测试浏览器。可以用Selenium等工具编写E2E测试,并指定浏览器。但E2E测试跑起来很慢,又不能写太多,所以最好针对你觉得容易产生问题的点写少量测试。
2022-06-072