如何模块化CasperJS测试步骤?

时间:2013-09-09 11:31:12

标签: javascript automated-tests casperjs

我是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();
    });
}); 

2 个答案:

答案 0 :(得分:21)

Factorize 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 = /路径/到/ function1.js,/路径/到/ function2.js

此处示例:https://gist.github.com/n1k0/3813361

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

文件夹按字母顺序执行,文件夹中的文件相同。您可以使用0_file1.js,1_file2.js对它们进行排序,但我的所有测试脚本(或文件夹脚本)都可以单独执行,因此对我来说无关紧要。

我知道有点晚了。

您还可以使用require()nodeLike:Custom casperjs modules

答案 1 :(得分: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全局可用。所有功能都可以访问它。