软件测试术语
断言
.断言是一个条件,它是必须被测试确认的一段代码的行为是否与期望相符,或换句话说是否与要求一致。
class Math1 {
public static pow (base: number, exponent: number) {
var result = base
for(var i = 1; i < exponent; i++) {
result = result * base
}
return result
}
}
该函数必须返回底数的指数幂
var actual = Math1.pow(3, 5)
var expected1 = 243
var asertion1 = (Math1.pow(base1, exponent1) === expected1)
底数没有被用作指数
var actual = Math1.pow(5, 3)
var expected2 = 125
var asertion2 = (Math1.pow(base2, exponent2) === expected2)
如果两个断言都合法,那代码就是满足需求的,并且我们知道他会预期那样工作
var isValidCode = (asertion1 && asertion2)
console.log(isValidCode)
测试规范
一个详细的清单,包含了需要测试的场景,这些场景将如何被测试,它们应该怎么被测试等。
测试用例
决定一个程序中的功能是否按照原始期望工作的一些条件。断言是一个条件,而测试是一组条件。
测试套件
一个测试套件是许多测试用例的集合。测试用例只是针对某一个具体的测试场景,一个测试套件可以包含多个测试用例来覆盖更多的测试场景。
测试监视
某些测试框架提供的功能。它允许我们包裹一个函数,并且记录它的送情况(输入,输出和被调用的次数)
替身
替身对象指测试执行时被传入但并没有实际用到的对象。
测试桩
桩(sub)是测试框架提供的一种功能。测试桩也允许包裹一个方法然后观察它的使用情况。和测试监视不一样的是,当使用测试桩包裹一个函数时,这个函数的功能会被新的行为替代。
模拟
模拟(mock)很容易和测试桩(sub)混淆。
他们之间有两个不同点,其中一个是测试结果的验证方式不同:一个是状态验证,一个是行为验证。另一个方面是测试与设计哲学完全不同:一个是传统型的,一个是测试驱动开发的mockist
- 测试桩为被测试的程序提供输入值,可让被测试程序能扮演另外的程序
- 模拟为测试提供输入来决定测试是否通过
测试覆盖率
测试覆盖率是指程序中有多大比例的代码通过自动化测试被测试到。
实战
Gulp
任务运行器——运行一些必要的任务来执行测试
npm install gulp -g
Karma
测试运行器,使用Karma自动执行测试。(可以在协作开发中被持续集成构建服务触发)
npm i --save-dev karma
npm i --save-dev karma-coverage
Istanbull
指出哪一行代码在自动化测试中被测试到的工具,它可以生成测试覆盖率报告。
一般建议,整个持续至少达到75%的测试覆盖率,而很多开源项目都达到百分之百的测试覆盖率。
Mocha
可以用来很方便创建测试套件、测试用例和测试规范。
npm i --save-dev mocha karma-mocha
Chai
一个支持测试驱动开发(TDD)和行为驱动开发(BDD)测试分割的断言库。Chai的主要目标是减少一个测试断言需要的工作量,并且使测试更可靠。
npm i --save-dev chai karma-chai
Sinon.js
提供一组API(测试监视、测试桩和测试模拟),可帮助我们独立地测试一个组件。独立地测试软件模块非常困难,因为通常模块之间有很高程度的耦合,但通过Sinon.js这种模拟框架就可以做到。
npm i --save-dev sinon karma-sinon
PhantomJS
无界面浏览器,可以通过命令行执行,非常容易与任务运行器和持续集成服务集成。
npm i --save-dev phantomjs
npm i --save-dev karma-phantomjs-launcher
Selenium和Nightwatch.js
Selenium是一个测试运行器,但是它被特别设计只运行叫做端对端(E2E)测试的特定测试。Nightwatch可用来做E2E测试,他将自动运行Selenium
Nightwatch.js是一个自动化测试框架,使用Node.js开发Web程序和网站,它使用了Selenium网络驱动测试API。它是一个完整的浏览器测试解决方案。
npm i --save-dev gulp-nightwatch
npm i selenium-standalone -g
selenium-standdalone install
测试计划和方法
测速驱动开发 TDD
基本步骤:
- 编写一个不通过的测试
- 运行这个测试,并保证它不通过
- 编写应用代码,让测试通过
- 运行这个测试,保证它通过
- 运行所有其他测试,保证程序的其他部分没有被破坏
- 重复以上步骤
TDD可以极大提高测试覆盖率,减少潜在的错误。
行为驱动开发 BDD
提取TDD的精华,重点是描述并且阐述测试应该关注程序的需求而非测试的需求。理想状态下,鼓励开发者少思考测试这件事,而更多地去思考整个程序。
测试计划和测试类型
测试计划是特定被测试区域内的测试规范的集合。其一个重要目标是定义、指出什么类型的测试对于程序的特定组件是合格的。
测试类型:
- 单元测试:测试独立的组件,如果组件不独立,可以设置测试模拟和依赖注入尽可能让他在测试中独立。
- 部分集成测试和整体集成测试:测试一组组件或者整个程序。
- 回归测试:来确认程序错误是否被修复
- 性能/加载测试:用来确认程序是否达到性能预期
- 端对端(E2E)测试:近似整体测试,区别在于E2E测试活动期间,我们会尝试完全模拟与正式用户一样的环境(使用Nightwatch.js 和selenium)
- 验收测试(UAT):被用来验证系统是否符合用户的所有需求
建立测试基础结构
使用Selenium和Nightwatch.js运行E2E测试
使用Mocha和Chai创建测试断言、规范和套件
BDD的测试风格,要在写实际代码之前就开始写测试