Skip to content

Latest commit

 

History

History
218 lines (186 loc) · 8.17 KB

4.Testing-测试.md

File metadata and controls

218 lines (186 loc) · 8.17 KB

测试

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

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

如果你想要测试失败:

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();
});

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

提示 测试框架的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

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

扩展Casper进行测试

下面的命令:

$ casperjs test [path]

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

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

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