javascript - test - ¿Cómo modularizar los pasos de prueba de CasperJS?
phantomjs (2)
Soy bastante nuevo en CasperJS y he comenzado a crear una suite de prueba. Algunos de los pasos (como iniciar sesión en la aplicación) se reutilizarán mucho, por lo que nos gustaría gestionarlos en archivos de biblioteca (que se incluyen en los archivos de prueba).
Además, tenemos múltiples entornos en ejecución (desarrollo, integración, producción, etc.), por lo que necesitamos parametrizar los pasos de prueba para esto, por lo que será posible pasar parámetros a los módulos.
Busqué en la documentación y en stackoverflow (soy consciente de que hay preguntas similares), pero mis habilidades de Javascript son demasiado limitadas, obviamente, y no pude poner esto en marcha.
Este es mi ejemplo de archivo de prueba:
// 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();
});
});
Y así es como debería ser (o similar):
// 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();
});
});
Solo pon el mismo código en funciones. Hay varias formas de pasar la test
a las funciones. La forma más sencilla es pasarlo como parámetro.
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");
}
Nuevamente, si coloca estas 2 funciones dentro del alcance de la función de suite
, estas funciones obtendrán acceso a la test
automáticamente.
Otra forma es configurarlo como window.test = test;
Dentro de la suite
y la test
estarán disponibles a nivel mundial. Todas las funciones pueden acceder a ella.
Comando:
$ casperjs test ./scenarios/
Archivos:
//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: variables globales y / y controladores de eventos que se pueden usar en cualquier lugar.
También puedes incluir tus funciones (comando), con:
$ casperjs test {...} --incluye = / ruta / a / función1.js, / ruta / a / función2.js
Aquí el ejemplo: https://gist.github.com/n1k0/3813361
Depende de usted si prefiere phantom.injectJS (...) o use las opciones de comando: --pre (llamado antes de todos los scripts), --includes (llamado al principio de cada script, antes de cada uno de hecho).
Las carpetas se ejecutan por orden alfabético, igual para los archivos en carpetas. Puede usar 0_file1.js, 1_file2.js para ordenarlos, pero todos mis scripts de prueba (o scripts de carpetas) se pueden ejecutar individualmente, por lo que no me importa.
Un poco tarde lo se
También puede usar require () nodeLike: módulos personalizados de casperjs .