测试
CasperJS拥有自己的测试框架,并提供一些工具来减轻你测试的负担。
警告
在版本1.1后改变
测试框架的所有API只能在使用casperjs test子命令时使用:
- 如果你想在CasperJS的测试环境之外使用casper.test属性,你将会得到一个错误。
- 对于1.1-bata3版本,您不能在此测试环境中覆盖预配置的casper实例。在常见问题模块可以了解更详细的信息。
单元测试
假如我们想要测试一个“沉默的牛”对象:
function Cow() {
this.mowed = false;
this.moo = function moo() {
this.mowed = true; // 让沉默牛能够发出叫声的方法
return 'moo!';
};
}
让我们为它编写一个小小的测试套件:
// cow-test.js
casper.test.begin('Cow can moo', 2, function suite(test) {
var cow = new Cow();
test.assertEquals(cow.moo(), 'moo!');
test.assert(cow.mowed);
test.done();
});
在casperjs的测试子命令中运行这个脚本:
$ casperjs test cow-test.js
理论上你应该得到这样的结果:
如果你想要测试失败:
casper.test.begin('Cow can moo', 2, function suite(test) {
var cow = new Cow();
test.assertEquals(cow.moo(), 'BAZINGA!');
test.assert(cow.mowed);
test.done();
});
你就会得到这样的结果:
提示
测试框架的API文档在这里哦。
浏览器测试
我们来为google搜索来写一个测试套件吧:
// 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();
});
});
运行这个测试套件:
$ casperjs test googletesting.js
你大概会得到这样的结果:
!img
在测试环境中设置Casper选项
由于您必须在测试环境中使用预配置的casper实例,所以你可以通过这种方式来更新其选项:
casper.options.optionName = optionValue; // where optionName is obviously the desired option name
casper.options.clientScripts.push("new-script.js");
高级技巧
Tester#begin()
接受函数或对象来描述一个套件,对象选项允许设置setUp()和tearDown()函数。
// cow-test.js
casper.test.begin('Cow can moo', 2, {
setUp: function(test) {
this.cow = new Cow();
},
tearDown: function(test) {
this.cow.destroy();
},
test: function(test) {
test.assertEquals(this.cow.moo(), 'moo!');
test.assert(this.cow.mowed);
test.done();
}
});
测试命令参数和选项
参数
casperjs test命令将把每个传递的参数视为包含测试的文件或目录路径,它将递归扫描任何传递的目录,以搜索* .js或* .coffee文件,并将它们添加到堆栈中。
警告
在写测试代码时你需要考虑下面两种情况:
- 你不能在一个测试文件中创建两个Casper实例。
- 当套件(或文件)中包含的所有测试都已被执行时,您必须调用Tester.done()。
选项
选项之前一般都包含一个双横线前缀(—):
--xunit=<filename>
可以将测试套件的结果输出在一个XUnit XML文件中。--direct
或--verbose
会直接将log消息输出在控制台中。--log-level=<logLevel>
可以设置log消息的级别(详情在这里)- 当所有测试都执行完毕后
--auto-exit=no
可以避免直接退出测试进程,这通常允许执行补充操作,但意味着退出casper手动监听和退出测试器事件:// $ casperjs test --auto-exit=no
casper.test.on("exit", function() {
someTediousAsyncProcess(function() {
casper.exit();
});
});
版本1.0新增
--includes=foo.js,bar.js
将在执行每个测试文件之前包含foo.js和bar.js文件。--pre = pre-test.js
将在执行整个测试套件之前添加pre-test.js中包含的测试。--post = post-test.js
将在执行整个测试套件之后添加post-test.js中包含的测试。--fail-fast
在遇到第一个错误时会立即终止当前测试套件的运行。--concise
将创建一个更简洁的测试套件的输出。--no-colors
将从casperjs创建一个没有(美丽)颜色的输出。
示例自定义命令:
$ casperjs test --includes=foo.js,bar.js \
--pre=pre-test.js \
--post=post-test.js \
--direct \
--log-level=debug \
--fail-fast \
test1.js test2.js /path/to/some/test/dir
警告
版本1.1后弃用--direct
选项已经被重命名为--verbose
,虽然--direct
仍然可以使用,但是它已近被考虑将在未来版本中废弃。提示
这里有一个demo便于你开始使用涉及某些选项的示例套件。
将结果以XUnit格式输出
CasperJS支持将测试套件的结果导出到XUnit XML文件中,该文件与Jenkins等持续集成工具兼容。要保存测试套件的XUnit日志,请使用--xunit
选项:
$ casperjs test googletesting.js --xunit=log.xml
你可以通过传递一个对象到casper.test.fail()
函数自定义name
属性的值,比如:
casper.test.fail('google search for "casperjs" retrieves 10 or more results', {name: 'result count is 10+'});
<?xml version="1.0" encoding="UTF-8"?>
<testsuites duration="1.249">
<testsuite errors="0" failures="0" name="Google search retrieves 10 or more results" package="googletesting" tests="5" time="1.249" timestamp="2012-12-30T21:27:26.320Z">
<testcase classname="googletesting" name="google homepage title is the one expected" time="0.813"/>
<testcase classname="googletesting" name="main form is found" time="0.002"/>
<testcase classname="googletesting" name="google title is ok" time="0.416"/>
<testcase classname="googletesting" name="search term has been submitted" time="0.017"/>
<testcase classname="googletesting" name="results count is 10+" time="0.001"/>
<failure type="fail">google search for "casperjs" retrieves 10 or more results</failure>
<system-out/>
</testsuite>
</testsuites>
CasperJS自检测
CasperJS拥有自己的功能测试套件,位于test
子文件夹中,你可以这样运行它:
$ casperjs selftest
扩展Casper进行测试
下面的命令:
$ casperjs test [path]
是
$ casperjs /path/to/casperjs/tests/run.js [path]
的简写版本,所以如果你想为你的测试扩展Casper的功能,最好选择是编写你自己的程序并从这里扩展casper对象的示例。
提示
你可以在run.js中查看runner的源码