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

59

我有一个基于持续集成系统(Atlassian Bamboo 2.5)的Web应用程序构建计划。我需要将基于QUnit的JavaScript单元测试纳入构建计划,以便在每次构建时运行JavaScript测试,并使Bamboo能够解释测试结果。

最好我想让构建过程“独立”,这样就不需要连接到外部服务器了。有没有好的方法可以实现这一点?运行构建过程的CI系统位于Ubuntu Linux服务器上。


似乎Joshua Flanagan在C#/IE环境中使用Watin、NUnit和IterativeTest开发了类似的东西:http://www.lostechies.com/blogs/joshuaflanagan/archive/2008/09/18/running-jquery-qunit-tests-under-continuous-integration.aspx?CommentPosted=true#commentmessage - miek
RhinoUnit提供了无头运行JS单元测试的能力,但是添加对QUnit的支持可能需要一些额外的工作:http://code.google.com/p/rhinounit/ - miek
7个回答

55

由于我自己想出了解决方案,所以我认为分享它是个好主意。这种方法可能不是完美的,但它是似乎能够工作的第一个方法。欢迎发表改进和建议。

我简要介绍一下我做了什么:

  • 启动一个虚拟帧缓冲器(virtual framebuffer)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:
# 加载QUnit适配器(如果不使用QUnit,则可以省略)
  - qunit/equiv.js
  - qunit/QUnitAdapter.js
# 测试本身(您会想添加更多文件) - 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"就可以了。


4

3

3
我过去一年里尝试了许多解决方案,但是没有找到任何类似Karma(曾用名testacular)的东西。建议你试试它。 http://karma-runner.github.com/

1

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

它需要模拟不支持的类,比如XHR与Java库。

我发现最好在javascript中编写所有内容(测试等),只使用junit进行构建组织和CI钩子。

我想看看JsTestDriver是否可以做到。或者是带有junit报告器的mocha。


0

你可以尝试使用Rhino这个无头浏览器在CI机器上运行单元测试。当然,这样做的缺点是它无法发现特定于某个浏览器的错误...但它确实比在CI盒子上安装2-3个操作系统来覆盖所有主要平台要好得多...

但是,是的,这种方法有点糟糕...但在CI场景中可能足够好用。


我其实在想,Rhino或者HtmlUnit能否与JsTestDriver一起使用。不过我还没有弄清楚... - miek

0

JS测试运行器是一个相当不错的解决方案。它使用PhantomJS和QUnit。


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