文档章节

软件开发中的形式主义--单元测试

loveczp
 loveczp
发布于 2013/09/25 12:30
字数 1393
阅读 55
收藏 0
点赞 0
评论 0

在我写下这个标题的时候我就知道就会被人丢板砖,但是没关系我一点都不怕,我知道挑战成见是一件吃力不讨好的事情,但我必须忠于自己的良心和思维

装逼第二弹单元测试

在许久以前,大家写完一段代码后都会在代码下面写一个main方法来调用一下刚刚写过的代码,然后检查刚刚写的代码正确与否。随着类和方法越来越多,这样的main方法也越来越多。这样会出现两个问题

  1. 测试代码和正常的逻辑代码混在一起,导致混乱

  2. 为了测试到所有的类,必须把每个类都手动执行一遍,比较费时费力

因此就有人发明的单元测试框架如大名鼎鼎的junit,有了它,我们的机械劳动就少了很多,我们的代码就清爽了很多。

-----------but  分割线----------

本来junit这种测试框架只是为了减轻我们的机械劳动,但是一些"技术大拿"们却把它用在了软件质量控制上面,他们规定代码的单元测试覆盖率必须达到某个比例,如果达不到就要批评,就认为软件质量不过关。他们的逻辑是,单元测试覆盖到的代码才能有质量保证,没有覆盖到的代码,正确性完全不可知。这样的尝试还是值得鼓励的,但是把单元测试覆盖率上升到一个严苛和非常重要的程度就有点迂腐和装逼了。

原因如下

1。单元覆盖低的代码并不一定质量低下。

测试代码的方法很多,单元测试只是其中一种而已,而且这还是只是局部测试方法而已。集成测试一样可以确保软件的正确性,而且集成测试对软件质量的保证的效率远远大于单元测试,通过的集成测试的软件基本就是一个功能上可用的软件,而经过单元测试的软件离软件可用还有很远的距离。

2。单元测试覆盖率根本不等同于代码单元的正确率

一个单元测试覆盖率很高的代码可能是非常垃圾的代码。看看下面的代码就可以看得出来。

//正常逻辑
      public Integer compute(List<Integer> nums) {
	return nums.get(0) + nums.get(1) + nums.get(2) + nums.get(3);
}


       //测试代码
      @Test
public void testCompute() {
	List<Integer> num = Arrays.asList(1, 2, 3, 4);
	assert ConsoleAction.compute(num) == 10;
}

 
 

上面的代码单元测试覆盖率是100%,但却是一段非常糟糕的代码,当list的size<4的时候,系统就会报越界错误


可以看得出来代码的质量和单元测试覆盖率是没有那么直接的关系。并且这种代码的质量和覆盖率的无关性会随技术官僚作风严重性或装逼的严重呈正比。因为当把单元测试覆盖率本身作为一个团队质量的衡量标准的时候,程序猿们就不会关心单元测试能不能测出bug,只会关心测试覆盖率能不能达到 100% ,于是最终出现的结果是团队之间比较的不是软件本身的质量,比较的只是一个覆盖率而已。

因此单元测试覆盖率只适合推广宣传鼓励,并不适合于强力执行。一旦强力执行他就会变味。


而且"技术大拿"们真的没有必要在单元测试覆盖率上死磕不放,因为真正的绝大多数的 bug都是在专门的测试阶段测试出来的,这个关把好了,软件质量不会有问题。


-------- 团队现状-----------

我经历过的好些个项目的单元测试都不是那么好,原因很明显写单元测试并不是一个轻松省力的活。测试DAO层要用专门的DBtest,还要用excel专门的构造测试数据集,测试service要用配置专门的bean的xml,远程接口还要专门的写mock。这些都是非常麻烦的事情。

更省力的办法的是,测试DAO时直接在测试数据离构造测试数据,然后触发dao,测试service的时候直接在test环境下触发并debug。虽然这种方法很土但很管用很快速。虽然这种方法在"技术大拿"们看来单元测试覆盖率为0,很不符合要求,但这其实是用另外一种方式完成了单元测试,保证的单元的正确性。

© 著作权归作者所有

共有 人打赏支持
loveczp

loveczp

粉丝 13
博文 11
码字总数 10294
作品 1
武汉
程序员
Python自动单元测试框架

简介: 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作。既然如此,为什么不让程序员...

晨曦之光
2012/03/02
1K
0
Python自动单元测试框架

简介: 软件的测试是一件非常乏味的事情,在测试别人编写的软件时尤其如此,程序员通常都只对编写代码感兴趣,而不喜欢文档编写和软件测试这类"没有创新"的工作。既然如此,为什么不让程序员...

