我有一个基于持续集成系统(Atlassian Bamboo 2.5)的Web应用程序构建计划。我需要将基于QUnit的JavaScript单元测试纳入构建计划,以便在每次构建时运行JavaScript测试,并使Bamboo能够解释测试结果。
最好我想让构建过程“独立”,这样就不需要连接到外部服务器了。有没有好的方法可以实现这一点?运行构建过程的CI系统位于Ubuntu Linux服务器上。
我有一个基于持续集成系统(Atlassian Bamboo 2.5)的Web应用程序构建计划。我需要将基于QUnit的JavaScript单元测试纳入构建计划,以便在每次构建时运行JavaScript测试,并使Bamboo能够解释测试结果。
最好我想让构建过程“独立”,这样就不需要连接到外部服务器了。有没有好的方法可以实现这一点?运行构建过程的CI系统位于Ubuntu Linux服务器上。
由于我自己想出了解决方案,所以我认为分享它是个好主意。这种方法可能不是完美的,但它是似乎能够工作的第一个方法。欢迎发表改进和建议。
我简要介绍一下我做了什么:
接下来,我将详细讨论各个阶段。这是我的目录结构最终看起来的样子:
lib/ JsTestDriver.jar test/ qunit/ equiv.js QUnitAdapter.js jsTestDriver.conf run_js_tests.sh tests.js test-reports/ build.xml
在构建服务器上:
apt-get install Xvfb
)apt-get install firefox
)添加到您要构建的应用程序中:
equiv.js
和QUnitAdapter.js
jsTestDriver.conf
):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."
<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"
就可以了。
如果你想在maven中无头运行Jasmine BDD规范的内容,你可能会对我维护的jasmine-maven-plugin感兴趣:
我使用了maven和junit来调用rhino。虽然不太优雅,但我用它来测试基本服务和实用程序代码。
它需要模拟不支持的类,比如XHR与Java库。
我发现最好在javascript中编写所有内容(测试等),只使用junit进行构建组织和CI钩子。
我想看看JsTestDriver是否可以做到。或者是带有junit报告器的mocha。
你可以尝试使用Rhino这个无头浏览器在CI机器上运行单元测试。当然,这样做的缺点是它无法发现特定于某个浏览器的错误...但它确实比在CI盒子上安装2-3个操作系统来覆盖所有主要平台要好得多...
但是,是的,这种方法有点糟糕...但在CI场景中可能足够好用。