清单 5. 转换 (qunit/js/script.js)
function convertFromCelsiusToFahrenheit(c){ var f = c * (9/5) + 32; return f; } function convertFromFahrenheitToCelsius(f){ var c = (f - 32) * (5/9); return c; } |
清单 6 显示了各自的测试用例。
清单 6. 测试用例 (qunit/js/test.js)
module ("Temperature conversion") test("conversion to F", function(){ var actual1 = convertFromCelsiusToFahrenheit(20); equal(actual1, 68, ?Value not correct?); var actual2 = convertFromCelsiusToFahrenheit(30); equal(actual2, 86, ?Value not correct?); }) test("conversion to C", function(){ var actual1 = convertFromFahrenheitToCelsius(68); equal(actual1, 20, ?Value not correct?); var actual2 = convertFromFahrenheitToCelsius(86); equal(actual2, 30, ?Value not correct?); }) |
QUnit 中的测试用例由 test() 方法定义。逻辑是包含在传入函数的第二个参数中。在清单 6 中,两个测试分别名为 conversion to F 和 conversion to C。每个测试包含两个断言。该测试中的断言使用了 equal() 方法。equal() 函数可以将预期值与测试函数的实际值相比较。equal() 方法中的第三个参数是错误情况下显示的消息。
还可以通过 module() 函数将测试组织到模块中。在清单 6 中,Temperature conversion 模块含有这两个测试。
如果要运行测试:
在 HTML 运行程序中包含源代码和测试文件,如清单 7 所示。
在浏览器中打开页面。
清单 7. 在运行程序中包含 script.js 和 test.js
...<script type="text/javascript" src="js/script.js"></script> <script type="text/javascript" src="js/test.js"></script> ... |
图 1 显示了 QUnit 如何在浏览器 (Firefox) 中显示结果。
图 1. QUnit 结果
清单 6 中的断言使用了 equal() 方法,但它不是 QUnit 提供的惟一断言。QUnit 提供的其他断言包括 ok() 或 strictEqual()。清单 8 显示了正在执行的方法。
清单 8. 更多的断言
module ("Other assertion"); test("assertions", function(){ ok(true); ok(3); strictEqual("c", "c"); equal (3, "3"); }); |
ok() 函数检查第一个参数为 true;strictEqual() 验证第一个参数严格等于第二个参数。在这些代码背后,strictEqual() 使用了 === 运算符,equal() 使用了 == 运算符。
如果测试失败,QUnit 还提供了有用的信息。将清单 8 中的代码改成清单 9 中的代码,让上一次断言执行失败。
清单 9. 上一次断言出现的错误
module ("Other assertion"); test("assertions", function(){ ok(true); ok(3); strictEqual("c", "c"); strictEqual (3, "3"); }); |
图 2 显示了 QUnit 执行清单 9 代码所返回的结果。
图 2. QUnit 结果:上次测试失败
结果非常详细,而且很容易查到上次断言的预期值与实际值有什么不同。
QUnit 另一项特性能让您在模块中的所有测试执行之前或之后执行命令。module() 函数接受 setup() 和 teardown() 回调作为第二个参数。使用 setup() 函数更新 清单 6,如清单 10 所示。
清单 10. setup() (qunit/js/test-setup.js)
module ("Temperature conversion", { setup : function() { this.celsius1 = 20; this.celsius2 = 30; this.fahrenheit1 = 68; this.fahrenheit2 = 86; } }); test("conversion to F", function(){ var actual1 = convertFromCelsiusToFahrenheit(this.celsius1); equal(actual1, this.fahrenheit1); var actual2 = convertFromCelsiusToFahrenheit(this.celsius2); equal(actual2, this.fahrenheit2); }); test("conversion to C", function(){ var actual1 = convertFromFahrenheitToCelsius(this.fahrenheit1); equal(actual1, this.celsius1); var actual2 = convertFromFahrenheitToCelsius(this.fahrenheit2); equal(actual2, this.celsius2); }); |