使用JsTestDriver + RequireJS + QUnit进行测试

3

经过长时间的搜索和不少尝试,我发现选择的工具组合并不行。如果我错了就太好了。

嗯,技术栈如标题所述:

  1. 所有“类”使用 Backbone
  2. 使用 RequireJS 加载和管理 Backbone 实体之间的依赖关系
  3. 使用 QUnit 进行测试(其中测试也是 RequireJS 模块)
  4. 使用 JsTestDriver 进行命令行自动化

设置和代码片段

jsTestDriver.conf

server: http://localhost:48080
basepath: path/to/JSTestDriver/
load:
  - lib/qunit/qunit-1.10.0.js
  - lib/qunit/equiv.js
  - lib/qunit/QUnitAdapter.js
  - lib/requirejs/require.js
test:
  - test/tests.js
serve:
  - lib/jquery/jquery-1.7.1.js
  - test/components/ComponentOneTest.js

tests.js

require({  
    baseUrl : '/test',
    shim : {
        'fixture.object' : ['jquery'],
        'fixture.string' : ['jquery'],
        'fixture.dom' : ['jquery', 'fixture.string'],
        'fixtures' : ['fixture.object', 'fixture.string', 'fixture.dom'],
        'equiv' : ['qunit'],
        'qunit.adapter' : ['qunit', 'equiv']
    },
    paths: {  
        'text' : 'lib/requirejs/text',
        'jquery' : 'lib/jquery/jquery-1.7.1',
        'backbone' : 'lib/backbone/amd/backbone',
        'underscore' : 'lib/underscore/amd/underscore',
        'fixture.dom' : 'lib/fixture/jquery.dom.fixture',
        'fixture.string' : 'lib/fixture/jquery.lang.string',
        'fixture.object' : 'lib/fixture/jquery.lang.object',
        'fixtures' : 'fixture/fixtures',
        'qunit' : 'lib/qunit/qunit-1.10.0',
        'equiv' : 'lib/qunit/equiv',
        'qunit.adapter' : 'lib/qunit/QUnitAdapter'
    }
}, [], function() {
    module('Module 1', {});

    test('test 1', 1, function() {
        ok(true, 'passed');
    });

    asyncTest('test 2', 1, function() {
        start();
        ok(true, 'passed');

    });
});

服务器启动命令(与JSTD JAR文件在相同目录中)

java -jar JsTestDriver-1.3.4.b.jar --port 48080

测试运行命令(在与JSTD JAR相同的目录中)

java -jar JsTestDriver-1.3.4.b.jar --runnerMode PROFILE --reset --dryRunFor all --tests all

什么有效?

首先,同步测试有效。

什么无效?

第二个异步测试无效并超时。

错误信息

Chrome控制台

Uncaught TypeError: Cannot read property 'all' of undefined qunit-1.10.0.js:1102
done qunit-1.10.0.js:1102
process qunit-1.10.0.js:1285
(anonymous function) qunit-1.10.0.js:383

控制台

setting runnermode PROFILE
Chrome: Reset
Chrome: Reset
Chrome 22.0.1229.64: 1 tests [
Module 1 (/test/test/tests.js)
        test test 1
        test test 2]
.F
Total 2 tests (Passed: 1; Fails: 1; Errors: 0) (30025.00 ms)
  Chrome 22.0.1229.64 Windows: Run 2 tests (Passed: 1; Fails: 1; Errors 0) (30025.00 ms)
    Module 1.test test 2 failed (30023.00 ms): Error: Callback '#1' expired after 30000 ms during test step 'start()'
      Error: Callback '#1' expired after 30000 ms during test step 'start()'

Sep 23, 2012 8:36:44 PM com.google.jstestdriver.ActionRunner runActions
INFO:

注意事项

我已经从这里下载了最新的QUnit适配器。我还尝试了一些其他据说可行的适配器,但都无济于事。

问题

这真的可能吗?如果可能的话,是否有人能够解决这个问题呢?

谢谢。

更新(08.04.14)

Karma。就是这样。


这个问题已经有一段时间了 - Dilip的建议解决了你的问题还是你想出了其他办法?只是好奇,我也遇到了类似的情况。 - mrk
没有。没这么幸运。然而,在我的另一个项目中,我决定使用Grunt和Phantom.JS来进行QUnits测试,目前效果还不错。 - ZenMaster
1个回答

2
在异步测试中,将一组简单的语句按顺序执行是没有意义的。异步测试主要用于在测试过程中执行耗时任务时不希望停止和启动测试,例如超时或ajax调用。为了模拟这种情况,我们可以进行修改。
asyncTest('test 2', 1, function() {
    start();
    ok(true, 'passed');
});

为了

asyncTest('test 2', 1, function() {        
    setTimeout(function(){
        ok(true, 'passed');
        start();
    },2000);    
});

这将像魔法一样运行!!!


1
有没有太多意义有点像是诗歌问题。QUnit允许它OOB并且它可以运行。无论如何,即使有您的建议,上述设置也存在严重的稳定性问题。您是否有运行上述堆栈的实际经验? - ZenMaster
实际上,在我的测试用例中,我遇到了相同的问题,使用相同的设置。一旦按照我的代码所示将其放入setTimeout中,它就可以工作了。 - Dilip
嗯,实际上我之前确实尝试了你建议的方法。结果是使用 runningMode PROFILE 时完全跳过了测试,而 runningMode DEBUG 有时可以正常工作,有时会失败。如果您能分享您的设置和配置,我会接受这个答案。 - ZenMaster
这是我用来运行测试用例的配置: --port 42442 --config JsTestDriver.conf --browserTimeout 20 --server http://localhost:42442 --browser "C:\Program Files\Internet Explorer\iexplore.exe" --tests all --runnerMode DEBUG - Dilip
我是指包括jsTestDriver.conf文件。 - ZenMaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接