我是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();
});
});
答案 0 :(得分:21)
命令:
$ 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;
内将其设置为suite
,test
全局可用。所有功能都可以访问它。