`

TDD测试驱动开发

阅读更多

      TDD是Test Driven Development的简称,意为测试驱动开发。测试驱动开发是一种软件的开发方法。它指在编写某个功能的代码之前先编写测试代码,然后编写能使测试通过的功能代码,逐个测试来实现软件的开发。测试驱动开发有助于提高代码质量和开发进度。

测试驱动开发一般步骤:

1.新增一个测试

2.运行所有测试,发现新增测试不能通过

3.做一些小改动,让程序可以运行

4.运行所有测试,并且全部通过

5.重构代码

      我做的练习是一个测试一个四位随机数的例子(开发工具rubymine)

      要求:产生一个四位数;每位必须是数字;第一个(或千位)数字不能是0;四位数的每位数字不能相同

首先根据要求写测试程序,下面是测试程序的基本模版:

 

describe("number", function () {

    beforeEach(function () {
    });

    afterEach(function(){
    })

    it("should be four length ", function () {
    });

 describe后面的number是对本页测试的一个总的描述。

 

beforeEach(function ( ) {})是对本页测试的一个初始化,只要加载过这个页面,他就会执行。

而afterEach(function (){ })是本页面的所有测试程序执行完后进行的操作,若涉及到相关的存储事件,一般添加 :

localStorage.clear();

 意为清空本页涉及存储的所有数据,包括beforeEach(function ( ) {})执行过的初始化数据

 

上述测试程序我存储的文件名是number_spec.js。若要加载此页需要在SpecRunner.html中引入。下面是引入的格式:

 

<script type="text/javascript" src="spec/number_spec.js"></script>

 

 

根据我做的练习,下面是一部分例子:

 

 it("should be four length ", function () {
        var number = creat_a_number().toString()

        expect(number.length).toEqual(4);
    });

 这个是测试是关于所要求的数字是否是四位的。create_a_number( )是功能函数中的一个产生随机数的方法,在此处代表产生的随机数,而

 

 

create_a_number( ).toString()

 将这个随机数转化为字符串形式,这样就可以根据字符串的长度来测试这个数是不是四位的。

 

 

expect(number.length).toEqual(4);

 expect括号中的内容代表要测试的内容,toEqual括号中的内容表示要测试内容的结果,如果不一致则SpecRunner.html中就会报错

 

 

 

下面是判断生成的内容是否是数字:

 

it("should be a number", function () {
        var number = creat_a_number();

        expect(isNaN(number) == 0).toEqual(true);
    });

 这个测试用到了isNaN方法,用来判断是否全是数字,用的“==”,所以如果是数字则返回值是“true”

 

 

 

下面是判断这个随机数是否是随机产生的,其方法就是测试产生的随机数中的某个数的概率,设计离散数学相关思想。

 

it("should be randomly producing", function () {
        var numbers = [];
        for(var i = 0; i < 1000; i++){
            var number = creat_a_number();
            numbers.push(number);
            localStorage.numbers = JSON.stringify(numbers);
        }
        var same_number =  _.filter(numbers,function(number){
            return numbers[0] == number;
        })
        var Probability =  same_number.length/numbers.length;
        expect(Probability>=0.001 && Probability<0.005).toEqual(true);
    });

 通过for循环产生一千个随机数,然后存储一下,此前我并没有存储,而是调用产生随机数的方法返回值,但那样容易导致电脑卡死,所以我就存储了一下,这样在 afterEach(function(){})就加上localStorage.clear(),结束本页测试后来清除这些数据。

 

 

var Probability =  same_number.length/numbers.length;

 先找到所产生的一千个随机数中的某一个,再找与这个随机数相等的存数在same_number数组中。通过上面两个数组的长度比来对比随机数的产生概率,下面的expect用到这个概率,给出这个概率的范围Probability>=0.001 && Probability<0.005(不要写成0.001<=Probability<0.005),只要这个概率在此范围就通过测试。概率范围自己设定。

 

 

此前我将产生一千个随机数及上面将数字转化为字符串和判断数字的方法均写到的功能函数中,这样就不符合测试驱动开发的思想了,也可以将这些方法写到一个专门的测试函数中

 

 

下面是有关随机数的功能方法内容,这是我写的一个产生所需要求的方法:

 

function creat_a_number(){
    var one = Math.floor(Math.random()*9+1);
    var two = Math.floor(Math.random()*9+0);
    var three = Math.floor(Math.random()*9+0);
    var four = Math.floor(Math.random()*9+0);
    if(!(one!=two&&one!=three&&one!=four&&two!=three&&two!=four&&three!=four)){
        return creat_a_number ();
    }
    var number = one*1000+two*100+three*10+four*1;
    localStorage.current_number = number;
    return number;
}

 Math.floor(Math.random()*9+1)是产生一个1到9的随机数的方法,若是产生0到9就是Math.floor(Math.random()*9+0)。

 

 

我后面要做的是猜数字,也就是猜这个随机数,而且若有几个位置相同且数字相同就返回几A,若位置不同但数字相同就返回几B,所以就需要对这个四位数进行拆分,取出每位的数字。这个用到parseInt方法,详细介绍见“http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp”;

function get_every_number(number){
    var one = parseInt(number / 1000);
    var two = parseInt((number - one * 1000) / 100);
    var three = parseInt((number - one * 1000 - two * 100) / 10);
    var four = number % 10;
    var every_number = [];
    every_number.push(one,two,three,four)
    return every_number;
}

 前三个数字用的是减去上一位值,第四个数字要用减明显不太合适,它更适合用取余的方法。这样就可以将每位的数字取出与所猜测的数字逐位比较,返回相应的值。

 

 

分享到:
评论
1 楼 it_node 2017-10-23  
文章写得真好,推荐个在线实战的地方:
http://xc.hubwiz.com/course/5911d52ab343f27b0ae1b895?affid=iteye

相关推荐

    TDD测试驱动开发.pptx

    TDD测试驱动开发.pptx

    Visual Studio 2010 TDD 测试驱动开发 实战 视频及源码

    教程主题:Visual Studio 2010 TDD 测试驱动开发 实战 教程录制:柳永法 web:http://www.yongfa365.com/ 本教程旨在以最简单的hello world方式像您展示 Visual Studio 2010强大的TDD,推荐任何没接触过VS2010及TDD...

    TDD测试驱动开发(Kent Beck) 讲解代码(C#)

    TDD测试驱动开发(Kent Beck) 讲解代码(C#) 不同种货币计算。

    TDD 测试驱动开发 文档 详细

    java TDD测试开发流程 包含mekito测试的整套教程。 敏捷开发 适用

    TDD测试驱动开发PDF及源码.zip

    TDD是测试驱动开发(Test-Driven Development)的英文简称,是敏捷开发中的一项核心实践和技术,也是一种设计方法论。TDD的原理是在开发功能代码之前,先编写单元测试用例代码,测试代码确定需要编写什么产品代码。...

    测试驱动开发(TDD)入门讲解及代码实例

    测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量。本文从开发人员使用的角度,介绍了 TDD 优势、原理、过程、原则、测试技术、Tips 等方面。 背景 一个...

    测试驱动开发TDD(1-3)

    个人总结TDD测试驱动开发TDD(1-3)

    测试驱动开发介绍及实践.pptx

    TDD测试驱动开发讲稿,配合技术分享视频:https://www.bilibili.com/video/BV1t64y1u7C1

    测试驱动开发的艺术 epub电子书

    极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。本书采用“手把手”...

    TDD是测试驱动开发

    一般来讲程序员都愿意把功能完美的体现在代码上,可有时候天不随人意,心里免不得担忧,我这代码能满足...由于要先开发测试用例,那么开发人员就必须清楚测试的目的,这样TDD确保了项目的代码与所需的业务是匹配的。

    code kata以及测试驱动开发TDD介绍实用PPT课件.pptx

    code kata以及测试驱动开发TDD介绍实用PPT课件.pptx

    TDD驱动测试开发培训

    测试驱动开发对开发的影响:工作量、质量、进度  开发和测试的相互作用  测试驱动开发的方法与原则  如何划分模块,制定集成计划  如何设计集成测试用例  如何基于模块详细设计,设计单元测试用例  如何基于...

    测试驱动开发(TDD)深入浅出

    测试驱动开发 TDD ,将读者带入XP极限编程的神奇世界!

    java测试驱动开发教程+代码实例

    《Java测试驱动开发》介绍如何将各种TDDzui佳实践应用于Java开发,主要内容包括:用Java语言进行TDD会用到的各种工具和框架,所需环境搭建;通过实际应用程序,展示TDD优点及开发中应注意的主要问题;TDD是如何通过...

    C#测试驱动开发

    要使测试驱动开发在软件行业中得以繁荣兴盛,需要一些条件,《C#测试驱动开发》从讨论这些条件开始。软件开发发展到今天,有其历史和特定的条件,理解这些很重要。避免重复过去的错误也很重要。在自己当前的开发实践...

    java 测试驱动开发

    java 测试驱动开发,

    C#测试驱动开发(中文清晰版)

    C#测试驱动开发(中文清晰版) 第Ⅰ部分 入门 第 1 章 通向测试驱动开发之路 第 2 章 单元测试简介 第 3 章 重构速览 第 4 章 测试驱动开发:以测试为指南 第 5 章 模拟外部资源 第Ⅱ部分 将基础知识...

Global site tag (gtag.js) - Google Analytics