tester 模块
tester模块
Casper附带一个测试器模块和一个Tester类,提供用于单元和功能测试的API。默认情况下,您可以通过任何Casper类实例的测试属性来访问此类的实例。
提示
学习如何使用Tester API并且看到它如何运作的最好方法可能是去看看CasperJS自己的测试套件。
tester原型
assert()
调用方法:assert(Boolean condition[, String message])
断言所提供的条件严格解决为布尔值ture。
casper.test.assert(true, "true's true");
casper.test.assert(!false, "truth is out");
提示
同样也去看看类似的assertNot()函数。
assertDoesntExist()
调用方法: assertDoesntExist(String selector[, String message])
断言在远程DOM环境中不存在与提供的选择器表达式匹配的元素:
casper.test.begin('assertDoesntExist() tests', 1, function(test) {
casper.start().then(function() {
this.setContent('<div class="heaven"></div>');
test.assertDoesntExist('.taxes');
}).run(function() {
test.done();
});
});
提示
同样也去看看类似的assertExists()函数。
assertEquals()
调用方法:assertEquals(mixed testValue, mixed expected[, String message])
断言两个值是严格等价的:
casper.test.begin('assertEquals() tests', 3, function(test) {
test.assertEquals(1 + 1, 2);
test.assertEquals([1, 2, 3], [1, 2, 3]);
test.assertEquals({a: 1, b: 2}, {a: 1, b: 2});
test.done();
});
提示
同样也去看看类似的assertNotEquals()函数。
assertEval()
调用方法:assertEval(Function fn[, String message, Mixed arguments])
断言远程DOM中的代码评估严格解决为布尔值ture:
casper.test.begin('assertEval() tests', 1, function(test) {
casper.start().then(function() {
this.setContent('<div class="heaven">beer</div>');
test.assertEval(function() {
return __utils__.findOne('.heaven').textContent === 'beer';
});
}).run(function() {
test.done();
});
});
assertEvalEquals()
调用方法: assertEvalEquals(Function fn, mixed expected[, String message, Mixed arguments])
断言远程DOM中的代码评估结果严格等于期望值:
casper.test.begin('assertEvalEquals() tests', 1, function(test) {
casper.start().then(function() {
this.setContent('<div class="heaven">beer</div>');
test.assertEvalEquals(function() {
return __utils__.findOne('.heaven').textContent;
}, 'beer');
}).run(function() {
test.done();
});
});
assertElementCount()
调用方法: assertElementCount(String selector, Number count[, String message])
断言选择器表达式匹配给定数量的元素:
casper.test.begin('assertElementCount() tests', 3, function(test) {
casper.start().then(function() {
this.page.content = '<ul><li>1</li><li>2</li><li>3</li></ul>';
test.assertElementCount('ul', 1);
test.assertElementCount('li', 3);
test.assertElementCount('address', 0);
}).run(function() {
test.done();
});
});
assertExists()
调用方法: assertExists(String selector[, String message])
断言在远程DOM环境中存在与提供的选择器表达式匹配的元素:
casper.test.begin('assertExists() tests', 1, function(test) {
casper.start().then(function() {
this.setContent('<div class="heaven">beer</div>');
test.assertExists('.heaven');
}).run(function() {
test.done();
});
});
提示
同时建议你看看这个类似的函数assertDoesntExist()。
assertFalsy()
调用方法: assertFalsy(Mixed subject[, String message])
版本1.0新增
断言某个对象为假值。
提示
同时建议你看看这个类似的函数assertTruthy()。
assertField()
调用方法: assertField(String|Object input, String expected[, String message, Object options])
通过name属性或选择器表达式选定表单域,并断言给定的表单域的值和提供的值相同:
casper.test.begin('assertField() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
this.fill('form[name="gs"]', { q: 'plop' }, false);
test.assertField('q', 'plop');
}).run(function() {
test.done();
});
});
// Path usage with type 'css'
casper.test.begin('assertField() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
this.fill('form[name="gs"]', { q: 'plop' }, false);
test.assertField({type: 'css', path: '.q.foo'}, 'plop');
}).run(function() {
test.done();
});
});
版本1.0新增
该方法也可以使用在select
,textarea
等文本域中了。
版本1.1新增
options参数允许设置与ClientUtils#getFieldValue()一起使用的选项。
输入参数将检测是否传入一个type与xpath或css和与它一起指定的属性路径。
assertFieldName()
调用方法: assertFieldName(String inputName, String expected[, String message, Object options])
版本1.1-beta3新增
断言给定的表单域具有提供的值。
casper.test.begin('assertFieldName() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
this.fill('form[name="gs"]', { q: 'plop' }, false);
test.assertFieldName('q', 'plop', 'did not plop', {formSelector: 'plopper'});
}).run(function() {
test.done();
});
});
assertFieldCSS()
调用方法:assertFieldCSS(String cssSelector, String expected, String message)
版本1.1新增
断言给定的表单字段具有给定的CSS选择器提供的值
casper.test.begin('assertFieldCSS() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
this.fill('form[name="gs"]', { q: 'plop' }, false);
test.assertFieldCSS('q', 'plop', 'did not plop', 'input.plop');
}).run(function() {
test.done();
});
});
assertFieldXPath()
调用方法:assertFieldXPath(String xpathSelector, String expected, String message)
版本1.1新增
断言给定的表单域具有提供给XPath选择器的值:
casper.test.begin('assertFieldXPath() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
this.fill('form[name="gs"]', { q: 'plop' }, false);
test.assertFieldXPath('q', 'plop', 'did not plop', '/html/body/form[0]/input[1]');
}).run(function() {
test.done();
});
});
assertHttpStatus()
调用方法:assertHttpStatus(Number status[, String message])
断言当前的HTTP状态代码与作为参数传递的状态代码相同:
casper.test.begin('casperjs.org is up and running', 1, function(test) {
casper.start('http://casperjs.org/', function() {
test.assertHttpStatus(200);
}).run(function() {
test.done();
});
});
assertMatch()
调用方法:assertMatch(mixed subject, RegExp pattern[, String message])
断言所提供的字符串与提供的JavaScript RegExp模式匹配:
casper.test.assertMatch('Chuck Norris', /^chuck/i, 'Chuck Norris\' first name is Chuck');
提示
建议你也去看看类似的assertUrlMatch()和assertTitleMatch()函数。
assertNot()
调用方法:assertNot(mixed subject[, String message])
断言传入的对象为一个假值(falsy)。
casper.test.assertNot(false, "Universe is still operational");
assertNotEquals()
调用方法:assertNotEquals(mixed testValue, mixed expected[, String message])
版本0.6.7新增
断言两个值非严格相等。
casper.test.assertNotEquals(true, "true");
assertNotVisible()
调用方法:assertNotVisible(String selector[, String message])
断言匹配提供的选择器表达式的元素不可见:
casper.test.begin('assertNotVisible() tests', 1, function(test) {
casper.start().then(function() {
this.setContent('<div class="foo" style="display:none>boo</div>');
test.assertNotVisible('.foo');
}).run(function() {
test.done();
});
});
assertRaises()
调用方法:assertRaises(Function fn, Array args[, String message])
断言用给定的参数调用提供的函数引发一个javascript错误:
casper.test.assertRaises(function(throwIt) {
if (throwIt) {
throw new Error('thrown');
}
}, [true], 'Error has been raised.');
casper.test.assertRaises(function(throwIt) {
if (throwIt) {
throw new Error('thrown');
}
}, [false], 'Error has been raised.'); // fails
assertSelectorDoesntHaveText()
调用方法:assertSelectorDoesntHaveText(String selector, String text[, String message])
断言给定的文本在所有与提供的选择器表达式匹配的元素中不存在:
casper.test.begin('assertSelectorDoesntHaveText() tests', 1, function(test) {
casper.start('http://google.com/', function() {
test.assertSelectorDoesntHaveText('title', 'Yahoo!');
}).run(function() {
test.done();
});
});
assertResourceExists()
调用方法:assertResourceExists(Function testFx[, String message])
testFx函数针对所有加载的资源执行,当至少有一个资源匹配时测试通过:
casper.test.begin('assertResourceExists() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertResourceExists(function(resource) {
return resource.url.match('logo3w.png');
});
}).run(function() {
test.done();
});
});
简写版:
casper.test.begin('assertResourceExists() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertResourceExists('logo3w.png');
}).run(function() {
test.done();
});
});
提示
去看看这个类似的Casper.resourceExists()函数吧.
assertTextExists()
调用方法:assertTextExists(String expected[, String message])
断言body标签的文本中含有给定的字符串:
casper.test.begin('assertTextExists() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertTextExists('google', 'page body contains "google"');
}).run(function() {
test.done();
});
});
assertTextDoesntExist()
调用方法:assertTextDoesntExist(String unexpected[, String message])
版本1.0新增 断言body标签的文本中不含有给定的字符串:
casper.test.begin('assertTextDoesntExist() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertTextDoesntExist('bing', 'page body does not contain "bing"');
}).run(function() {
test.done();
});
});
assertTitle()
调用方法:assertTitle(String expected[, String message])
断言远程页面的标题等于预期的标题:
casper.test.begin('assertTitle() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertTitle('Google', 'google.fr has the correct title');
}).run(function() {
test.done();
});
});
assertTitleMatch()
调用方法:assertTitleMatch(RegExp pattern[, String message])
断言远程页面的标题与提供的RegExp模式匹配:
casper.test.begin('assertTitleMatch() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertTitleMatch(/Google/, 'google.fr has a quite predictable title');
}).run(function() {
test.done();
});
});
assertType()
调用方法:assertType(mixed input, String type[, String message])
断言提供的输入是给定的类型:
casper.test.begin('assertType() tests', 1, function suite(test) {
test.assertType(42, "number", "Okay, 42 is a number");
test.assertType([1, 2, 3], "array", "We can test for arrays too!");
test.done();
});
注意
类型名称总是以小写字母表示。
assertInstanceOf()
调用方法:assertInstanceOf(mixed input, Function constructor[, String message])
版本1.1新增
断言所提供的输入属于给定构造函数的:
function Cow() {
this.moo = function moo() {
return 'moo!';
};
}
casper.test.begin('assertInstanceOf() tests', 2, function suite(test) {
var daisy = new Cow();
test.assertInstanceOf(daisy, Cow, "Ok, daisy is a cow.");
test.assertInstanceOf(["moo", "boo"], Array, "We can test for arrays too!");
test.done();
});
assertUrlMatch()
调用方法:assertUrlMatch(Regexp pattern[, String message])
断言当前页面的url匹配提供的RegExp模式:
casper.test.begin('assertUrlMatch() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertUrlMatch(/^http:\/\//, 'google.fr is served in http://');
}).run(function() {
test.done();
});
});
assertVisible()
调用方法:assertVisible(String selector[, String message])
断言至少有一个与提供的选择器表达式匹配的元素是可见的:
casper.test.begin('assertVisible() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertVisible('h1');
}).run(function() {
test.done();
});
});
assertAllVisible()
调用方法:assertAllVisible(String selector[, String message])
断言所有匹配提供的选择器表达式的元素都是可见的:
casper.test.begin('assertAllVisible() tests', 1, function(test) {
casper.start('http://www.google.fr/', function() {
test.assertAllVisible('input[type="submit"]');
}).run(function() {
test.done();
});
});
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实例作为其第一个参数:
function Cow() {
this.mowed = false;
this.moo = function moo() {
this.mowed = true; // mootable state: don't do that
return 'moo!';
};
}
// unit style synchronous test case
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();
});
提示
planned
参数是特别有用的,以防给定的测试脚本突然中断,让你没有明显的方式知道它和一个错误的成功状态。
一个更异步的例子:
casper.test.begin('Casperjs.org is navigable', 2, function suite(test) {
casper.start('http://casperjs.org/', function() {
test.assertTitleMatches(/casperjs/i);
this.clickLabel('Testing');
});
casper.then(function() {
test.assertUrlMatches(/testing\.html$/);
});
casper.run(function() {
test.done();
});
});
重要提示
done()必须被调用才能终止套件。在进行异步测试时,这是特别重要的,所以确保在所有事情都被执行时调用它。
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();
}
});
colorize()
调用方法:colorize(String message, String style)
呈现彩色输出。基本上是Casper.Colorizer#colorize()
的代理方法。
comment()
调用方法:comment(String message)
将注释式格式的消息写入stdout:
casper.test.comment("Hi, I'm a comment");
done()
调用方法:done()
版本1.1改动:planned参数已被弃用
标记一个以begin()开头的测试套件作为处理过程:
casper.test.begin('my test suite', 2, function(test) {
test.assert(true);
test.assertNot(false);
test.done();
});
异步写法:
casper.test.begin('Casperjs.org is navigable', 2, function suite(test) {
casper.start('http://casperjs.org/', function() {
test.assertTitleMatches(/casperjs/i);
this.clickLabel('Testing');
});
casper.then(function() {
test.assertUrlMatches(/testing\.html$/);
});
casper.run(function() {
test.done();
});
});
error()
调用方法:error(String message)
向stdout写入错误式格式的消息:
casper.test.error("Hi, I'm an error");
fail()
调用方法:fail(String message [, Object option])
将失败的测试条目添加到堆栈:
casper.test.fail("Georges W. Bush");
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后弃用
检索当前测试套件的失败:
casper.test.assertEquals(true, false);
require('utils').dump(casper.test.getFailures());
casper.test.done();
会返回给你这样的信息:
$ casperjs test test-getFailures.js
Test file: test-getFailures.js
FAIL Subject equals the expected value
# type: assertEquals
# subject: true
# expected: false
{
"length": 1,
"cases": [
{
"success": false,
"type": "assertEquals",
"standard": "Subject equals the expected value",
"file": "test-getFailures.js",
"values": {
"subject": true,
"expected": false
}
}
]
}
FAIL 1 tests executed, 0 passed, 1 failed.
Details for the 1 failed test:
In c.js:0
assertEquals: Subject equals the expected value
提示
在版本1.1中,你可以通过监听测试失败事件记录测试失败:
var failures = [];
casper.test.on("fail", function(failure) {
failures.push(failure);
});
getPasses()
调用方法:getPasses()
版本1.0新增
版本1.1后弃用
检索当前测试套件中成功测试用例的报告:
casper.test.assertEquals(true, true);
require('utils').dump(casper.test.getPasses());
casper.test.done();
会返回给你这样的信息:
$ casperjs test test-getPasses.js
Test file: test-getPasses.js
PASS Subject equals the expected value
{
"length": 1,
"cases": [
{
"success": true,
"type": "assertEquals",
"standard": "Subject equals the expected value",
"file": "test-getPasses.js",
"values": {
"subject": true,
"expected": true
}
}
]
}
PASS 1 tests executed, 1 passed, 0 failed.
提示
在版本1.1中,您可以通过听取测试成功事件来记录测试成功:
var successes = [];
casper.test.on("success", function(success) {
successes.push(success);
});
info()
调用方法:info(String message)
将信息样式格式的消息写入标准输出:
casper.test.info("Hi, I'm an informative message.");
pass()
调用方法:pass(String message)
将成功的测试条目添加到堆栈中:
casper.test.pass("Barrack Obama");
renderResults()
调用方法:renderResults(Boolean exit, Number status, String save)
渲染测试结果,将结果保存在一个XUnit格式的文件中,并可以选择退出phantomjs:
casper.test.renderResults(true, 0, 'test-results.xml');
提示
在使用casperjs测试命令(请参阅测试文档)时,不会调用此方法,它会自动为您执行。
setUp()
调用方法:setUp([Function fn])
定义一个在使用begin()定义的每个测试之前执行的函数:
casper.test.setUp(function() {
casper.start().userAgent('Mosaic 0.1');
});
要执行异步操作,请使用done参数:
casper.test.setUp(function(done) {
casper.start('http://foo').then(function() {
// ...
}).run(done);
});
警告
如果您不打算异步使用该方法,则不要指定done参数。
skip()
调用方法:skip(Number nb, String message)
跳过给定数量的计划测试:
casper.test.begin('Skip tests', 4, function(test) {
test.assert(true, 'First test executed');
test.assert(true, 'Second test executed');
test.skip(2, 'Two tests skipped');
test.done();
});
tearDown()
调用方法:tearDown([Function fn])
定义一个在使用begin()定义的每个测试之后执行的函数:
casper.test.tearDown(function() {
casper.echo('See ya');
});
要执行异步操作,请使用done参数:
casper.test.tearDown(function(done) {
casper.start('http://foo/goodbye').then(function() {
// ...
}).run(done);
});
警告
如果您不打算异步使用该方法,则不要指定done参数。