【问题标题】:Is there a way to delay the start of a QUnit test suite?有没有办法延迟 QUnit 测试套件的启动?
【发布时间】:2013-02-28 17:46:59
【问题描述】:

我正在尝试解决单元测试问题。

我曾经有一个大部分工作的 Maven -> PhantomJS -> Qunit 设置,但它是不可预测的,所以我把它拆开来尝试修复它。

我升级了软件:

Qunit: 1.11.0
PhantomJS: 1.8
Phantom Qunit Runner Latest: https://github.com/jquery/qunit/tree/master/addons/phantomjs

我看到 Web GUI 工作正常。它运行并通过了所有 102 项测试。控制台打印:

$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ Took 16ms to run 0 tests. 0 passed, 0 failed.

如果我在运行程序中注释掉退出命令,它会多次打印 QUnit.done 的控制台输出。

$ phantomjs --disk-cache=false runner.js http://localhost/ui/dcx/test.html
$ PhantomJS successfully loaded a page
$ QUnit.done callback fired
$ Took 15ms to run 0 tests. 0 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1840ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1841ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1842ms to run 102 tests. 102 passed, 0 failed.
$ QUnit.done callback fired
$ Took 1848ms to run 102 tests. 102 passed, 0 failed.
$ ^C
$

在我看来,Qunit.done 回调执行得太快了,然后执行了多次。

有人知道为什么会触发该回调吗?

我的测试内容和登录延迟可能是相关的。我使用 AMD 模块来定义测试并使用 curl.js 来引入它们。在安全登录之前什么都不会发生:

curl(['dolla'], function($){
        $.ajax({
        type: 'POST',
        url: '/svc/j_spring_security_check',
        data: {
            j_username: '7',
            j_password: '7'
        },
        success: function() {
            loadTests()
        }
    });
})
var loadTests = function () {
    curl([
        // Unit tests
         'dcx/dataControls/activity.test'
        , 'dcx/dataControls/eventList.test'
        , 'dcx/dataControls/mapViewer.view.test'
        , 'dcx/pages/deviceDetails.view.test'
        , 'dcx/pages/login.test'
        , 'dcx/pages/nodeProfiles.test'
        , 'dcx/pages/settings.view.test'
    ], function() {},  function(ex) { throw new Error(ex) })
})

编辑: 我想,我找到了根本原因。 如果您在空白页上包含 QUnit,它会立即调用 QUnit.begin 和 QUnit.done。 我需要延迟 Qunit 的执行,直到安全登录成功并且 curl 引入了我的单元测试。有没有办法延迟 QUnit 的启动,但仍然保持 Qunit 对象可用?我不能使用 stop(),因为有很多异步测试会调用 start()。

【问题讨论】:

    标签: unit-testing maven phantomjs qunit


    【解决方案1】:

    找到了答案。您可以将 QUnit 配置为不启动,然后在加载所有测试时手动启动它。这可以防止 Qunit.done 的重复调用,这是此问题的根本原因。

    http://forum.jquery.com/topic/are-qunit-and-requirejs-compatible#14737000001967123

    【讨论】:

      【解决方案2】:

      这是一种方法——如果没有测试结果,则将运行器修改为不退出。 https://gist.github.com/SimpleAsCouldBe/5059623

      这不起作用——只要测试堆栈被清除,Qunit.done 就会触发。在像 Curl/Require.js 这样的异步加载环境中,这可能随时发生。

      【讨论】:

        【解决方案3】:

        这是如果您不想使用require。例如,可能在浏览器上下文中。

        我花了很长时间才找到一种方法将脚本(和样式表)的加载转换为Promises(请参阅here),然后我发现 QUnit 测试套件在所有这些加载之前就开始运行存在很大问题。通常,在开始时,少数测试会抱怨某个变量或类未定义,尽管后来的测试不会有这样的困难。

        你可以这样停止自动启动:

        QUnit.config.autostart = false;
        

        ...似乎只需将其放入多个文件之一就足够了。

        然后,要开始 QUnit 测试,您必须转到 QUnit.start();。但是,也许可以理解,您不能从 QUnit 测试运行的任何代码中执行此操作。这变得复杂了。最后,我在我的应用程序启动代码中做到了这一点:

        await this.loadInjectedFile( GLOBAL_SCRIPT );
        await this.loadInjectedFile( DBFORM_SCRIPT );
        await this.loadInjectedFile( UDV_SCRIPT );
        await this.loadInjectedFile( REACTIVITY_SCRIPT );
        console.log( '... injected files loaded' );
        // to allow QUnit to start testing
        window.QUnitGreenLight = true;
        

        ...严格来说是一件很淘气的事情(允许与测试相关的代码潜入您的应用程序代码中)。可能会找到一种更细分的方法。

        然后,在您启动测试的 HTML 文件中内联:

        <script>
            const tryToStartTesting = function(){
                setTimeout( function(){
                    if( window.QUnitGreenLight ){
                        QUnit.start();
                    }
                    else {
                        console.log( 'QUnit green light not yet given!' );
                        tryToStartTesting();
                    };
                }, 10 );
            };
            tryToStartTesting();
        </script>
        

        ...实际上,在发出绿灯之前似乎可能需要百分之几秒。

        也许有点杂乱无章,但它似乎有效。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-13
          • 2020-08-31
          • 1970-01-01
          • 2021-09-11
          • 1970-01-01
          • 2023-03-10
          • 2016-02-17
          相关资源
          最近更新 更多