在持续集成构建中无头地运行JavaScript单元测试

时间:2010-01-15 09:20:46

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

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

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

7 个答案:

答案 0 :(得分:55)

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

简而言之:

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

接下来我将介绍更详细的阶段。这就是我的目录结构看起来像:

lib/
    JsTestDriver.jar
test/
    qunit/
            equiv.js
            QUnitAdapter.js
    jsTestDriver.conf
    run_js_tests.sh
    tests.js
test-reports/
build.xml

在构建服务器上:

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

进入要构建的应用程序:

server: http://localhost:4224

load:
# Load QUnit adapters (may be omitted if QUnit is not used)
  - qunit/equiv.js
  - qunit/QUnitAdapter.js   

# Tests themselves (you'll want to add more files)
  - tests.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"会很好。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:3)

在过去的一年里,我玩过许多解决方案,但我没有在Karma(以前的测试版)的球场找到任何东西。试一试

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

我用maven和junit打电话给犀牛。它不优雅,但我用它来测试基本服务和实用程序代码。

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

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

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

答案 6 :(得分:0)

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