17

我对 CasperJS 很陌生,我已经开始创建一个测试套件。一些步骤(如登录应用程序)将被大量重用,因此我们希望在库文件(包含在测试文件中)中管理它们。

另外,我们有多个环境正在运行(开发、集成、生产等),因此我们需要为此参数化测试步骤,以便可以将参数传递给模块。

我搜索了文档和 stackoverflow(我知道有类似的问题),但我的 Javascript 技能显然太有限了,我无法启动并运行它。

这是我的示例测试文件:

// googletesting.js
casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {
    casper.start("http://www.google.fr/", function() {
        test.assertTitle("Google", "google homepage title is the one expected");
        test.assertExists('form[action="/search"]', "main form is found");
        this.fill('form[action="/search"]', {
            q: "casperjs"
        }, true);
    });

    casper.then(function() {
        test.assertTitle("casperjs - Recherche Google", "google title is ok");
        test.assertUrlMatch(/q=casperjs/, "search term has been submitted");
        test.assertEval(function() {
            return __utils__.findAll("h3.r").length >= 10;
        }, "google search for \"casperjs\" retrieves 10 or more results");
    });

    casper.run(function() {
        test.done();
    });
}); 

这就是它应该是什么样子(或类似):

// googletesting2.js
casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {

    doGoogleSearch('casperjs'); // pass a search term
    doChecks();

    casper.run(function() {
        test.done();
    });
}); 
4

2 回答 2

21

分解 CasperJS

命令 :

  $ casperjs test ./scenarios/  

文件:

//login.js, you could also create a js function, var login = function(){...} but i prefer extending, that way i don't mixt js functions and casperjs functions.
casper.login = function (id,password) {
    casper.then(function(){
    this.test.comment('----------------Connexion Only ! : --------------------');
        ...
    });
};

//global.js
var x = require('casper').selectXPath;

casper.on('capture.saved', function(targetFile) {
    this.echo('screen properly done at ' + targetFile);
});
casper.test.on('fail', function() {
    casper.capture('screenshots/fail.png');
});

//test_call_function_login.js
phantom.injectJs( './global.js');   //executed in ccm folder
phantom.injectJs( './_functions/login.js'); 

//or absolute path if you want to execute the test files individually too
phantom.injectJs( 'C:/bin/casperjs/ccm/global.js');
phantom.injectJs( 'C:/bin/casperjs/ccm/_functions/login.js');

//best way to use include for me : you can both execute a folder or a file
phantom.injectJs(fs.workingDirectory + '/../../global.js');

casper.test.begin('\n********* Title suite : ***********\n', 5 , function suite(test) {
    casper.start('http://www.yourUrl.com',function(){
        this.test.assertExists('.search','Search toolbar present');
    })
    .viewport(1200,800)

    .then(function() {
        casper.login("your pseudo","your password");
    })  
    .then(function() {
        this.echo("your tests");
    })  
    .run(function() {
            this.test.comment('----------------------- Steps done ------------------------\n');
            test.done();
    });
});

Global.js :可以在任何地方使用的全局变量或/和事件处理程序。

您也可以包含您的功能(命令),其中:

$ casperjs test {...} --includes=/path/to/function1.js,/path/to/function2.js

这里的例子:https ://gist.github.com/n1k0/3813361

这取决于您是否更喜欢 phantom.injectJS(...) 或使用命令选项:--pre(在所有脚本之前调用),--includes(在每个脚本的开头调用-实际上在每个脚本之前-)。

文件夹按字母顺序执行,文件夹中的文件也是如此。您可以使用 0_file1.js ,1_file2.js 来订购它们,但我所有的测试脚本(或文件夹脚本)都可以单独执行,所以对我来说没关系。

我知道有点晚了。

您还可以使用 require() nodeLike :自定义 casperjs 模块

于 2014-02-18T15:23:00.107 回答
2

只需将相同的代码放入函数中即可。有多种方法可以传递test给函数。最简单的方法是将其作为参数传递。

casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {

    doGoogleSearch(test, 'casperjs'); // pass a search term
    doChecks(test);        

    casper.run(function() {
        test.done();
    });
}); 

function doGoogleSearch (test, q) {
    test.assertTitle("Google", "google homepage title is the one expected");
    test.assertExists('form[action="/search"]', "main form is found");
    this.fill('form[action="/search"]', {
        q: q
    }, true);

}

function doChecks (test) {
    test.assertTitle("casperjs - Recherche Google", "google title is ok");
    test.assertUrlMatch(/q=casperjs/, "search term has been submitted");
    test.assertEval(function() {
        return __utils__.findAll("h3.r").length >= 10;
    }, "google search for \"casperjs\" retrieves 10 or more results");
}

同样,如果您将这两个函数放在函数范围内suite,这些函数将自动访问test.

其他方法是将其设置为window.test = test;内部suitetest并将在全球范围内可用。所有功能都可以访问它。

于 2013-09-16T08:10:41.817 回答