JS函数应用与TDD游戏测试驱动开发

Posted diuxie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS函数应用与TDD游戏测试驱动开发相关的知识,希望对你有一定的参考价值。

1.实现函数checkNumber:

该函数的目的是检查形式参数的字符串是否可以被转化为一个数字,所以返回值也非常简单,能则返回true,不是则返回false,代码如下:

function checkNumber(value) {

var m = 0;  // 统计负号的个数
var n = 0;  // 统计小数点的个数

for(var i=0; i<value.length; i++){
    var c = value.charCodeAt(i);    // 获取每个字符的ASCII码

    // 通过ASCII码检查,如果字符不为0~9的数字或者负号或者小数点,则无效
    if ((c >= 0 && c < 45) || c > 57 || c == 47)
        return false;

    if(c == 45) m++;
    if(c == 46) n++;

}
if(m > 1) return false;
if(n > 1) return false;

// 如果存在一个负号,而负号不在第一个位置,则无效
if(m == 1 && value.charCodeAt(0) != 45) return false;

// 如果存在一个小数点,而小数点在最后一个位置,则无效
if(n == 1 && value.charCodeAt(value.length-1) == 46) return false;

return true;

}

上述针对字符串判断的函数由于我们需要测试的输入www.sangpi.com情况非常多,所以如果每次我们都需要手工输入来进行测试的话,那么每当我们修改一点代码后,将会耗费很多时间来进行测试以保证代码没有Bug。所以,有没有一种更好的方法可以帮助我们更快的完成测试呢?

我们来看看下面这段代码,看看是否可以提高我们的测试速度,特别是当我们对代码进行改动后我们需要快速验证代码是否生效时:

document.writeln(checkNumber("12345")); // true
document.writeln(checkNumber("012345")); // true
document.writeln(checkNumber("-12345")); // true
document.writeln(checkNumber("-1.2345")); // true
document.writeln(checkNumber("12.345")); // true
document.writeln(checkNumber("0.12345")); // true
document.writeln(checkNumber("-0.12345")); // true
document.writeln(checkNumber("12345.")); // false
document.writeln(checkNumber(".12345")); // true
document.writeln(checkNumber("-.12345")); // true
document.writeln(checkNumber(".12-345")); // false
document.writeln(checkNumber("..12345")); // false
document.writeln(checkNumber("..--12345")); // false
document.writeln(checkNumber("--12.345.")); // false

当我们执行上述代码时,运行结果如下:

true true true true true true true false true true false false false false

我们将上述输出结果与我们的期望返回值进行比较,如果发现是一致的,说明我们的游戏代码是没有问题的。当然,对于我们自己开发的代码,大家一定要树立测试意识,测试并不只是测试工程师的事,这个想法是完全错误的,简单来说,就是我们必须要对自己的代码负责。

我们已经将该代码深入到这个程度了,我们不妨继续深入下去,基于这样一种自动输出测试结果,并通过人工对比来进行判断的测试方法,有没有更方便的做法呢?答案是肯定的。

既然我们可以自动调用checkNumber函数来观察其针对不同的形式参数返回不同的值来确定代码是否工作正常,那么我们也完全可以将该比对过程用代码来实现,以达到自动化测试的目的。如果要完成这一过程,我们需要首先创建一个“测试驱动程序”,英文叫:Test Driver或Test Fixture,代码如下:

function testCheckNumber(value, expect){

var actual = checkNumber(value);
if(actual == expect)
    document.write("测试结果:正确.<br>");
else
    document.write("测试结果: 错误.<br>");

}

测试驱动程序的目的主要完成三件事情:定义期望结果,调用被测试函数,对比实际结果以得出结论。上述代码的简单几行主要在完成这件事情,其中期望结果由形式参数expect给出。有了这样的驱动程序后,我们对实际的测试代码进行改造,如下:

testCheckNumber("12345", true);
testCheckNumber("012345", true);
testCheckNumber("-12345", true);
testCheckNumber("-1.2345", true);
testCheckNumber("12.345", true);
testCheckNumber("0.12345", true);
testCheckNumber("-0.12345", true);
testCheckNumber("12345.", false);
testCheckNumber(".12345", true);
testCheckNumber("-.12345", true);
testCheckNumber(".12-345", false);
testCheckNumber("..12345", false);
testCheckNumber("..--12345", false);
testCheckNumber("--12.345.", false);

运行上述自动化测试代码,输出结果如下:

测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.
测试结果:正确.

从运行结果可以看出,我们的被测试代码(即checkNumber函数)是工作正常的。当然,大家也可以故意将checkNumber函数的某些代码改错,我们看看该自动化测试程序能否正常检测到错误。

这就是基于代码级的自动化测试技术,此处我们利用的这种测试技术也被称之为:TDD,即Test-Driven Development,测试驱动开发。这是非常流行的一种敏捷开发方法论。

以上是关于JS函数应用与TDD游戏测试驱动开发的主要内容,如果未能解决你的问题,请参考以下文章

在敏捷中应用测试驱动开发

Go语言:利用 TDD 测试驱动开发帮助理解数组与动态数组(切片)的区别

如何简单的理解TDD与DDT

Rebol Saphirion GUI 测试驱动开发 (TDD)

测试驱动开发(TDD)实践与技巧

Go语言:通过TDD驱动测试开发为同事写的程序优化提速——初次接触并发与channel