其他分享
首页 > 其他分享> > 专业人士的测试习惯(单元、验收测试、测试驱动开发)————《The Clean Coder—A Code of Conduct for Professional Programmers》心得

专业人士的测试习惯(单元、验收测试、测试驱动开发)————《The Clean Coder—A Code of Conduct for Professional Programmers》心得

作者:互联网

文章目录

0 背景

测试能提高开发效率和质量,并且能显著降低bug的产生。此篇为《代码整洁之道——程序员的职业素养》的第四篇读书心得,主要讲的是良好的测试习惯和方法,可以用于让我们有意培养自己的测试习惯。

1 测试驱动开发(TDD)

测试驱动开发已经发展十余年,经过历史的验证,已证实TDD确实可以缩短编码周期,提高开发效率,有利于获取极高覆盖率的自动化单元测试。

1. 1 三项法则

解释:例如

1.2 优势

1.2.1 确定性

如果TDD是一行行业的纪律,(就如同手术前医生要洗手一样),那么每天要写上几十个测试,每周要写上成百上千个测试。

在任何时刻,有任何代码修改,都必须运行一下手头的全部测试代码,来确保修改没有破坏任何东西。

1.2.2 缺陷注入率

Maximiliem、George2003、Janzen2005,Nagappan2008等不少报告研究都称TDD可以显著降低缺陷,如下降到原来的1/2、1/5甚至是1/10。

1.2.3 勇气

拥有一套TDD,就相当于拥有一套值得信赖的测试。让你在修改代码的时候,随时知道自己是否破坏了代码,以便自己及时的修改调整,从而让自己可以放手去整理代码。

这样可以让自己的代码变得具有可塑性、更易于理解、修改、扩展,代码整洁了,缺陷也就更少了。

1.2.4 文档

当我们使用第三方合作伙伴的框架时,合作伙伴通常会发一份由文档工程师编写的十分漂亮的手册。作为程序员,也许文档配图很精美,但是我们要想知道如何使用代码,首先应该看的是代码示例,因为代码不会撒谎,

遵循TDD三法则编写的每个单元测试都是一个示例,用代码描述系统的用法。
单元测试可以清楚的描述

即单元测试就是文档,它描述了系统设计最底层的设计细节,对于读者来说是最好的底层文档。

1.2.5 设计

因为要先写测试,但是测试的代码却未诞生。这就会强迫我们写出可以单独测试的产品代码(对于一个函数调用了其他函数,为了编写测试,我们就必须找到这个函数的解耦合的方法),从而让我们去考虑什么是好的设计。另外如果先写测试,再写产品代码,可以让我们在测试的深度和捕获错误的灵敏度方面大于先写产品代码再写测试,(因为此时已经知道问题如何让解决,形成可思维定势)

1.2.6 总结

TDD可以提升代码的确定性、给程序员勇气、降低代码的缺陷、优化文档和设计的原则。

1.3 缺点

TDD并不是万能的,如果遵循三项法则写出的测试代码就很糟糕,并且弊大于利,那就不应当选择它。

2 验收测试(沟通、澄清、精确化)

此处的定义为:业务方和开发方合作编写的测试来确定需求是否已经完成。(完成:所有代码写完,所有测试通过,QA和需求方已经认可。)

交流细节是很麻烦的事,往往可能双方都取得了共识,然后带着截然不同的想法离开,这种情况很平常。而编写自动化验收测试足够正式、清晰且结果具有权威性。

2.1 常见问题

专业开发人员(包括业务方)必须确定项目中没有任何不确定性。

2.2 流程

2.2.1 自动化

考虑成本,验收测试都应当自动进行。(软件开发周期中有时需求手动测试)而且自动化测试还可以避免开发者误入歧途和节约时间。

2.2.2 谁来写

谁:

职责:
业务分析员:测试“正确路径”————功能是否有业务价值
QA:测试“错误路径”————边界条件、异常、例外情况
开发人员:

2.2.3 什么时候写

遵循“推迟精细化”原则:

敏捷开发中:只有在选定下一轮或者冲刺所需要的功能之后才编写测试。

2.3 误解

验收测试不是单元测试。

单元测试:

验收测试:

2.4 GUI测试

因为美是主观的,往往GUI会不断变化。要测试GUI就要遵循“单一责任原则”(SRP),把不同原因而变化的元素分开,把根据同一原因变化的元素归类分组。

比较好的方法是

2.5 持续集成

务必确保持续集成测试中,单元测试和验收测试每天都能运行好几次。整套测试集成系统应该由源代码管理系统触发,只要有人提交,就开始构建,然后运行所有测试,测试结果会用电子邮件发给团队所有人。

当集成失败了,就应该“立即”停下手里的活,看看如何让测试通过。(如果不严肃对待测试花,就会造成失败的测试被抽离构建系统,从而导致bug产生)

3 测试策略

3.1 QA

3.2 自动化测试金字塔

名称占比
人工探索测试5%
系统测试10% GUI
集成测试20% API
组件测试50% APi
单元测试100% XUnit

3.2.1 单元测试

3.2.2 组件测试

3.2.3 集成测试

3.3.3 系统测试

3.3.4 人工介入

4 总结

开发团队应该要和QA紧密协作,创建由单元测试、组件测试、集成测试、系统测试和探索性测试构成的测试体系,并尽可能频繁的运行这些测试,得到反馈并修改。

标签:Coder,Code,1.2,系统,代码,单元测试,QA,测试
来源: https://blog.csdn.net/qq_33375598/article/details/112505342