Assertions
assertion就是一种特殊的检查参数的方式,并且可以做到错误的标记(通常采用抛出一个Assertions或者类似的方式)。最简单的assertion就是判断参数是否正确。assertions通常接收一个message,用于在出错时展示:
assert("Small date difference expected\n '3 days, 2 hours, 16 minutes and " + "10 seconds ago' got\n'" + element.text() + "'", element.text() == "3 days, 2 hours, 16 minutes and 10 seconds ago"); |
assert方法调用message作为第一个参数。message的意义在于测试需要预先设置好期望值,然后assertion就像是一个伴随message的规范来界定结果是否和期望值一致。
一个简单的assert,就像上面的例子一样,通常就可以满足你的需要了,大部分测试框架都提供了一个可定制的assertion。我们真正需要做的是检查一些计算结果是否和期望值一致。大部分测试框架都含有一些类似assertEquals的方法,例子如下:
assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text()); |
注意,我们不需要再说明判断形式。assertEquals知道我们期望第二个值和第一个值对等,那么它会自己生成一个合适的message。
测试用例,setUp和tearDown
我们手工编写的单元测试包含两个独立的测试。当使用一个测试框架的时候,我们通常在测试用例将其指定为一个独立的函数。一个测试用例就是一个测试的集合,用于测试相关的函数。为了让测试报告更方便查看,测试用例一般都会有一个名字。下面就是一个结构化之后的手工单元测试例子。
var second = 1000; var minute = 60 * second; var hour = 60 * minute; var day = 24 * hour; TestCase("TimeDifferenceInWordsTest", { "test 8 day difference should result in '1 week ago'": function () { var dateStr = new Date(new Date() - 8 * day).toString(); var element = jQuery('Replace me'); element.differenceInWords(); assertEquals("1 week ago", element.text()); }, "test should display difference with days, hours, minutes and seconds": function () { var diff = 3 * day + 2 * hour + 16 * minute + 10 * second; dateStr = new Date(new Date() - diff).toString(); var element = jQuery('Replace me'); element.differenceInWords(); assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text()); } }); |
每个测试之前的注释都换成了测试函数的名字,比较处也换成了assertion。我们甚至可以让每一个测试更加清晰,通过将date对象的创建放到一个指定的方法setUp上,这个方法在测试函数执行前会被调用:
TestCase("TimeDifferenceInWordsTest", { setUp: function () { this.date8DaysAgo = new Date(new Date() - 8 * day); var diff = 3 * day + 2 * hour + 16 * minute + 10 * second; this.date3DaysAgo = new Date(new Date() - diff); }, "test 8 day difference should result in '1 week ago'": function () { var element = jQuery('Replace me'); element.differenceInWords(); assertEquals("1 week ago", element.text()); }, "test should display difference with days, hours, minutes and seconds": function () { var element = jQuery('Replace me'); element.differenceInWords(); assertEquals("3 days, 2 hours, 16 minutes and 10 seconds ago", element.text()); } }); |
setUp方法也可以包含一个附带的tearDown方法,在每个测试之后执行。这个例子不需要tearDown方法,但是你可以在需要在每次测试完成之后需要做清理的时候增加这个方法。假设你要测试一些实现本地存储中数据缓存的代码。为了避免测试之间的相互影响,你可能会想要对测试产生的数据进行清除。
除了代码和测试之外,你需要指定一些方式来执行测试。大部分JavaScript单元测试框架都要求有一个简单的HTML文件以正确的顺序加载正确的文件(包括测试框架本身)。这个HTML文件可以在浏览器中加载。通常所有通过的测试都用绿色标记,然后不通过的测试会用红色标记。