测试驱动开发

测试驱动开发(Test-Driven Development)是一种不同于传统软件开发流程的新型开发方法,它将具体实现的功能进行模块划分,实现不同模块之间的零交集,并且各个模块实现的功能先编写测试代码,然后编写使测试通过的功能代码,实现测试驱动功能的开发。使用测试驱动开发(简称TDD)有助于编写简洁可用和高质量的代码,有很高的灵活性和健壮性,能快速响应变化,查找错误源,并加速开发过程。

下面我主要就我做的一个猜数字的小游戏来分析如何进行测试驱动开发。

首先获得测试驱动开发的脚手架,网址:http://jasmine.github.io/2.0/introduction.html

一、测试的基本模块介绍

测试的工程项目主要有两个文件夹要注意spec、src,spec文件夹里的js文件里编写测试用例,一般命名规则...Spec.js,文件主要内容:

describe("Contrast_number", function () {

    beforeEach(function () {

    });
    afterEach(function () {

    });

    it("should be able to match none and there is no  same word in the different location", function () {
        var contrast_result=contrast([1,2,3,4],[5,6,7,8]);
        expect(contrast_result).toBe("0A0B");
    });

});

describe里定义了的测试的描述Contrast_number,也就是这个js的中心是Contrast_number,参数里定义了要执行的方法。

beforEach是在执行测试代码之前先执行的,一般函数里写数据的初始化函数。

afterEach是在执行完测试后执行的,一般写数据清空的方法调用函数。

每个it代表一个测试,第一个参数写该测试的描述,第二个参数执行测试方法,一般是执行了功能函数后返回可用于测试的结果,使用expect来写自己期望执行功能函数获得的返回值能够得到什么。

这样一个测试就完成了,然后在相应的src文件的js文件里写功能方法,这个步骤就体现了先写测试后写功能实现方法这个特点。

二、猜数字游戏为例

1、整个测试驱动开发与项目结合的步骤如下

1)分析功能,划分模块

这里猜数字游戏主要有三大块:

电脑随机数与竞猜者输入数的对比,返回对比结果(以 *A*B的形式返回,A代表位置、值都相同,B代表值相同,位置不同);

获得电脑随机数;

竞猜次数不能超过6次的判断;

这三个模块在进行测试时方法要没有交集,这点非常重要,因为我当时就将模块方法之间进行了交叉使用,使得逻辑出现交叠,这样对于测试是非常不好的,因为它没有办法精确定位错误方法。

2)分别编写三个模块的测试

这里要尽可能把测试可能出现的情况想全了,比如数字对比可能出现的集中结果;猜数字游戏如果次数用完了没猜对,或次数不大于6次且猜数字成功,或次数不大于6次,而且还没成功。还有就是随机数的重复判断等。分别编写it里的函数

3)具体功能方法的编写

由于是分模块的所以不同模块的功能实现要写到不同的js文件里面,而各个模块方法的调用,以及模块之间的调用要建一个专门的js文件放这些逻辑方法。

这样就可以通过测试不断地改功能方法直到测试通过。

测试通过后,要进行代码的重构,简化,写功能方法时,边重构边写也可以。

4)实际开发项目前台设计

功能方法测试通过后,只需将建的这几个测试方法、功能方法及其相关文件复制到自己的工程项目下,然后编写界面,编写controller,controller里就可以直接调用已通过测试的功能方法。

这样一个测试驱动开发的项目就基本完成了。

2、功能代码实现

在整个项目中,一个重难点是获得随机数并判断重复,还有就是对比结果

1)获得随机数

 

var no = parseInt(10*Math.random());

 我这里使用Math.random()获得[0,1)的随机数,然后乘以10,换算到[0,10)之间的随机数,使用parseInt取整,得到[0,10)之间的整数。

2)随机数重复判断

我将每个随机数存到一个数组里,再获得的遍历数组进行判断是否重复,如果重复,就再重新获得一个no,如果不重复,然后存进数组里接着获取下一个。这里使用_.filter来判断

 

var is_repeat=_.filter(random,function(num){
        return num==no;
    });

3)猜数字比较函数

 

function contrast(Random_number,input_number){
    var a=0;
    var b=0;
    for(var i=0;i<Random_number.length;i++){
        if(Random_number[i]==input_number[i]){
            a++;
        }
    }
    c =_.difference(Random_number,input_number.length;
    b=4-a-c;
    var result= a.toString()+"A"+ b.toString()+"B";
    return result;
}

 使用测试驱动开发,使得逻辑思维从传统开发方法中转换过来,先测试后实现功能,模块划分清晰明了,逻辑明确,易于纠错,灵活调用。总的感觉就是测试驱动开发,让我的开发逻辑变得更加清晰!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值