qunit sap
测试是每个开发人员工作流程的重要组成部分,或者至少应该如此。 几年前的一项调查显示,大约50%JavaScript开发人员根本不编写测试,这有点吓人。 几个月前,我试图通过关于JavaScript单元测试框架QUnit的三部分系列来鼓励使用JavaScript进行测试的实践。 如果您错过了它,那么本系列文章由QUnit入门 , 如何使用QUnit和QUnit高级概念:模块和配置 测试异步代码组成 。
12月,此框架的1.16版发布了一些重要更改。 在本文中,我将向您介绍它们,并描述它们如何影响您的测试。
准备版本2.0
现在将测试更新到1.16版将在迁移到2.0版的过程中为您提供帮助。 QUnit 1.16引入了几种新方法,这些新方法将在下一个里程碑中成为默认方法,因此现在进行计划是为主要版本做准备的明智方法。 此外,稍后我们将看到,在1.16版中,已经淘汰了用于测试异步代码的两种方法,并重命名了某些属性,因此您必须了解这些更改。
测试异步代码的新方法
在版本1.15之前,要测试异步函数,通常使用另一种方法来定义测试,该方法称为QUnit.asyncTest()
以及QUnit.start()
和QUnit.stop()
方法。 例如,假设您有一个名为max()
的函数,该函数根据给定的一组数字计算最大值,在QUnit 1.15中,您可以编写如下测试:
QUnit.asyncTest('max', function (assert) {
expect(2);
QUnit.stop(1);
window.setTimeout(function() {
assert.strictEqual(max(), -Infinity, 'No parameters');
QUnit.start();
}, 0);
window.setTimeout(function() {
assert.strictEqual(max(3, 1, 2), 3, 'All positive numbers');
QUnit.start();
}, 0);
});
从版本1.16开始,不推荐使用QUnit.asyncTest()
, QUnit.start()
和QUnit.stop()
。 要定义异步测试,可以使用与同步测试相同的QUnit.test()
方法。 启动/停止机制已被使用称为async
的新断言方法的新机制取代。 后者每次调用时都返回一个唯一的分辨率回调,并且必须在异步操作内执行此回调来代替QUnit.start()
。 从QUnit.async()
方法返回的回调不能执行两次,因为它将引发错误,因此您不必担心。
根据新机制重写先前的测试,将产生以下代码:
QUnit.test('max', function (assert) {
expect(2);
var done1 = assert.async();
window.setTimeout(function() {
assert.strictEqual(max(), -Infinity, 'No parameters');
done1();
}, 0);
var done2 = assert.async();
window.setTimeout(function() {
assert.strictEqual(max(3, 1, 2), 3, 'All positive numbers');
done2();
}, 0);
});
您可以在下面看到运行中的最后一个代码片段,它的代码也可以作为JSFiddle获得 :
支持承诺
QUnit.test()
现在可以自动处理Promise的异步解析。 承诺是一种有趣的模式,在过去的几年中被广泛使用作为替代回调和避免回调地狱的一种方式 。 在ECMAScript 6中原生引入了承诺,并且浏览器正在开始实现此功能。 如果您需要对Promise进行介绍,则可以阅读文章JavaScript Promises – There并再次返回 。
回到在QUnit 1.16制成,如果返回的变化then
能承诺为您的回调函数的结果,QUnit会等待测试解决或拒绝。 以下是从官方文档的相关页面获取的此新功能的示例:
QUnit.test( "a Promise-returning test", function( assert ) {
assert.expect( 0 );
var thenable = new Promise(function( resolve, reject ) {
setTimeout(function() {
resolve( "result" );
}, 500 );
});
return thenable;
});
新方法: QUnit.skip()
除了QUnit.async()
方法,我们还有QUnit.skip()
。 它可用于定义您要暂时禁用且不得执行的测试。 要跳过测试,可以QUnit.test()
的调用替换为QUnit.skip()
。 因此,假设您有测试:
QUnit.test('test', function(assert) {
// code goes here
});
您可以替换调用QUnit.test()
与QUnit.skip()
如下图所示:
QUnit.skip('test', function(assert) {
// code goes here
});
这个简单的更改使您避免对整个测试发表评论。 跳过的测试仍显示在HTML记录器中,但标记为“跳过”。
定义设置和拆卸功能的新属性
QUnit允许通过将代码分成多个模块来保持测试的组织性,这在我们为大型项目编写测试时特别有用,因为它增强了可维护性。 为此,框架提供了一个名为QUnit.module()
的方法来将测试分组为模块。 此方法有第二个参数,在文档中称为lifecycle
。 它是一个对象,可以包含两个可选函数,分别在每个测试的setup
属性和teardown
属性之后运行。 例如,您可以按以下报告定义模块:
QUnit.module('My module, {
setup: function() {},
teardown: function() {}
});
在版本1.16中,已弃用了这两个属性,并分别替换为两个等效的属性,分别命名为beforeEach
和afterEach
。 因此,从该版本开始,您应该将模块定义为:
QUnit.module('My module, {
beforeEach: function() {},
afterEach: function() {}
});
这项更改很有意义,因为这些功能实际上是在每个测试之前和之后运行的,而不是每个模块之前和之后的运行,正如原始名称暗示的那样。
其他变化
使用-require
选项运行时,QUnit现在与Rhino兼容。 框架搜索exports
对象,并使用该对象进行导出。
在“ QUnit高级概念:模块和配置”一文中,我介绍了所有可用选项。 在新版本的QUnit中, module
属性已在moduleFilter
重命名。
单击单个测试的“重新运行”链接时,现在使用测试名称的哈希值来引用该测试,称为testId
,而不是先前的testNumber
。 此更改可确保即使测试顺序发生变化,QUnit也会重新运行所选的相同测试。
结论
![](https://i-blog.csdnimg.cn/blog_migrate/34eea326ef0ea9769ee0dba7161deb99.png)
免费学习PHP!
全面介绍PHP和MySQL,从而实现服务器端编程的飞跃。
原价$ 11.95 您的完全免费
在这篇简短的文章中,您学习了QUnit 1.16中的新功能和所做的更改。 如果您想发现更多,可以查看changelog 。 将您的测试升级到这个版本并不难,但是显然,这还取决于您的项目具有的测试数量。
您如何看待这些变化? 您正在使用QUnit测试您的项目吗? 你觉得呢?你有没有什么想法? 让我们开始讨论。
qunit sap