终于等到了2020年的第一次研发分享,本次分享的主题是自动化测试,也就是大家常提到的单元测试。

我们为什么需要自动化测试

自动化测试的目标是什么

自动化测试是为了帮助我们将写好的代码以自动的方式进行功能检查,以确保现有的改动不影响已有的功能,多次的改动对已经完成的功能没有影响,它能够帮助我们有效避免和改善以下情况:

  1. 修改代码未考虑完善对已有代码的影响
  2. 新功能的考虑周全(IPO编程:INPUT、PROCESS、OUTPUT)
  3. 减少大量重复的手动测试代码劳动
  4. 减少代码总体缺陷
  5. 改善开发团队内部伙伴关系
  6. 提高问题出现后的响应效率
  7. 降低回归的成本、提高回归的效率、覆盖率以及稳定性

如果没有自动化测试情况是什么样的

  1. 黑盒测试回归效率低
  2. 手动测试的偶然性和不确定性
  3. 回归覆盖率不足
  4. 交付的产品质量无法保证,全靠评估
  5. 系统越复杂,问题越多
  6. 上线时间长、构建失败率高导致的蝴蝶效应🦋(迭代过快、加班多)

自动测试的不足

  1. 无法减少成本投入,而是为了加快测试结果反馈,提升测试质量
  2. 自动化适用于回归和冒烟,而不是发现BUG
  3. 不是所有的系统都适合做自动化测试

自动化测试的分类

  • 单元测试:针对函数或者模块所进行的测试
  • 集成测试:针对整体产品的某个功能所进行的测试
  • 端对端测试:从用户界面直达数据库的全链路测试

测试框架

首先自动化测试可以脱离开代码本身的语言,并不是用什么语言写的功能代码就必须用什么语言才能进行测试。当然业界实践中一般自动化测试一般由开发功能的工程师自己写,所以能够使用统一的语言去构建测试那么是一种好的实践,但并非不可违背。

  • Java:

    • JUnit,Java语言的单元测试框架,多数Java的开发环境都已经集成了JUnit作为单元测试的工具
    • testNG,涵盖了整个核心的JUnit4功能,但引入了一些新的功能,使其功能更强大,使用更方便,支持多线程测试
  • Python:

    • Robot,Python测试框架,Python最重要的测试框架之一
    • Pytest,适用于多种软件测试,经常被QA团队、开发团队、个人团队、开源团队使用
    • UnitTest/PyUnit,受到JUnit启发的测试框架
    • Behave,行为驱动开发(behavior-driven development,BDD)的代表,一种在敏捷开发思想指导方法下产生的测试框架
    • Lettuce,另一种基于Cucumber和Python的行为驱动类自动化工具
  • PHP

    • PHPUnit,借鉴与JUnit的测试框架,很长一段时间内文档不多,作者说完全Copy自JUnit,所以看JUnit的文档就可以了
    • Codeception,编写单元测试,也能够编写功能测试和验收测试
    • Behat,行为驱动PHP测试框架
    • Selenium,一个复杂的自动化测试框架

自动测试框架分类图

PHPUnit版本

PHPUnit的9版本刚刚发布

CI流程将自动化测试纳入开发流程

快速迭代流程

互联网软件的优势就是发布迅速,迭代快速,BUG可以被迅速修复,新功能可以快速交付给用户。而开发和发布互联网软件已经在行业内形成了一套行之有效的方法,那就是持续集成(Continuous integration,简称CI)

Jenkins、Travis、gitlab-CI都是优秀的CI工具。

流程:提交代码-测试(第一轮)-构建-测试(第二轮)-部署

持续交付和持续部署的区别

测试覆盖率

测试覆盖率是评估测试是否OK的一个指标

phpunit --coverage-html ./tests/codeCoverage 命令会生成一个html格式的测试文档