长平狐
2013/01/06
33
0
打倒软件开发中的形式主义

OSChina配图 我认识很多人都声称在做敏捷开发,说自己是在钻研软件开发,等等。不幸的是,以我的经验,很显然,很多人口中是这么说,但未必真正的就这么做了。 形式主义,走过场,而不是真正...

oschina
2013/02/18
4.7K
34
单元测试入门

在我们Java软件开发过程中,相应的测试也在有序穿插的进行着;在软件公司中称之为单元测试,单元测试,顾名思义:就是对一个个小的独立的功能模块进行测试,我们常用的单元测试工具有很多种,...

阿狸的老大是悟空丶
2016/10/25
4
0
基于测试驱动的iOS开发

测试按照阶段划分为:单元测试、集成测试、系统测试和回归测试。单元测试是对软件组成单元进行测试,其目的是检验软件基本组成单位的正确性,其测试对象是软件设计的最小单位——模块。单元测...

HelloSwift
2016/08/09
13
0
表格驱动的单元测试技术(1)

【摘要】本文分析了传统单元测试技术的不足,提出了表格驱动的单元测试技术,新技术可以大幅降低单元测试的难度及综合成本,用户不需要编写测试代码,测试工作效率通常是现有技术的五倍以上。...

dellfox
2014/03/27
0
0
Apache Ant 1.9.4 发布,支持 Java 1.9

Apache Ant 1.9.4 发布,该版本引入对 Java 1.9 的支持,支持多线程运行 JUnit 单元测试,基于 JUnit 4 重构 Ant 自己的单元测试。 Apache Ant,是一个将软件编译、测试、部署等步骤联系在一起...

oschina
2014/05/07
4.1K
10
软件开发测试 7个无用的测试指标

软件开发测试 7个无用的测试指标 程序师2018-01-080 阅读 软件测试业界观察 软件测试度量是一种通过检测软件测试过程的质量和有效性来评估软件开发的量化方法。开发团队使用测试指标来跟踪开...

程序师
01/08
0
0
敏捷软件测试常见的七个误区

本文作者:伯乐在线 -ThoughtWorks 。未经作者许可,禁止转载! 欢迎加入伯乐在线专栏作者。 敏捷软件开发是从1990年代开始逐渐引起广泛关注的一种新型软件开发方法,是能够应对快速变化的需...

伯乐在线
2016/05/18
0
0
Mockito v2.9.0 发布,强大的 Mocking 测试框架

Mockito v2.9.0 已发布,Mockito 是一个用 Java 编写的,用于单元测试的 Mocking 框架。 Mockito 允许使用干净简单的 API 编写漂亮的测试,测试非常可读,且错误通知非常简洁。 在软件开发的...

王练
2017/09/01
605
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mysql导入导出包括函数或者存储过程

mysql导入导出包括函数或者存储过程 2012-11-16 10:12:20 0个评论 收藏 我要投稿 mysql导入导出包括函数或者存储过程 1.mysql导出整个数据库 mysqldump -h hostname -u username -p databas...

rootliu
3分钟前
0
0
Hyperledger Fabric 客户端开发一

前面介绍了hyperledger Fabric 安装, Chaincode的开发和运维, 现在来说说hyperledger fabric的客户端相关的开发。hyperledger 的客户端开发, 实际上指的是Chaincode的客户端开发。 同传统...

十一月不远
7分钟前
0
0
第18章 Linux集群架构

keepalived介绍 在这里使用keepalived来实现高可用集群,因为heartbeat在centos6上有一些问题,影响实验效果 heartbeat 切换的时候,会不是很及时——>比如:主 已经宕机了,但 从 却一直启动...

Linux学习笔记
8分钟前
0
0
awk常用的几条命令组合

前言 最近在生产上查问题,也是练就了一下awk的命令。 生产上的数据安全性要求比较高,一般要拿到测试环境都需要脱敏,但是脱敏的数据会有很多程序上的不适应。 所以有时候查询问题,查询一条...

码代码的小司机
9分钟前
0
0
python 多版本安装及切换

1.安装必要的扩展 # yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-de 2.下载python3.7源码 # wget https://www.python.org/ftp/python......

青-争
9分钟前
0
0
看看8年阿里架构师怎样讲述Dubbo和Spring Cloud微服务架构

微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。虽然微服务架构没有公认的技术标...

Java大蜗牛
9分钟前
0
0
CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
12分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
13分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
15分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部