测试

CasperJS拥有自己的测试框架,并提供一些工具来减轻你测试的负担。

警告
在版本1.1后改变
测试框架的所有API只能在使用casperjs test子命令时使用:

  • 如果你想在CasperJS的测试环境之外使用casper.test属性,你将会得到一个错误。
  • 对于1.1-bata3版本,您不能在此测试环境中覆盖预配置的casper实例。在常见问题模块可以了解更详细的信息。

单元测试

假如我们想要测试一个“沉默的牛”对象:

  1. function Cow() {
  2. this.mowed = false;
  3. this.moo = function moo() {
  4. this.mowed = true; // 让沉默牛能够发出叫声的方法
  5. return 'moo!';
  6. };
  7. }

让我们为它编写一个小小的测试套件:

  1. // cow-test.js
  2. casper.test.begin('Cow can moo', 2, function suite(test) {
  3. var cow = new Cow();
  4. test.assertEquals(cow.moo(), 'moo!');
  5. test.assert(cow.mowed);
  6. test.done();
  7. });

在casperjs的测试子命令中运行这个脚本:

  1. $ casperjs test cow-test.js

理论上你应该得到这样的结果:
img

如果你想要测试失败:

  1. casper.test.begin('Cow can moo', 2, function suite(test) {
  2. var cow = new Cow();
  3. test.assertEquals(cow.moo(), 'BAZINGA!');
  4. test.assert(cow.mowed);
  5. test.done();
  6. });

你就会得到这样的结果:
img

提示
测试框架的API文档在这里哦。

浏览器测试

我们来为google搜索来写一个测试套件吧:

  1. // googletesting.js
  2. casper.test.begin('Google search retrieves 10 or more results', 5, function suite(test) {
  3. casper.start("http://www.google.fr/", function() {
  4. test.assertTitle("Google", "google homepage title is the one expected");
  5. test.assertExists('form[action="/search"]', "main form is found");
  6. this.fill('form[action="/search"]', {
  7. q: "casperjs"
  8. }, true);
  9. });
  10. casper.then(function() {
  11. test.assertTitle("casperjs - Recherche Google", "google title is ok");
  12. test.assertUrlMatch(/q=casperjs/, "search term has been submitted");
  13. test.assertEval(function() {
  14. return __utils__.findAll("h3.r").length >= 10;
  15. }, "google search for \"casperjs\" retrieves 10 or more results");
  16. });
  17. casper.run(function() {
  18. test.done();
  19. });
  20. });

运行这个测试套件:

  1. $ casperjs test googletesting.js

你大概会得到这样的结果:
img

在测试环境中设置Casper选项

由于您必须在测试环境中使用预配置的casper实例,所以你可以通过这种方式来更新其选项:

  1. casper.options.optionName = optionValue; // where optionName is obviously the desired option name
  2. casper.options.clientScripts.push("new-script.js");

高级技巧

Tester#begin()接受函数或对象来描述一个套件,对象选项允许设置setUp()和tearDown()函数。

  1. // cow-test.js
  2. casper.test.begin('Cow can moo', 2, {
  3. setUp: function(test) {
  4. this.cow = new Cow();
  5. },
  6. tearDown: function(test) {
  7. this.cow.destroy();
  8. },
  9. test: function(test) {
  10. test.assertEquals(this.cow.moo(), 'moo!');
  11. test.assert(this.cow.mowed);
  12. test.done();
  13. }
  14. });

测试命令参数和选项

参数

casperjs test命令将把每个传递的参数视为包含测试的文件或目录路径,它将递归扫描任何传递的目录,以搜索* .js或* .coffee文件,并将它们添加到堆栈中。

警告
在写测试代码时你需要考虑下面两种情况:

  • 不能在一个测试文件中创建两个Casper实例。
  • 当套件(或文件)中包含的所有测试都已被执行时,您必须调用Tester.done()。
选项

选项之前一般都包含一个双横线前缀(—):

  • --xunit=<filename> 可以将测试套件的结果输出在一个XUnit XML文件中。
  • --direct--verbose 会直接将log消息输出在控制台中。
  • --log-level=<logLevel> 可以设置log消息的级别(详情在这里)
  • 当所有测试都执行完毕后--auto-exit=no 可以避免直接退出测试进程,这通常允许执行补充操作,但意味着退出casper手动监听和退出测试器事件:
    1. // $ casperjs test --auto-exit=no
    2. casper.test.on("exit", function() {
    3. someTediousAsyncProcess(function() {
    4. casper.exit();
    5. });
    6. });

版本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创建一个没有(美丽)颜色的输出。

示例自定义命令:

  1. $ casperjs test --includes=foo.js,bar.js \
  2. --pre=pre-test.js \
  3. --post=post-test.js \
  4. --direct \
  5. --log-level=debug \
  6. --fail-fast \
  7. test1.js test2.js /path/to/some/test/dir

警告
版本1.1后弃用
--direct选项已经被重命名为--verbose,虽然--direct仍然可以使用,但是它已近被考虑将在未来版本中废弃。

提示
这里有一个demo便于你开始使用涉及某些选项的示例套件。

将结果以XUnit格式输出

CasperJS支持将测试套件的结果导出到XUnit XML文件中,该文件与Jenkins等持续集成工具兼容。要保存测试套件的XUnit日志,请使用--xunit选项:

  1. $ casperjs test googletesting.js --xunit=log.xml

你可以通过传递一个对象到casper.test.fail()函数自定义name属性的值,比如:

  1. casper.test.fail('google search for "casperjs" retrieves 10 or more results', {name: 'result count is 10+'});
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <testsuites duration="1.249">
  3. <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">
  4. <testcase classname="googletesting" name="google homepage title is the one expected" time="0.813"/>
  5. <testcase classname="googletesting" name="main form is found" time="0.002"/>
  6. <testcase classname="googletesting" name="google title is ok" time="0.416"/>
  7. <testcase classname="googletesting" name="search term has been submitted" time="0.017"/>
  8. <testcase classname="googletesting" name="results count is 10+" time="0.001"/>
  9. <failure type="fail">google search for "casperjs" retrieves 10 or more results</failure>
  10. <system-out/>
  11. </testsuite>
  12. </testsuites>

CasperJS自检测

CasperJS拥有自己的功能测试套件,位于test子文件夹中,你可以这样运行它:

  1. $ casperjs selftest

提示
使用测试套件是一个检测你平台bug的一个好方法,如果发生错误,你可以向我们发送错误报告或向我们发送邮件来提问。

扩展Casper进行测试

下面的命令:

  1. $ casperjs test [path]

  1. $ casperjs /path/to/casperjs/tests/run.js [path]

的简写版本,所以如果你想为你的测试扩展Casper的功能,最好选择是编写你自己的程序并从这里扩展casper对象的示例。

提示
你可以在run.js中查看runner的源码