无法让JSCover和PhantomJS在Cloudbees上运行Jasmine测试

时间:2013-03-29 15:13:34

标签: jenkins jasmine phantomjs cloudbees jscoverage

我目前正在尝试在Web服务器模式下运行JSCover,以确定在PhantomJS无头浏览器中执行的Jasmine测试的覆盖范围。我也在使用grunt + nodejs开始测试。

我在gruntfile中用来启动JSCover服务器并执行phantomJS的代码是:

// Start JSCover Server
var childProcess = require('child_process'),
var JSCOVER_PORT = "43287";
var JAVA_HOME = process.env.JAVA_HOME;

var jsCoverChildArgs = [
        "-jar", "src/js/test/tools/JSCover-all.jar",
        "-ws",
        "--branch",
        "--port="+JSCOVER_PORT,
        "--document-root=./",
        "--report-dir=target/",
        "--no-instrument=src/js/lib/",
        "--no-instrument=src/js/test/",
        "--no-instrument=src/js/test/lib/"
    ];

var jsCoverProc = childProcess.spawn(JAVA_HOME + "/bin/java", jsCoverChildArgs);

// Start PhantomJS
var phantomjs = require('phantomjs'),
var binPath = phantomjs.path,

var childArgs = [
        'src/js/test/lib/phantomjs_jasminexml_runner.js',
        'http://localhost:'+JSCOVER_PORT+'/src/js/test/SpecRunner.html',
        'target/surefire-reports'
    ];
runner = childProcess.execFile(binPath, childArgs);

runner.on('exit', function (code) {
    // Tests have finished, so clean up the process
    var success = (code === 0) ? true : false;
    jsCoverProc.kill(); // kill the JSCover server now that we are done with it

    done(success);
}); 

但是,当我在cloudbees中的Jenkins节点上运行Web服务器然后对它运行phantomjs时,我收到以下错误之一:

  • 有些测试开始运行,但过程失败了:

    A spec : should be able to have a mock lo-dash ... 
    Warning: Task "test" failed. Use --force to continue.
    
    Aborted due to warnings.
    Build step 'Execute shell' marked build as failure
    Recording test results
    Finished: FAILURE
    
  • PhantomJS无法访问JSCover服务器:

    Running "test" task
    phantomjs> Could not load 'http://127.0.0.1:43287/src/js/test/SpecRunner.html'.
    Warning: Task "test" failed. Use --force to continue.
    

对于第二个错误,我尝试使用我设置的不同端口和主机名(例如,127.0.0.1或localhost用于主机名,4327,43287等用于端口)。这些端口在构建时没有动态设置 - 我在我的grunt脚本中对它们进行了硬编码。

有关上述错误可能发生的原因或者为什么我在Cloudbees Jenkins节点上运行和访问JSCover服务器时出现问题(但从不在我的本地计算机上)的任何想法?

2 个答案:

答案 0 :(得分:3)

因此,当您使用任何进程执行JSCover时,需要时间才能启动。如果我们预期它会更早出现,那么错误肯定会出现。

引用伟大的文章:http://blog.johnryding.com/post/46757192364/javascript-code-coverage-with-phantomjs-jasmine-and

  

现在我有一个符合我所有要求的代码覆盖工具,   最后一部分是让这段代码作为我们Jenkins构建的一部分运行   (使用grunt脚本)。这很容易运行,但我   遇到两个始终破坏我的构建的错误:

     
      
  1. 有时phantomJS无法连接到JSCover服务器
  2.   
  3. 有时phantomJS会连接到服务器,但在运行期间随后放弃执行我的测试。
  4.   

这些是非常奇怪的问题,只发生在我的团队的Jenkins节点上并且难以诊断 - 即使它们被证明是简单的修复。

对于问题1,该错误是我的grunt脚本在执行phantomJS之前没有等待JSCover启动的结果。

对于第二个问题,事实证明我的团队正在使用一个特殊的jasmine测试运行器来帮助在测试完成后生成XML文件。这个文件的问题在于它有一个等待Jasmine完成执行的函数,但在放弃运行测试之前使用了极短的超时。这是Jenkins + JSCover的问题,因为现在加载和运行测试需要更长的时间,因为它们必须从Web服务器而不是直接从文件系统加载。幸运的是,这个修复就像增加超时一样简单。

答案 1 :(得分:1)

我想说你需要在产生JSCover之后等待一段时间 - 过去我在生成时已经用webdriver做了一些事情,然后等待它可用(理想情况下你可以寻找响应和睡眠,重复,直到产生的过程准备就绪)。

即在继续之前从127.0.0.1:43287寻找有效的http响应(无论“有效”意味着服务器已启动)。