首页 > 代码库 > 接触TDD以及Jasmine
接触TDD以及Jasmine
最近刚刚了解了一点TDD的思想,这里简单的介绍一下TDD到底是怎么回事,
TDD全称是测试驱动开发(Test-driven development),是先写失败的测试案例,然后在测试的保证下从简单到复杂将代码实现,然后再优化也就是重构代码。
我个人觉得先测试然后实现可以让我们的头脑更清晰,不会写无用的代码,而且在一步一步实现的过程中,更好的帮你去思考这个问题如果解决,不用先花大量的时间去想去设计这个算法到底应该怎么去写。这也可以当做是一个软件的开发流程,由简单到复杂知道开发完成。
我在学习TDD的时候使用的是jasmine,jasmine是js的一个测试框架,本文就主要讲解jasmine测试框架的基本使用。首先先来一个最简单的测试用例:
describe("calculate", function() { it("should be able to return the sum", function() { expect(calculate.count(2,3).toEqual(5);});
首先呢,jasmine测试函数就是以describe开头,接受两个参数,一个是字符串,一个是函数。字符串是用来描述你要测试的测试内容(这里就是要测试的是calculate类,下面有很多的方法,我这里只测试了计算两个数的和),函数就是你要测试的代码函数,里面的it函数也是接受两个参数,一个是字符串,一个是函数,字符串也是描述需要测试的单元内容,这里可以有多个it函数,expect就是期望值,当这个期望值为真的时候,测试就算是通过了。
expect里面提供了很多种方法,例如这里的toEqual就是判断两个对象是否相等,还有toBe , toBeDefined等等很多方法。再看一个简单的测试用例:
describe("示例", function() { var a; beforeEach(function() { a = 0; a += 1; }); afterEach(function(){ a = 0; }); it("测试", function() { expect(a).toEqual(1); });});
jasmine还提供了beforeEach和afterEach函数,按照字面上的意思来说的话,beforeEach是在describe里面的所有小测试(也就是it)之前执行(比如说你要在后面很多个的it里面使用某个实例,就可以在beforeEach里面写),而afterEach显然是其之后(测试完了需要干什么,就可以写在afterEach里面),事实的确如此。当然了,这两个不一定非得要写。再看一个简单的测试用例:
describe("guess_number",function(){ var answer; var game; beforeEach(function () { answer = new AnswerGenerator(); spyOn(answer,‘generate_random_number‘).and.returnValue(‘1234‘); game = new Guess(answer); }); it("guess right should be able to return 4A0B!", function () { expect(game.guess_answer(‘1234‘)).toEqual(true); }); });
这个是测试一个game类,用来判断输入的数字与随机生成的数字是否相等。这里我用了spyOn,我在学习这个的时候根据师兄们说的是这个可以使得你的函数是可控的,比如这里的随机数的生成,返回值是不可控的,就可以通过spyOn使得返回值可控。(白话文说就是assume某个变量或者函数是可控的),相应的有针对spy这个的测试的两个函数,toHaveBeenCalled用来测试你spy这个函数是否被调用了,toHaveBeenCalledWith用来测试调用时的参数,匹配的话返回true。例如:
expect(answer.generate_random_numbe).toHaveBeenCalled();
用来测试generate_random_number这个函数是否被调用了。
小节一下下:jasmine写测试的时候只要记住首先describe(分组),it(单个用例),expect(期望),什么匹配函数什么的,按照这个顺序就可以了,在使用的过程中一点一点深入。
接触TDD以及Jasmine