【软件测试】单元测试路,生存各有道

在一个项目当中,开发者常常要做大量的测试工作,如单元测试,集成测试,回归测试,压力测试 .etc。当然,依据项目情况大小和开发者人员水平不同,测试涵盖的方面自然也是不一样的。一些测试需要相应的硬件和人力资源,一些需要专门的测试小组,另一些需要提供细致处理和长时间不间断运行的环境。

但是今天说的单元测试则不同,它是一种看起来十分廉价和基础的技术。它由后台程序开发人员创建运行,单机运行,刨除代码量以外,对一个完整的项目开发成本而言,所需的人力物力都是相对较小的。而长久以来的事实也已经证明,单元测试对于代码规范性和高效性,以及项目Bug的捕获和解决都有很大的帮助。大多数开发者其实了解这样的事实,只是因为一些内在和外在的因素(通常是不重视,时间紧和嫌麻烦),往往不愿意进行这些测试,或者只在项目快要结束时才想起来,只是已经为时已晚。

所以诸如TDD(测试驱动开发)的项目开发方式,都提倡一个核心道理:单元测试应该早做,多做,这样既避免了过度设计,对有效编码,项目依赖解耦也有好处。而且我们始终要明确,单元测试的第一受益者,永远是程序员。接下来,就让我们来看看单元测试的一些相关情况,之后再在.NET项目中实际运行单元测试吧。

单元测试总览

让我们根据3W+1H原则,先对单元测试有个系统性认识吧

一、 什么是单元测试

当我们在谈论单元测试的时候,我们在谈些什么。——村上春树

按照维基百科上的说法,单元测试(Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。在面向对象编程中,最小单元就是方法,包括基类、抽象类、或者派生类(子类)中的方法。按照通俗的理解,一个单元测试判断某个特定场条件下某个特定方法的行为,如斐波那契数列算法,冒泡排序算法。

单元测试将被测试应用程序细分为一个个足够小的基本单元,各个单元间相互独立,互不影响。开发者能通过单元测试,证明被测试函数的行为确实和开发者期望的一致。为了满足这个最基本的愿望,书写单元测试前,我们不用考虑太多关于性能上的事情,这是之后优化重构该做的事情。

二、 为什么使用单元测试

爱做单元测试的程序员,代码都不会太差。——古龙

上文说到,常常由于项目工期紧张,抑或是程序员自身原因的问题,团队往往在项目接近完成时才进行测试。这其实是非常不提倡的一种做法。就好像我们雇了一批人给我们造房子,从地基开始,造到十几层了,才用悬垂线来测房子倾斜度一样不靠谱(假如这个比喻靠谱的话)。到时候高层依赖底层,高层调试时发现bug,又得让我们返回底层查找问题,即便修改之后仍然通过了,但是想必很多朋友也遇到过项目代码覆盖度比较高,一改基础方法影响一大片的问题吧。

所以当我们从一开始就进行正确的单元测试时,这些问题都是可以解决的。以下罗列出了几个简单的作用,以供参考 

二.1 快速定位

单元测试最基本的一个功能,就是快速定位代码中的错误。从项目一开始,开发者便对所有的单元模块进行测试的话,除了能尽早发现问题,另一方面对我们项目的持续开发无疑也是提供了极大的保障。

二.2 文档记录

当我们设计出一个良好的单元测试环境,我们势必会对所有的基本单元进行测试,这时候,单元测试相对于为我们编写了一份api文档,我们随时可以查阅方法相关参数和返回值,以及运行情况。

二.3 适应变更

单元测试允许程序员在之后的开发工作中重构代码,并且确保单元依然工作正确。这个过程就是为所有函数和方法编写单元测试。在连续的单元测试环境中,只要设计出了良好的验证手段,单元测试可以延续用于准确反映当任何变更发生时可执行程序和代码的表现,帮助开发者优化代码逻辑和代码结构。

二.4 规范设计

进行单元测试时,开发者其实站在了一个观察调试的上帝角度。无论是开发先于测试,还是测试先于开发,单元测试都可以帮助我们将模块设计成易测试,易调试,易重构。在这个过程中,开发者的编码能力和对业务的理解能力也将得到锻炼

三、 开始时间   

早。——鲁迅

单元测试这东西,就跟戒烟一样。每个烟民都知道吸烟的坏处(bug),一开始吸烟的时候也会有人提醒你赶快戒烟吧,但是你往往并不在意,等到年限一长(项目开发迭代多次),因为吸烟身体出现的问题越来越严重,你可能在这之前做过几次体检(集成测试),但是依然于事无补了,等这时候再怀念当初戒烟,乃至不抽烟的好,也是为时已晚。所以单元测试,就该在项目一开始的时候进行测试,在你起了“编写单元测试太麻烦了,还是算了”的念头的时候就该开始。博主代码水平有限,无止尽的debug和bug提交已经耗费了我很大的精力,所以这才下定决心开始单元测试之旅。

确实不可否认,刚开始就编写单元测试常常要多花费几倍的代码量,但是随着项目进行,当你把基础方法都测试过以后,高层功能需要的代码量反而会大大减少。这时候单元测试也在往集成测试迁移,这是一个顺其自然的过程,同时为集成测试的简化也提供了极大的便利。

四、 有效进行

单元测试最终呈现出来的效果还是一个或多个测试方法而已,编写这些测试方法时,应该注意以下原则

Arrange 用于初始化一些被测试方法需要的参数或依赖的对象。

Act方法 用于调用被测方法进行测试。

Assert 用于验证测试方法是否按期望执行或者结果是否符合期望值

在这之前,我们当然需要区分出应用程序的每个基本单元,这里有个讨巧的方法,就是对项目依赖进行自底而上的遍历即可,我们并不需要多在意单元测试和集成测试的依赖关系。

其实在传统的DDD驱动开发中,我们已经见识了很多IAPPService和IRepository,以及IDomainService的依赖关系了,对于多个基本单元测试组装的集成测试,我们这里也统一当做同一种东西来对待了,毕竟我们关注的还是测试本身。所谓工欲善其事必先利其器,.NET 平台上强大的工具也是必不可少的,下文中将用XUnit和NSubstitute来进行所有的测试用例展示。

end

结尾送大家一些福利,软件测试大礼包,需要的老乡可以在评论区评论,我会在评论区送出

推荐阅读:

【软件测试】报bug是一门艺术,教你如何佛系的工作

【软件测试】福利篇-软件测试常见的面试题(附答案)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,368评论 25 707
  • 用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你...
    hw1212阅读 12,680评论 2 59
  • 文章来自:http://blog.csdn.net/mj813/article/details/52451355 ...
    好大一只鹏阅读 9,186评论 2 126
  • 测试现在被普遍认为“保证产品质量”这个笼统的说法下,而测试本身是什么呢?今天我们就测试本身跟大家一起讨论。 测试是...
    西边人阅读 4,567评论 2 52
  • 以前总是会想幸福的爱是天长地久的,长大才知道生活要面对那么多繁杂的小事,很多时候琐事带来的厌倦会让你怀疑是不是生活...
    旻临阅读 1,046评论 2 3