#### 1.3 测试函数、用例和套件(1)
我们目前所构建的测试中已经有了几个断言,但是这里存在一个问题,由于测试失败时assert函数只是简单地抛出错误,所以我们没法知道出错的测试之后的测试是失败还是成功。所以,如果我们想得到更细致的反馈,可以把测试组织成测试函数。如此一来,每个测试函数就只执行一个单元,但可以调用一个或多个断言。如果我们还想要进一步得到完全的控制,还可以要求一个测试只测试某个单元的一个特定的行为。这意味着每个单个函数都会有多个简练而明了的测试,而且,当它们被作为一个整体测试时也能提供很精确的反馈。
我们把一组相关的测试函数或方法叫做一个测试用例,就strftime函数来说,我们可以为整个函数设计一个测试用例,让每个测试通过一个或多个断言来测试函数的某个特定的行为。在更复杂的系统里,测试用例被进一步组织成测试套件。清单1.10列出了一个很简单的testcase函数。它接受一个字符串名(name)和一个带测试方法的对象。每个名字以“test”开头的属性都被当成测试方法来运行。
清单1.10 一个简单的testcase函数
~~~
function testCase(name,tests){
assert.count =0;
var successful =0;
var testCount =0;
for (var test in tests){
if (!/^test/.test(test)){
continue;
}
testCount++;
try {
tests [test ]();
output(test,"#0c0");
successful++;
}catch (e){
output(test +"failed:"+e.message,"#c00");
}
}
var color =successful ==testCount ?"#0c0":"#c00";
output("<strong>"+testCount +"tests,"+
(testCount -successful)+"failures</strong>",
color);
}
~~~
清单1.11用testcase把strftime的测试重新组织成一个测试用例。
清单1.11 strftime测试用例
~~~
var date =new Date(2009,9,2);
testCase("strftime test",{
"test format specifier %Y":function (){
assert("%Y should return full year",
date.strftime("%Y")==="2009");
},
"test format specifier %m":function (){
assert("%m should return month",
date.strftime("%m")==="10");
},
"test format specifier %d":function (){
assert("%d should return date",
date.strftime("%d")==="02");
},
"test format specifier %y":function (){
assert("%y should return year as two digits",
date.strftime("%y")==="09");
},
"test format shorthand %F":function (){
assert("%F should act as %Y-%m-%d",
date.strftime("%F")==="2009-10-02");
}
});
~~~