【问题标题】:Running JavaScript unit tests headlessly in a Continuous Integration build在持续集成构建中无头运行 JavaScript 单元测试
【发布时间】:2011-01-05 10:39:13
【问题描述】:

我有一个在持续集成系统 (Atlassian Bamboo 2.5) 上运行的 webapp 构建计划。我需要将基于 QUnit 的 JavaScript 单元测试合并到构建计划中,以便在每次构建时运行 Javascript 测试并且 Bamboo 会解释测试结果。

最好我希望能够使构建过程“独立”,这样就不需要连接到外部服务器。关于如何实现这一点的好主意?运行构建过程的 CI 系统位于 Ubuntu Linux 服务器上。

【问题讨论】:

标签: javascript unit-testing continuous-integration qunit bamboo


【解决方案1】:

在过去的一年中,我尝试了许多解决方案,但在 Karma(以前称为 testacular)的范围内没有找到任何解决方案。试试看

http://karma-runner.github.com/

【讨论】:

    【解决方案2】:

    作为替代方案,您也可以尝试 TestSwarm。我已经使用 QUnit 启动并运行它来运行我的 JS 测试。

    【讨论】:

      【解决方案3】:

      JS Test Runner 是一个很好的解决方案。它使用 PhantomJS 和 QUnit。

      【讨论】:

        【解决方案4】:

        我使用 maven 和 junit 来调用 rhino。它并不优雅,但我用它来测试基本服务和实用程序代码。

        它需要模拟不受支持的类,例如带有 Java 库的 XHR。

        我发现最好在 javascript(测试等)中编写所有代码,并且只使用 junit 进行构建组织和进入 CI 的挂钩。

        我想看看 JsTestDriver 是否可以做到。或者 mocha w/junit 记者。

        【讨论】:

          【解决方案5】:

          对于有兴趣在 maven 中无头运行 Jasmine BDD 规范的任何人,您可能对我维护的 jasmine-maven-plugin 感兴趣:

          http://github.com/searls/jasmine-maven-plugin

          【讨论】:

            【解决方案6】:

            您可以使用无头浏览器 rhino 在您的 CI 机器上运行单元测试。当然,这里的缺点是它不会找到特定于浏览器 X 的错误......但它确实优于在你的 CI 盒子上安装 2-3 个操作系统,以覆盖所有主要平台......

            但是,是的,这种方式很糟糕......但它在 CI 场景中可能工作得很好。

            【讨论】:

            • 我其实想知道 Rhino 或 HtmlUnit 是否可以与 JsTestDriver 一起使用。不过还没想明白……
            【解决方案7】:

            当我自己想出一个解决方案时,我认为分享它是个好主意。这种方法可能并非完美无缺,但它似乎是第一个有效的方法。随时发布改进和建议。

            简而言之我做了什么:

            • 启动 Xvfb 实例,一个虚拟帧缓冲区
            • 使用JsTestDriver
              • 在虚拟帧缓冲区中启动一个 Firefox 实例(无头)
              • 捕获 Firefox 实例并运行测试套件
              • 生成符合 JUnit 的测试结果 .XML
            • 使用 Bamboo 检查结果文件以通过或失败构建

            接下来我将介绍更详细的阶段。这就是我的目录结构最终的样子:

            库/ JsTestDriver.jar 测试/ 数量/ equiv.js QUnitAdapter.js jsTestDriver.conf run_js_tests.sh 测试.js 测试报告/ 构建.xml

            在构建服务器上:

            • 安装 Xvfb (apt-get install Xvfb)
            • 安装 Firefox (apt-get install firefox)

            到您要构建的应用程序中:

            服务器:http://localhost:4224 加载: # 加载 QUnit 适配器(如果不使用 QUnit,可以省略) - qunit/equiv.js - qunit/QUnitAdapter.js # 测试自己(你会想要添加更多文件) - 测试.js

            创建一个用于运行单元测试和生成测试结果的脚本文件(例如在 Bash 中,run_js_tests.sh):

            #!/bin/bash
            # directory to write output XML (if this doesn't exist, the results will not be generated!)
            OUTPUT_DIR="../test-reports"
            mkdir $OUTPUT_DIR
            
            XVFB=`which Xvfb`
            if [ "$?" -eq 1 ];
            then
                echo "Xvfb not found."
                exit 1
            fi
            
            FIREFOX=`which firefox`
            if [ "$?" -eq 1 ];
            then
                echo "Firefox not found."
                exit 1
            fi
            
            $XVFB :99 -ac &    # launch virtual framebuffer into the background
            PID_XVFB="$!"      # take the process ID
            export DISPLAY=:99 # set display to use that of the xvfb
            
            # run the tests
            java -jar ../lib/JsTestDriver.jar --config jsTestDriver.conf --port 4224 --browser $FIREFOX --tests all --testOutput $OUTPUT_DIR
            
            kill $PID_XVFB     # shut down xvfb (firefox will shut down cleanly by JsTestDriver)
            echo "Done."
            

            创建一个调用脚本的 Ant 目标:

            <target name="test">        
                <exec executable="cmd" osfamily="windows">
                    <!-- This might contain something different in a Windows environment -->
                </exec>
            
                <exec executable="/bin/bash" dir="test" osfamily="unix">
                    <arg value="run_js_tests.sh" />
                </exec>
            </target>   
            

            最后,告诉 Bamboo 构建计划调用 test 目标并查找 JUnit 测试结果。这里默认的"**/test-reports/*.xml" 就可以了。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-08-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多