写点什么

为什么很多互联网公司很少做单元测试?

  • 2023-06-26
    北京
  • 本文字数:2211 字

    阅读完需:约 7 分钟

软件单元测试分为狭义的单元测试和广义的单元测试。

前者是指对被测代码的各种函数、接口等进行测试,以验证它们的功能、性能和安全性。

后者是指对页面的每一个组件(如文本框、按钮等)进行测试,以验证它们的功能、性能和安全性,有时也被称为组件测试。

传统的软件开发方式是先写产品代码,再写测试代码,最后用测试代码来验证产品代码。

但是在敏捷方法中,特别是敏捷中的极限编程鼓励进行测试驱动开发,即先写测试代码,再写产品代码,最后对代码进行重构。

其好处是能够充分考虑程序需要处理的正常场景和异常场景,尽可能一次性地写出正确的产品代码,从而提高开发效率。


01

软件测试应该贯彻始终

在 DevOps 下鼓励软件测试贯彻始终,即软件测试的左移和右移。

针对单元测试,主要考虑软件测试的左移,由于在开发阶段修改缺陷的代价非常小,因此建议尽可能做到让大部分缺陷在单元测试阶段被发现。

测试左移是指代码静态和动态的自动化和手工测试,并且结合测试驱动开发让测试人员配合开发人员,尽可能保障产品的质量。测试右移是指在生产环境中进行软件测试,如全链路测试、混沌测试等。


02

软件测试金字塔

谈到软件测试金字塔,就不得不提到 Mike Cohn 版本的测试金字塔,如图 1 所示。



图 1  Mike Cohn 版本的软件测试金字塔模型

Mike Cohn 认为开发一个软件产品需要最多的是单元测试,其次是接口测试,最后是 UI(User Interface,界面)测试。

在软件测试金字塔模型中,越往上需要集成得越多,修复缺陷的速度越慢,消耗的成本越高;反之,越往下需要集成得越少,修复缺陷的速度越快,消耗的成本越低。

2009 年,在伦敦召开的 XP 日会议上,Google 发布了一份报告,报告指出:在单元测试阶段修复缺陷的成本为 5 美元,构建阶段修复缺陷的成本为 50 美元,集成测试阶段修复缺陷的成本为 500 美元,系统测试阶段修复缺陷的成本为 5000 美元。

根据 Mike Cohn 测试金字塔模型,Google 也提出了自己的测试金字塔模型,如图 2 所示。



图 2  Google 版本的软件测试金字塔模型

我们可以认为单元测试为小型测试,接口测试为中型测试,UI 测试为大型测试,可见 Mike Cohn 版本的软件测试金字塔模型与 Google 版本的本质上是一致的。

上面所述的软件测试主要是指自动化测试,而探索式测试也是不可被忽略的。据统计,基于接口和 UI 的自动化测试在回归测试中占有重要作用,而探索式测试对于发现产品新功能中的缺陷起着至关重要的作用。因此,在 Mike Cohn 软件测试金字塔模型上加上探索式测试,就形成了图 3 所示的改进版的软件测试金字塔模型。



图 3  Mike Cohn 改进版的软件测试金字塔模型

单元测试的缺点是减缓研发的速度,特别是在产品初期,这显然不符合互联网公司提出的“快鱼吃慢鱼”的思想,由此提出缩小单元测试的规模,扩大接口测试的规模,故形成了蜂巢形模型或纺锤形模型,如图 4 和图 5 所示。



图 4  蜂巢形模型



图 5  纺锤形模型


03

单元测试在传统开发模式中的地位

单元测试在传统开发模式中的地位,如图 6 所示。

在传统开发模式中,单元测试是验证编码的活动。



图 6  单元测试在传统开发模式中的地位


04

单元测试在敏捷开发模式中的地位

单元测试在敏捷开发模式中的地位,如图 7 所示。



图 7  单元测试在敏捷开发模式中的地位

单元测试属于支持团队的面向技术的测试。支持团队说明单元测试是在特性团队中进行的;面向技术表示单元测试的技术含量比业务含量要重。这里需要特别指出,单元测试不是不注重业务知识。

虽然在很多互联网公司,为了提高研发速度缩小了单元测试的规模,然而单元测试的优势和地位依然是不可被取代的!

本文节选自《软件单元测试》一书,若想了解更多软件测试相关知识,欢迎阅读本书!



本书第 1 章与第 2 章介绍软件单元测试的概念和基础知识。

  • 第 1 章简单介绍软件单元测试所包含的概念,包括桩对象和测试驱动函数、测试驱动开发、软件测试贯彻始终、软件测试金字塔、单元测试在传统/敏捷开发模式中的地位、精准测试、单元测试和白盒测试,以及单元测试的 FIRST 原则和 AIR 原则。

  • 第 2 章介绍软件单元测试基础知识,包括动态自动化/手工单元测试、静态自动化/手工单元测试。在动态自动化单元测试中介绍了语句覆盖、分支覆盖、条件覆盖、条件/分支覆盖、MC/DC、路径覆盖和控制流覆盖。

第 3 章到第 5 章介绍 C 语言、Java 语言和 Python 语言的单元测试框架。

  • 第 3 章介绍 C 语言动态自动化单元测试框架,包括在 Windows 下安装 C 语言运行环境、在 Windows 和 Linux 下安装编译 CUnit、查看测试报告、CUnit 介绍和案例。

  • 第 4 章介绍 Java 语言动态自动化单元测试框架,包括在 Eclipse 中创建 Maven 项目和配置 JUnit 与 TestNG 运行环境、JUnit 4 测试框架、JUnit 5 测试框架、TestNG 测试框架、测试替身、变异测试、利用 EvoSuite 自动生成测试用例,以及在 Jenkins 中配置 JUnit 4、JUnit 5、TestNG 和 Allure。

  • 第 5 章介绍 Python 语言动态自动化单元测试框架,包括 unittest、Pytest 及 Python 的模拟对象和变异测试工具 mutpy。

第 6 章与第 7 章介绍代码覆盖率工具和代码语法规范检查工具。

  • 第 6 章介绍代码覆盖率工具,包括 C 语言覆盖率工具 gcov 和 lcov、Java 语言覆盖率工具 JaCoCo,以及 Python 语言覆盖率工具 Coverage 和 pytest-cov。

  • 第 7 章介绍代码语法规范检查工具,包括 Java 语言静态分析工具 PMD、Python 语言静态分析工具 flake8 和 pylint,以及多代码语法规范检查平台 SonarQube。

  • 第 8 章通过两个案例详细介绍 TDD。

读者可以根据自己的需求对以上内容进行选择性阅读或者全部阅读。另外,为了巩固大家的学习效果,每一章结尾都有相应的习题。


软件单元测试二维码 (1).png


扫码了解本书详情!

限时五折优惠,扫码即购!

用户头像

还未添加个人签名 2019-10-21 加入

还未添加个人简介

评论

发布
暂无评论
为什么很多互联网公司很少做单元测试?_博文视点Broadview_InfoQ写作社区