在持续集成构build中无头无虑地运行JavaScriptunit testing
我有一个在持续集成系统( Atlassian Bamboo 2.5)上运行的webapp构build计划。 我需要将基于QUnit的JavaScriptunit testing整合到构build计划中,以便在每个构build中都会运行Javascripttesting,并且Bamboo将会解释testing结果。
最好我希望能够使构build过程“独立”,以便不需要连接到外部服务器。 关于如何完成这个好主意? 运行构build过程的CI系统位于Ubuntu Linux服务器上。
当我设法自己想出一个解决scheme时,我认为分享它是一个好主意。 这种做法可能并不完美,但这是第一个似乎可行的方法。 随意发表改进和build议。
我所做的一切:
- 启动一个虚拟帧缓冲区Xvfb的实例
- 使用JsTestDriver :
- 启动一个Firefox的实例到虚拟帧缓冲区(无头)
- 捕获Firefox实例并运行testing套件
- 生成符合JUnit的testing结果.XML
- 使用Bamboo来检查结果文件是否通过构build
接下来我会经历更详细的阶段。 这就是我的目录结构最终看起来像:
LIB / JsTestDriver.jar testing/ qunit / equiv.js QUnitAdapter.js jsTestDriver.conf run_js_tests.sh tests.js testing报告/ build.xml文件
在构build服务器上:
- 安装Xvfb(
apt-get install Xvfb
) - 安装Firefox(
apt-get install firefox
)
进入你的应用程序来构build:
- 安装JsTestDriver: http : //code.google.com/p/js-test-driver/
- 添加QUnit 适配器
equiv.js
和QUnitAdapter.js
- configurationJsTestDriver(
jsTestDriver.conf
):
- 添加QUnit 适配器
服务器:http:// localhost:4224 加载: #加载QUnit适配器(如果不使用QUnit,可以省略) - qunit / equiv.js - qunit / QUnitAdapter.js #testing自己(你会想添加更多的文件) - tests.js
创build一个用于运行unit testing和生成testing结果的脚本文件(例如,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."
创build一个调用脚本的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构build计划既调用test
目标,又查找JUnittesting结果。 这里默认的"**/test-reports/*.xml"
会很好。
对于有兴趣在maven中无所畏惧地运行Jasmine BDD规范的人,您可能会对我所维护的jasmine-maven-plugin感兴趣:
作为替代,你也可以尝试TestSwarm。 我使用QUnit来运行我的JStesting。
在过去的一年里,我曾经玩过一些解决scheme,但是我没有在噶玛(以前称为“耻辱”)球场find任何东西。 试一试
您可以使用无头浏览器rhino在您的CI机器上运行您的unit testing。 当然,这里的缺点是它不会find特定于浏览器X的错误,但它确实在你的CI盒子上安装2-3个操作系统,以覆盖所有的主要平台。
但是,是的,这种糟透了……但是在CI场景中它可能工作的很好。
我用maven和junit来打电话给犀牛。 这不是优雅的,但我用它来testing基本服务和实用程序代码。
它需要嘲讽不受支持的类,如XHR和Java库。
我发现最好的代码在JavaScript(testing等)的一切,只使用junit的构build组织和一个挂钩到CI。
我想看看JsTestDriver是否可以做到这一点。 或者摩卡瓦特/尤尼特记者。
JStesting亚军是一个很好的解决scheme。 它使用PhantomJS和QUnit。