测试驱动开发
test-driven development TDD
好处:
提供明确的目标:因为你也是代码的使用者
提供文档:因为有测试代码,因此文档会更多一些
改善设计:因为你也是代码的使用者,测试要想简单,首先是对象要简单,所以你的代码不会太复杂
鼓励重构:不害怕重构,只要测试通过就行
提高速度:增加或修改代码时,不会造成不可估计的错误,从长远来看,它是提高编码速度的
提供反馈:因为你也是代码的使用者
测试是会上瘾的!
JsUnit
测试函数不能有任何参数,必须有一个前缀test。测试函数包含在一个测试页中,测试页必须包含jsunitCore.js文件。测试函数也可以放在单独的JavaScript文件中,不过,如果这样做,就需要使用exposeTestFunctionNames()方法,这样JsUnit才能找到测试函数。
实际操作一下:假设我有一个js文件,simple.js
function addTwoNumbers(value1, value2)
{
return parseInt(value1) + parseInt(value2);
}
我还要再建立一个测试页,simple_t.htm
<html>
<head>
<script language="JavaScript" src="../app/jsUnitCore.js"></script>
<script language="JavaScript" src="simple.js"></script>
<script language="JavaScript">
function testValidArgs()
{
assertEquals("2 + 2 is 4", 4, addTwoNumbers(2, 2));
}
function testWithNegativeNumbers()
{
assertEquals("negative numbers: -2 + -2 is -4", -4, addTwoNumbers(-2, -2));
}
</script>
<head>
<body>
This is a simple test page for addTwoNumbers(value1, value2)
</body>
</html>
如果JsUnit不幸无法自动找到你的测试函数,请在测试页中加入这个函数:
function exposeTestFunctionNames()
{
var tests = new Array(2);
tests[0] = "testValidArgs";
tests[1] = "testWithNegativeNumbers";
return tests;
}
这就麻烦多了,因为函数名要自己一个个地输入,输错了,测试就出错,提示:
对象不支持此属性或方法
函数setUp是指在执行前所做的事,tearDown是指在执行后所做的事。
function setUp()
{
document.getElementById("value1").value = "2";
document.getElementById("value2").value = "2";
}
function testValidArgs()
{
assertEquals("getElement 2 + 2 = 4", 4, addNumbers());
}
function addNumbers()
{
var val1 = document.getElementById("value1").value;
var val2 = document.getElementById("value2").value;
return addTwoNumbers(val1, val2);
}
function tearDown()
{
document.getElementById("value1").value="";
document.getElementById("value2").value="";
}
JsUnit还有其它一些功能,但我要应用后才能理解这些功能要解决的问题。