59

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

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

4

7 回答 7

55

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

简而言之,我做了什么:

  • 启动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)
  • 安装火狐 ( 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"就可以了。

于 2010-01-15T09:34:05.277 回答
4

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

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

于 2010-09-03T16:05:54.950 回答
3

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

于 2010-01-15T17:53:37.827 回答
3

在过去的一年中,我尝试了许多解决方案,但在 Karma(以前的 testacular)的球场上没有找到任何东西。试试看

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

于 2013-03-29T01:24:20.747 回答
1

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

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

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

我想看看 JsTestDriver 是否可以做到。或带有junit记者的摩卡咖啡。

于 2012-03-23T19:40:54.467 回答
0

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

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

于 2010-01-15T12:34:35.240 回答
0

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

于 2012-07-25T23:34:34.263 回答