tester模块

Casper附带一个测试器模块和一个Tester类,提供用于单元和功能测试的API。默认情况下,您可以通过任何Casper类实例的测试属性来访问此类的实例。

提示

学习如何使用Tester API并且看到它如何运作的最好方法可能是去看看CasperJS自己的测试套件。

tester原型

assert()

调用方法:assert(Boolean condition[, String message])

断言所提供的条件严格解决为布尔值ture。

  1. casper.test.assert(true, "true's true");
  2. casper.test.assert(!false, "truth is out");
提示

同样也去看看类似的assertNot()函数。

assertDoesntExist()

调用方法: assertDoesntExist(String selector[, String message])

断言在远程DOM环境中不存在与提供的选择器表达式匹配的元素:

  1. casper.test.begin('assertDoesntExist() tests', 1, function(test) {
  2. casper.start().then(function() {
  3. this.setContent('<div class="heaven"></div>');
  4. test.assertDoesntExist('.taxes');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });
提示

同样也去看看类似的assertExists()函数。

assertEquals()

调用方法:assertEquals(mixed testValue, mixed expected[, String message])

断言两个值是严格等价的:

  1. casper.test.begin('assertEquals() tests', 3, function(test) {
  2. test.assertEquals(1 + 1, 2);
  3. test.assertEquals([1, 2, 3], [1, 2, 3]);
  4. test.assertEquals({a: 1, b: 2}, {a: 1, b: 2});
  5. test.done();
  6. });
提示

同样也去看看类似的assertNotEquals()函数。

assertEval()

调用方法:assertEval(Function fn[, String message, Mixed arguments])

断言远程DOM中的代码评估严格解决为布尔值ture:

  1. casper.test.begin('assertEval() tests', 1, function(test) {
  2. casper.start().then(function() {
  3. this.setContent('<div class="heaven">beer</div>');
  4. test.assertEval(function() {
  5. return __utils__.findOne('.heaven').textContent === 'beer';
  6. });
  7. }).run(function() {
  8. test.done();
  9. });
  10. });

assertEvalEquals()

调用方法: assertEvalEquals(Function fn, mixed expected[, String message, Mixed arguments])

断言远程DOM中的代码评估结果严格等于期望值:

  1. casper.test.begin('assertEvalEquals() tests', 1, function(test) {
  2. casper.start().then(function() {
  3. this.setContent('<div class="heaven">beer</div>');
  4. test.assertEvalEquals(function() {
  5. return __utils__.findOne('.heaven').textContent;
  6. }, 'beer');
  7. }).run(function() {
  8. test.done();
  9. });
  10. });

assertElementCount()

调用方法: assertElementCount(String selector, Number count[, String message])

断言选择器表达式匹配给定数量的元素:

  1. casper.test.begin('assertElementCount() tests', 3, function(test) {
  2. casper.start().then(function() {
  3. this.page.content = '<ul><li>1</li><li>2</li><li>3</li></ul>';
  4. test.assertElementCount('ul', 1);
  5. test.assertElementCount('li', 3);
  6. test.assertElementCount('address', 0);
  7. }).run(function() {
  8. test.done();
  9. });
  10. });

assertExists()

调用方法: assertExists(String selector[, String message])

断言在远程DOM环境中存在与提供的选择器表达式匹配的元素:

  1. casper.test.begin('assertExists() tests', 1, function(test) {
  2. casper.start().then(function() {
  3. this.setContent('<div class="heaven">beer</div>');
  4. test.assertExists('.heaven');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });
提示

同时建议你看看这个类似的函数assertDoesntExist()。

assertFalsy()

调用方法: assertFalsy(Mixed subject[, String message])

版本1.0新增

断言某个对象为假值。

提示

同时建议你看看这个类似的函数assertTruthy()。

assertField()

调用方法: assertField(String|Object input, String expected[, String message, Object options])

通过name属性或选择器表达式选定表单域,并断言给定的表单域的值和提供的值相同:

  1. casper.test.begin('assertField() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. this.fill('form[name="gs"]', { q: 'plop' }, false);
  4. test.assertField('q', 'plop');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });
  9. // Path usage with type 'css'
  10. casper.test.begin('assertField() tests', 1, function(test) {
  11. casper.start('http://www.google.fr/', function() {
  12. this.fill('form[name="gs"]', { q: 'plop' }, false);
  13. test.assertField({type: 'css', path: '.q.foo'}, 'plop');
  14. }).run(function() {
  15. test.done();
  16. });
  17. });

版本1.0新增

该方法也可以使用在selecttextarea等文本域中了。

版本1.1新增

options参数允许设置与ClientUtils#getFieldValue()一起使用的选项。

输入参数将检测是否传入一个type与xpath或css和与它一起指定的属性路径。

assertFieldName()

调用方法: assertFieldName(String inputName, String expected[, String message, Object options])

版本1.1-beta3新增

断言给定的表单域具有提供的值。

  1. casper.test.begin('assertFieldName() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. this.fill('form[name="gs"]', { q: 'plop' }, false);
  4. test.assertFieldName('q', 'plop', 'did not plop', {formSelector: 'plopper'});
  5. }).run(function() {
  6. test.done();
  7. });
  8. });

