读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit
读书笔记-实用单元测试(英文版)
Pragmatic Unit Testing in C# with NUnit
Author: Andrew Hunt ,David Thomas with Matt Hargett
Chapter1: 介绍.
- 单元测试不是用户和管理人员使用的工具.而是程序员自己为自己写的,用于验证代码的工具.
- 单元测试提高了我们对自己输写的程序的信心.
- 单元测试可以证明程序是按照程序的意愿进行工作的.
- 单元测试可以让我们把更多的时间放在coding上,而不是debugging上.
- 新加入的测试与存在的测试一起运行,避免因需求变更对旧系统引入Bug.
- 单元测试可以先于产品代码,也可后于,推荐先于,这样可以避免过度设计和太多的重构.
- 因修改而引入bug,大多数情况下根本原因是不适当的耦合.
- 不写单元测试的理由都是站不住脚的.
- 遗留代码可以通过重构,一点一点到加入单元测试.
- 在你的项目中看到下面的情况,就是重新评估一下你的单元测试做的是否到位:
1)单元测试实际上成了集成测试,需要大量的setup和测试代码,需要很长时间来运行,引入的数据库,网络等资源.
2) 单元测试只测试了一种情况,缺少异常情况的测试,没有通过测试表达出代码的实际用途.
3) 单元测试是不可维护的,当单元测试失败时忽略或删除它,当Bug出现时,没有新的单元测试加入.
Chapter2: 第一次单元测试
- 在visual studio中”引用”的shortkey是ctrl+shift+B.
- 在测试代码中有特定的attribute修改测试类和测试方式,如[TextFixture],[Text]
- 异常情况的测试使用[ExpectedException]attribute.
Chapter3: 用NUnit写单元测试. (由于我不常用NUnit,这里就说的不多)
- 测试代码遵循如下过程:
1) 根据测试对象,设置需要的条件和资源等等,如set up
2) 调用被测试的方法.
3) 验证结果 eg:assert
4) 打扫战场:tear down.
- 一些常用的Assert用法.
- Assert新引入的新特性.
- 通过使用Category,组织测试策略,如[Category(“short”)], [Category(“long”)], [Category(“Fred”)].
Chapter4: 测试什么:RIGHT-BICEP
- 测试什么:
1) Right:所有测试结果都正确性吗?
2) Boundry:边界测试都正确吗?
3) Inverse: 是检查了相反关系.
4) Cross-check:是否使用其它方式测试结果.
5) Error:是否引入错误条件测试.
6) Performance:性能测试是否在意料之中.
- 可以在测试代码中引入其它的类或方法,以使用于重用.
- 对于运行时间稍长的单元测试,不必每次都执行.保证自动构建时运行即可(每天一次即可).
Chapter5:边界条件测试:CORRECT
- Conformance:一致性:与预期格式是否一致.
- Ordering:顺序性,
- Range:取值范围.
- Reference:引用,是否引用外部环境.
- Existence:对于参数来说,考虑参数传入为空时,函数是如何处理.
- Time:考虑时间上函数的执行顺利,并发性(多线程条件下).还有不同国家地区的时差.
Chapter6:使用MOCK
- MOCK对象其实就是真实对象在测试期间的代替对象.
- 使用MOCK的场景:
1) 真实对象有着不确定的行为.(有着不可预测的结果).
2) 真实对象很难创建,像需要文件系统,数据库或网络.
3) 真实对象有着很难触发的行为,如网络错误.
4) 真实对象响应很慢.
5) 真实对象有或是一个用户界面.
6) 测试需要了解真实对象是如何使用的,如测试需要确认调用了一个回调函数.
7) 真实对象还不存在.
- 使用MOCK对象,有三个关键的步骤:
1) 使用接口来描述对象的相关方法.
2) 用产品代码实现这个接口.
3) 在测试中使用MOCK实现这个接口.
- 多数情况下可以不用使用singleton.
- 有时通过简单的重构,我们可以不使用MOCK, 这样更加简单,高效.
Chapter7:一个好的测试的特点
- 一个好的测试,要满足以下特点(A-TRIP)
1) Automatic:自动化,测试可以自动执行,包括两方面: 执行测试和检查结果.
2) Thorough:彻底的,主要是代码的测试覆盖率.
3) Repeatable:可重复性.每一个测试都可重复执行.且产生同样的结果.
4) Independent:每一个测试都是独立的,不与其他测试耦合.与测试顺序无关.
5) Professional:职业的.测试代码与产品代码一样,需要保质保量.
- 可以借助如:Cruise Control或其他的持续构建和测试的工具完成测试自动化.
- 测试每一个测试都是有关注的,意思就是说,如果测试失败,则很容易定位错误发生的原因.
- 如果有失败的测试,那么需要考虑:同样的情况在其他地方一样会发生吗?
Chapter8:在项目中的测试.
- 推荐把测试代码与产品代码放在不同的程序集中.
- 存在以下代码的情况下,不要把代码check in:
1) 代码还没有完成
2) 代码没有编译
3) 代码已经编译了,代码对已存在的代码的编译,造成影响.
4) 代码没有相应的单元测试.
5) 代码有失败单元测试.
6) 代码通过了自己的测试,但是影响了其他模块的测试结果.
- 多少执行一次我们的单元测试呢,以下提供了一些意见:
1) 写了一个新的方法
2) 修正了一个bug
3) 每一次成功的编译
4) 每一次的成功check in
5) 持续集成时.
- 遗留代码的测试:
1) 在遗留代码中进行开发,新写的代码一定要写单元测试.
2) 对遗留代码,我们根据情况选择那个可测的代码进行单元测试.
3) 对于那些不容易测试的代码,我们要进行重构,我们要选取最容易出错的代码,最常使用的代码进行单元测试.
5, 测试代码也应该是代码评审的一部分.
Chapter9:设计问题
- 单元测试还可以帮助我们改进代码的架构设计:主要体现在以下方面
1) 更好的分离关注点:一个方法只做一个件事,更容易测试.
2) 定义类常量改进设计:尽量不要使用字符串进行判断.
3) 用测试驱动设计提高接口设计
4) 建立与本地化验证职责.
Chapter10:GUI测试
………………………………………….
读书笔记-实用单元测试(英文版) Pragmatic Unit Testing in C# with NUnit的更多相关文章
- 读书笔记-Coding faster(英文版)
读书笔记-Coding faster(英文版) Getting More Productive with Microsoft visual Studio Author: Zain Naboulsi S ...
- VS2010(2012)中使用Unit Testing进行单元测试
原文 VS2010(2012)中使用Unit Testing进行单元测试 使用VS 2012自带的Unit Testing工具进行单元测试是非常方便的.网上关于这方面的例子很多,这篇随笔只起个人学习笔 ...
- The Pragmatic Programmer 读书笔记之中的一个 DRY-Don’t Repeat Youself
The Pragmatic Programmer读书笔记之中的一个 DRY-Don't Repeat Youself 尽管自己买了非常多软件project方面的书,可是由于时间的问题.一直没有静 ...
- [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]
[易学易懂系列|rustlang语言|零基础|快速入门|(15)] 实用知识 Unit Testing单元测试 我们知道,在现代软件开发的过程中,单元测试对软件的质量极及重要. 今天我们来看看Rust ...
- Javascript单元测试Unit Testing之QUnit
body{ font: 16px/1.5em 微软雅黑,arial,verdana,helvetica,sans-serif; } QUnit是一个基于JQuery的单元测试Uni ...
- MVC Unit Testing学习笔记
MVC Unit Testing 参考文档: 1.http://www.asp.net/mvc/overview/testing 2.http://www.asp.net/mvc/tutorials/ ...
- 读书笔记-Software Testing(By Ron Patton)
Software Testing Part I:The Big Picture 1.Software Testing Background Bug's formal definition 1.The ...
- 学习笔记之Unit testing/Integration testing/dotnet test and xUnit
source code https://github.com/haotang923/dotnet/tree/master/src Unit testing C# code in .NET Core u ...
- 《如何在大学里脱颖而出(How to Win at College)》读书笔记
<如何在大学里脱颖而出(How to Win at College)>读书笔记 图书简介 中文版: 英文版: 作者卡尔·纽波特(Cal Newport)于 2004 年6月以优等生荣誉学会 ...
随机推荐
- LR实战之Discuz开源论坛——登录脚本
脚本业务流:访问Discuz论坛首页——登录论坛——退出论坛.本次使用LoadRunner11版本. 一.录制脚本注意 1.确保Discuz论坛能在服务器运行正常. 2.录制前先试访问Discuz论坛 ...
- ubuntu14.04下arm-linux-gcc 4.5.1的安装与配置
使用的是友善之臂mini6410自带光盘中的. 1.对新版本arm-linux-gcc-5.4.1进行解压(注意,下面的C是大写的) tar zxvf arm-linux-gcc-4.5.1-v6-v ...
- hibernate某些版本(4.3)下报错 NoSuchMethodError: javax.persistence.Table.indexes()
其实本来没啥大问题,但到网上查的时候发现了一些误人子弟的说法,所以还是记下来吧. 现象: hibernate从低版本升级到某一个版本时(我们是升到4.3.10)时,在程序启动时会报错: java.la ...
- Paxos算法深入分析
在分布式系统设计领域,Paxos可谓是最重要一致性的算法.Google的大牛们称 All working protocols for asynchronous consensus we have ...
- Android studio教程:[5]活动的生命周期
想要学好安卓开发,就必须理解安卓软件的生命周期,明白一个活动的创建.启动.停止.暂停.重启和销毁的过程,知道各个阶段会调用什么函数进行处理不同的情况,这里我就通过一个简单的例子让大家明白一个活动的生命 ...
- MVC布局页占位符@RenderSection("bscript", false)
@RenderSection("bscript", false) //false表示不是必须填充 填充bscript占位符 @section bscript{}
- C#操作AD的例子
一下连接中包含了使用c#对AD操作的各种列子 http://www.codeproject.com/Articles/18102/Howto-Almost-Everything-In-Active-D ...
- ENOVIA 基础
Part 零件 Part Master PM 如何表示零件:每当创建一个Part(给定一个Part Number),都回创建一个Part Master Part Master管理每个Part的最本质的 ...
- 从汇编看c++中指向成员变量的指针(一)
在c++中,指向类成员变量的指针存储的并不是该成员变量所在内存的地址,而仅仅是该成员变量在该类对象中相对于对象首地址的偏移量.因此,它必须绑定到某一个对象或者对象指针上面,这里的对象和对象指针,就相当 ...
- Mysql自定义变量的使用
用户自定义变量是一个容易被遗忘的MySQL特性,但是如果能用的好,发挥其潜力,在某些场景可以写出非常高效的查询语句.在查询中混合使用过程化和关系化逻辑的时候,自定义变量可能会非常有用.单纯的关系查询将 ...