代码之家  ›  专栏  ›  技术社区  ›  miek

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

  •  59
  • miek  · 技术社区  · 14 年前

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

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

    7 回复  |  直到 11 年前
        1
  •  55
  •   miek    14 年前

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

    简而言之,我所做的:

    • 启动的实例 XVFB ,一个虚拟帧缓冲区
    • 使用 JsTestDriver :
      • 将一个firefox实例启动到虚拟帧缓冲区(headlessly)
      • 捕获 火狐 实例并运行测试套件
      • 生成JUnit兼容的测试结果.xml
    • 使用竹子检查结果文件以通过或失败生成

    接下来我将经历更详细的阶段。这就是我的目录结构最终的样子:

    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>   
    

    最后,告诉竹子建造计划都调用 test 瞄准并寻找JUnit测试结果。这里是默认值 "**/test-reports/*.xml" 会好的。

        2
  •  4
  •   Justin Searls    14 年前

    对于任何有兴趣在Maven中直接运行Jasmine BDD规范的人,您可能对我维护的Jasmine Maven插件感兴趣:

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

        3
  •  3
  •   jamiebarrow    12 年前

    作为一种选择,您也可以尝试testswarm。我已经安装了它,并使用qunit运行我的JS测试。

        4
  •  3
  •   Trey    11 年前

    在过去的一年里,我曾尝试过许多解决方案,但在业力的棒球场(以前是测试性的)里,我没有发现任何东西。试试看

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

        5
  •  0
  •   RyanWilcox    14 年前

    您可以使用无头浏览器Rhino在CI机器上运行单元测试。当然,这里的缺点是它找不到特定于浏览器X的bug…但它确实比在您的CI盒上安装2-3个操作系统,以覆盖所有主要平台要好…

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

        6
  •  0
  •   jon077    12 年前

    我用马文和朱尼特给犀牛打电话。它并不优雅,但我使用它来测试基本服务和实用程序代码。

    它需要嘲弄不支持的类,比如XHR和Java库。

    我发现它是最好的用JavaScript(测试等)编写所有代码,并且只使用JUnit来构建组织和钩住CI。

    不过,我想看看JSTESTDRIVER是否能做到这一点。或者摩卡和朱尼特记者。

        7
  •  0
  •   Vivin Paliath    12 年前

    JS Test Runner 是一个很好的解决方案。它使用幻影和量子。