测试
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.jscasper.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.jscasper.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 namecasper.options.clientScripts.push("new-script.js");
高级技巧
Tester#begin()接受函数或对象来描述一个套件,对象选项允许设置setUp()和tearDown()函数。
// cow-test.jscasper.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=nocasper.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的源码
