Written by - kok-s0s
测试是一项技能,虽然这可能会让一些人感到惊讶,但这是一个事实。--- Mark Fewster and Dorothy Graham,《自动化软件测试》,1999W
POUT - Plain Old Unit Testing 普通的单元测试
TDD - Test-Driven Development 测试驱动开发
因软件出错而导致的事故:
1962:NASA 的水手一号
1986:THERAC-25 医用加速器灾难
AT&T 电话网络的崩溃事故
在复杂的系统,软件的质量是没有任何商量余地的,完全没有商量余地!
没有测试的「 重构 」不能称之为重构,它仅仅只是到处移动垃圾代码。--- Corey Haines(@coreyhaines),December 20,2013,on Twitter
C++ 单元测试框架:
CppUnit
Boost.Test
CUTE
Google Test
QA - Quality Assurance 质量保证
我以前说过这个问题,现在我再说一遍,尽管你的公司可能有一个单独的 QA 小组来测试软件,但开发组的目标应该是 QA 没有发现任何缺陷。--- Robert C.Martin,《The Clean Coder》
交付 100% 无缺陷的软件是一个很难达到的目标。
QA 是安全体系的第二道防线。
高质量地要求产品代码,同样高质量地要求单元测试的代码。
理论上,产品代码和测试代码之间不应该有任何区别 --- 它们生而平等。
单元测试的前置条件,也就是执行单元测试之前的 SUT 的状态。
被单元测试测试的部分,通常是被测试的过程、函数或方法(API)的名称。
单元测试预期的测试结果。
每个单元测试和其它的单元测试都必须是独立的。
限制一个单元测试只使用一个断言。(有争议,开发者按实际情况自行判断)
在运行所有单元测试时,每个单元测试都必须是应用程序的一个独立的可运行的实例,每个单元测试都必须完全自行设置和初始化其所需的环境,这同样适用于执行单元测试后的清理工作。
这些函数太简单了,无需考虑测试。
不过还是看实际情况的。
不使用那些没有自己的单元测试和质量可疑的库或框架,是一种明智的架构选择。
无视这些,只测试自己的代码,而不是别人的代码。
我对这个问题的第一个也是最重要的建议是:能不使用数据库进行单元测试,就不使用数据库进行单元测试。--- Gerard Meszaros,xUnit Patterns
模拟数据库,只在内存中执行所有的单元测试。
如果系统中存在数据库的使用,在系统集成和系统测试级别会测试数据库。
不要混淆测试代码和产品代码
测试必须快速执行
测试替身