首页 > 代码库 > 简单了解测试驱动开发---单元测试

简单了解测试驱动开发---单元测试

  The idea is to begin development of a new software unit with its specification, followed by its implementation (which, by definition, must satisfy the specification). 测试驱动开发背后的理念是我们在开发之前定义一个标准(specification), 然后去实现它(implemention),当然实现要完全满足标准。

  举一个现实生活中的例子来了解一下测试驱动开发。我们可能都定制过衣服,在定制之前,我们都要测量各种尺寸,如身高,腰围等。然后服装公司就回去做衣服,衣服制作完成后, 我们都会试穿, 如果合身就ok, 如果不合身,服装分司还要重新去做。

  在整个定做衣服的过程中有三个步骤:

  1,各种尺寸的测量,这就是双方事先定义好的标准,因为我们就是用这些标准去验收,服装公司利用这些标准去制作,它就是一个specification

  2,  服装公司去制作,这就是实现(implemention). 服装公司怎么做,我们是不需要关心的,所以可以用任意方式实现标准。

  3, 试穿: 就是测试,用我们定义的specification 去测试implemention.

  对于测试驱动的开发,我们也是遵循同样的流程。在开发任何功能单元之前,我们都要定义一个标准(specification),就是这个功能单元要实现什么样的功能,输入什么,输出什么。然后,我们写程序去实现(implemention)。程序写完后,我们用事先定义好的标准去测试。

  在软件开发中,specification 通常是一个函数,它就是用来描述我们的功能单元应该实现什么样的预期功能。这些测试的函数又叫单元测试。

  我们写一个hello world 程序来体验一下测试驱动开发,通常做测试都是用框架,这里选用Jasmine. 我们创建一个文件夹jasmine-test,然后在里面新建两个文件夹,一个是spec, 写我们的单元测试,一个是src,写我们的源代码,就是implemention. 在spec文件夹下,写一个greetSpec.js 测试我们的greet函数。

//我们想要测试哪个功能单元(比如函数),就要哪个函数引进来。
let greet = require(../src/greet);

/*
describe 就是对这个函数功能进行描述,所以它接受的第一个参数是引进来的函数名,描述放到它的回调函数中,
因为函数的调用有很多情况,比如有参数调用或无参数调用两种情况,所以我们的测试都要覆盖到。
每一种情况都是一个it, 也就是每一个it覆盖一种情况。所以它的第一个参数就是对情况的描述,
第二个参数,回调函数就是对这种情况进行测试的预期结果。

*/

// 看一下回调函数的写法:expect意思是期望,它接受一个函数的调用,就是我们要测试的函数,
// 我们期望函数调用时返回值是Hello sam, 当我们真正写函数的时候,如果用greet(‘sam)的时候,
// 返回Hello sam 表示测试通过。
describe(greet, function(){
    
    it(should greet the given name, function(){
        expect(greet(sam)).toEqual(Hello sam)
    })

    it(should greet no-one special if no name is given, function(){
        expect(greet()).toEqual(Hello world)
    })
})

  用jasmine写一个单元测试,首先是要引进我们要测试的单元,其次是调用descripe 函数写一个测试集,把所有可能要测试的情况写到它的回调函数中。最后是每一种情况都放到一个it函数中进行封装,it函数中就是调用expect, 对函数运行结果和期望结果进行对比,做一个断言来判断相等关系。这每一种情况就是一个测试用例。

  写完了测试,就要运行这个测试,这时要用到jasmime-node,  我们项目也就变成了一个node项目。node项目都要有一个package.json文件,来记录我们的开发依赖等。在node根目录文件夹中,打开cmd命令窗口,npm init -y 快速创建package.json文件。再npm install jasmine-node --save-dev 安装jasmine-node, 然后再在scripts 中写上 

"test": "jasmine-node spec/greetSpec.js",   整个package.json如下:
{
  "name": "jasmine-test",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "jasmine-node spec/greetSpec.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "jasmine-node": "^1.14.5"
  }
}

  现在我们在命令行中输入npm run test, 就可以直接测试了。

技术分享

  可以直接看到测试结果, F表示faiures, 表示测试失败,最后的测试结果都以红色标出。测试失败很正常,因为我们就没有写greet.js函数。现在写一个greet 函数,注意,它并不支持es6 的module 规范, 只能应用commonJs 规范

let greet = function(name = "world") {
    return "Hello " + name
}
module.exports = greet;

  这时再运行npm run test, 可以看到如下结果,表明测试成功,成功后用绿色表示。

技术分享

 

简单了解测试驱动开发---单元测试