assertFieldCSS()

调用方法:assertFieldCSS(String cssSelector, String expected, String message)

版本1.1新增

断言给定的表单字段具有给定的CSS选择器提供的值

  1. casper.test.begin('assertFieldCSS() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. this.fill('form[name="gs"]', { q: 'plop' }, false);
  4. test.assertFieldCSS('q', 'plop', 'did not plop', 'input.plop');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });

assertFieldXPath()

调用方法:assertFieldXPath(String xpathSelector, String expected, String message)

版本1.1新增

断言给定的表单域具有提供给XPath选择器的值:

  1. casper.test.begin('assertFieldXPath() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. this.fill('form[name="gs"]', { q: 'plop' }, false);
  4. test.assertFieldXPath('q', 'plop', 'did not plop', '/html/body/form[0]/input[1]');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });

assertHttpStatus()

调用方法:assertHttpStatus(Number status[, String message])

断言当前的HTTP状态代码与作为参数传递的状态代码相同:

  1. casper.test.begin('casperjs.org is up and running', 1, function(test) {
  2. casper.start('http://casperjs.org/', function() {
  3. test.assertHttpStatus(200);
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertMatch()

调用方法:assertMatch(mixed subject, RegExp pattern[, String message])

断言所提供的字符串与提供的JavaScript RegExp模式匹配:

  1. casper.test.assertMatch('Chuck Norris', /^chuck/i, 'Chuck Norris\' first name is Chuck');
提示

建议你也去看看类似的assertUrlMatch()和assertTitleMatch()函数。

assertNot()

调用方法:assertNot(mixed subject[, String message])

断言传入的对象为一个假值(falsy)。

  1. casper.test.assertNot(false, "Universe is still operational");

assertNotEquals()

调用方法:assertNotEquals(mixed testValue, mixed expected[, String message])

版本0.6.7新增

断言两个值非严格相等。

  1. casper.test.assertNotEquals(true, "true");

assertNotVisible()

调用方法:assertNotVisible(String selector[, String message])

断言匹配提供的选择器表达式的元素不可见:

  1. casper.test.begin('assertNotVisible() tests', 1, function(test) {
  2. casper.start().then(function() {
  3. this.setContent('<div class="foo" style="display:none>boo</div>');
  4. test.assertNotVisible('.foo');
  5. }).run(function() {
  6. test.done();
  7. });
  8. });

assertRaises()

调用方法:assertRaises(Function fn, Array args[, String message])

断言用给定的参数调用提供的函数引发一个javascript错误:

  1. casper.test.assertRaises(function(throwIt) {
  2. if (throwIt) {
  3. throw new Error('thrown');
  4. }
  5. }, [true], 'Error has been raised.');
  6. casper.test.assertRaises(function(throwIt) {
  7. if (throwIt) {
  8. throw new Error('thrown');
  9. }
  10. }, [false], 'Error has been raised.'); // fails

assertSelectorDoesntHaveText()

调用方法:assertSelectorDoesntHaveText(String selector, String text[, String message])

断言给定的文本在所有与提供的选择器表达式匹配的元素中不存在:

  1. casper.test.begin('assertSelectorDoesntHaveText() tests', 1, function(test) {
  2. casper.start('http://google.com/', function() {
  3. test.assertSelectorDoesntHaveText('title', 'Yahoo!');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertResourceExists()

调用方法:assertResourceExists(Function testFx[, String message])

testFx函数针对所有加载的资源执行,当至少有一个资源匹配时测试通过:

  1. casper.test.begin('assertResourceExists() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertResourceExists(function(resource) {
  4. return resource.url.match('logo3w.png');
  5. });
  6. }).run(function() {
  7. test.done();
  8. });
  9. });

简写版:

  1. casper.test.begin('assertResourceExists() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertResourceExists('logo3w.png');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });
提示

去看看这个类似的Casper.resourceExists()函数吧.

assertTextExists()

调用方法:assertTextExists(String expected[, String message])

断言body标签的文本中含有给定的字符串:

  1. casper.test.begin('assertTextExists() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertTextExists('google', 'page body contains "google"');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertTextDoesntExist()

调用方法:assertTextDoesntExist(String unexpected[, String message])

版本1.0新增
断言body标签的文本中不含有给定的字符串:

  1. casper.test.begin('assertTextDoesntExist() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertTextDoesntExist('bing', 'page body does not contain "bing"');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertTitle()

调用方法:assertTitle(String expected[, String message])

断言远程页面的标题等于预期的标题:

  1. casper.test.begin('assertTitle() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertTitle('Google', 'google.fr has the correct title');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertTitleMatch()

调用方法:assertTitleMatch(RegExp pattern[, String message])

断言远程页面的标题与提供的RegExp模式匹配:

  1. casper.test.begin('assertTitleMatch() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertTitleMatch(/Google/, 'google.fr has a quite predictable title');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertType()

调用方法:assertType(mixed input, String type[, String message])

断言提供的输入是给定的类型:

  1. casper.test.begin('assertType() tests', 1, function suite(test) {
  2. test.assertType(42, "number", "Okay, 42 is a number");
  3. test.assertType([1, 2, 3], "array", "We can test for arrays too!");
  4. test.done();
  5. });
注意

类型名称总是以小写字母表示。

assertInstanceOf()

调用方法:assertInstanceOf(mixed input, Function constructor[, String message])

版本1.1新增

断言所提供的输入属于给定构造函数的:

  1. function Cow() {
  2. this.moo = function moo() {
  3. return 'moo!';
  4. };
  5. }
  6. casper.test.begin('assertInstanceOf() tests', 2, function suite(test) {
  7. var daisy = new Cow();
  8. test.assertInstanceOf(daisy, Cow, "Ok, daisy is a cow.");
  9. test.assertInstanceOf(["moo", "boo"], Array, "We can test for arrays too!");
  10. test.done();
  11. });

assertUrlMatch()

调用方法:assertUrlMatch(Regexp pattern[, String message])

断言当前页面的url匹配提供的RegExp模式:

  1. casper.test.begin('assertUrlMatch() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertUrlMatch(/^http:\/\//, 'google.fr is served in http://');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertVisible()

调用方法:assertVisible(String selector[, String message])

断言至少有一个与提供的选择器表达式匹配的元素是可见的:

  1. casper.test.begin('assertVisible() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertVisible('h1');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

assertAllVisible()

调用方法:assertAllVisible(String selector[, String message])

断言所有匹配提供的选择器表达式的元素都是可见的:

  1. casper.test.begin('assertAllVisible() tests', 1, function(test) {
  2. casper.start('http://www.google.fr/', function() {
  3. test.assertAllVisible('input[type="submit"]');
  4. }).run(function() {
  5. test.done();
  6. });
  7. });

begin()

调用方法

  • begin(String description, Number planned, Function suite)
  • begin(String description, Function suite)
  • begin(String description, Number planned, Object config)
  • begin(String description, Object config)

版本1.1新增

开始一个<planned>测试套件,套件回调将获取当前的Tester实例作为其第一个参数:

  1. function Cow() {
  2. this.mowed = false;
  3. this.moo = function moo() {
  4. this.mowed = true; // mootable state: don't do that
  5. return 'moo!';
  6. };
  7. }
  8. // unit style synchronous test case
  9. casper.test.begin('Cow can moo', 2, function suite(test) {
  10. var cow = new Cow();
  11. test.assertEquals(cow.moo(), 'moo!');
  12. test.assert(cow.mowed);
  13. test.done();
  14. });
提示

planned参数是特别有用的,以防给定的测试脚本突然中断,让你没有明显的方式知道它和一个错误的成功状态。

一个更异步的例子:

  1. casper.test.begin('Casperjs.org is navigable', 2, function suite(test) {
  2. casper.start('http://casperjs.org/', function() {
  3. test.assertTitleMatches(/casperjs/i);
  4. this.clickLabel('Testing');
  5. });
  6. casper.then(function() {
  7. test.assertUrlMatches(/testing\.html$/);
  8. });
  9. casper.run(function() {
  10. test.done();
  11. });
  12. });
重要提示

done()必须被调用才能终止套件。在进行异步测试时,这是特别重要的,所以确保在所有事情都被执行时调用它。

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

colorize()

调用方法:colorize(String message, String style)

呈现彩色输出。基本上是Casper.Colorizer#colorize()的代理方法。

comment()

调用方法:comment(String message)

将注释式格式的消息写入stdout:

  1. casper.test.comment("Hi, I'm a comment");

done()

调用方法:done()

版本1.1改动:planned参数已被弃用

标记一个以begin()开头的测试套件作为处理过程:

  1. casper.test.begin('my test suite', 2, function(test) {
  2. test.assert(true);
  3. test.assertNot(false);
  4. test.done();
  5. });

异步写法:

  1. casper.test.begin('Casperjs.org is navigable', 2, function suite(test) {
  2. casper.start('http://casperjs.org/', function() {
  3. test.assertTitleMatches(/casperjs/i);
  4. this.clickLabel('Testing');
  5. });
  6. casper.then(function() {
  7. test.assertUrlMatches(/testing\.html$/);
  8. });
  9. casper.run(function() {
  10. test.done();
  11. });
  12. });

error()

调用方法:error(String message)

向stdout写入错误式格式的消息:

  1. casper.test.error("Hi, I'm an error");

fail()

调用方法:fail(String message [, Object option])

将失败的测试条目添加到堆栈:

  1. casper.test.fail("Georges W. Bush");
  2. casper.test.fail("Here goes a really long and expressive message", {name:'shortfacts'});

formatMessage()

调用方法:formatMessage(String message, String style)

格式化消息以突出显示其中的某些部分。只在tester内部使用。

getFailures()

调用方法:getFailures()

版本1.0新增

版本1.1后弃用

检索当前测试套件的失败:

  1. casper.test.assertEquals(true, false);
  2. require('utils').dump(casper.test.getFailures());
  3. casper.test.done();

会返回给你这样的信息:

  1. $ casperjs test test-getFailures.js
  2. Test file: test-getFailures.js
  3. FAIL Subject equals the expected value
  4. # type: assertEquals
  5. # subject: true
  6. # expected: false
  7. {
  8. "length": 1,
  9. "cases": [
  10. {
  11. "success": false,
  12. "type": "assertEquals",
  13. "standard": "Subject equals the expected value",
  14. "file": "test-getFailures.js",
  15. "values": {
  16. "subject": true,
  17. "expected": false
  18. }
  19. }
  20. ]
  21. }
  22. FAIL 1 tests executed, 0 passed, 1 failed.
  23. Details for the 1 failed test:
  24. In c.js:0
  25. assertEquals: Subject equals the expected value
提示

在版本1.1中,你可以通过监听测试失败事件记录测试失败:

  1. var failures = [];
  2. casper.test.on("fail", function(failure) {
  3. failures.push(failure);
  4. });

getPasses()

调用方法:getPasses()

版本1.0新增

版本1.1后弃用

检索当前测试套件中成功测试用例的报告:

  1. casper.test.assertEquals(true, true);
  2. require('utils').dump(casper.test.getPasses());
  3. casper.test.done();

会返回给你这样的信息:

  1. $ casperjs test test-getPasses.js
  2. Test file: test-getPasses.js
  3. PASS Subject equals the expected value
  4. {
  5. "length": 1,
  6. "cases": [
  7. {
  8. "success": true,
  9. "type": "assertEquals",
  10. "standard": "Subject equals the expected value",
  11. "file": "test-getPasses.js",
  12. "values": {
  13. "subject": true,
  14. "expected": true
  15. }
  16. }
  17. ]
  18. }
  19. PASS 1 tests executed, 1 passed, 0 failed.
提示

在版本1.1中,您可以通过听取测试成功事件来记录测试成功:

  1. var successes = [];
  2. casper.test.on("success", function(success) {
  3. successes.push(success);
  4. });

info()

调用方法:info(String message)

将信息样式格式的消息写入标准输出:

  1. casper.test.info("Hi, I'm an informative message.");

pass()

调用方法:pass(String message)

将成功的测试条目添加到堆栈中:

  1. casper.test.pass("Barrack Obama");

renderResults()

调用方法:renderResults(Boolean exit, Number status, String save)

渲染测试结果,将结果保存在一个XUnit格式的文件中,并可以选择退出phantomjs:

  1. casper.test.renderResults(true, 0, 'test-results.xml');
提示

在使用casperjs测试命令(请参阅测试文档)时,不会调用此方法,它会自动为您执行。

setUp()

调用方法:setUp([Function fn])

定义一个在使用begin()定义的每个测试之前执行的函数:

  1. casper.test.setUp(function() {
  2. casper.start().userAgent('Mosaic 0.1');
  3. });

要执行异步操作,请使用done参数:

  1. casper.test.setUp(function(done) {
  2. casper.start('http://foo').then(function() {
  3. // ...
  4. }).run(done);
  5. });
警告

如果您不打算异步使用该方法,则不要指定done参数。

skip()

调用方法:skip(Number nb, String message)

跳过给定数量的计划测试:

  1. casper.test.begin('Skip tests', 4, function(test) {
  2. test.assert(true, 'First test executed');
  3. test.assert(true, 'Second test executed');
  4. test.skip(2, 'Two tests skipped');
  5. test.done();
  6. });

tearDown()

调用方法:tearDown([Function fn])

定义一个在使用begin()定义的每个测试之后执行的函数:

  1. casper.test.tearDown(function() {
  2. casper.echo('See ya');
  3. });

要执行异步操作,请使用done参数:

  1. casper.test.tearDown(function(done) {
  2. casper.start('http://foo/goodbye').then(function() {
  3. // ...
  4. }).run(done);
  5. });
警告

如果您不打算异步使用该方法,则不要指定done参数。