BDD 测试语法
概述
从 Nightwatch 版本 1.3 开始,您可以使用流行的 BDD 接口编写测试。 您无需额外的配置即可使用 BDD 接口。 这些现在开箱即用地得到支持。
您也可以运行使用 BDD describe 和 Exports 接口编写的测试。 在此版本之前,您必须使用 Mocha 测试运行器才能启用此功能,现在无需额外的插件或库即可实现。
Nightwatch 中的 BDD 接口提供以下功能
describe()
/context()
test()
/it()
/specify()
before()
after()
beforeEach()
afterEach()
Nightwatch 目前不支持嵌套的
describe`/`context
声明。 您只能使用 describe
来定义测试套件的名称。示例
describe('Ecosia', function() {
// test() and specify() is also available
it('demo test', function(browser) {
browser
.url('https://www.ecosia.org/')
.setValue('input[type=search]', 'nightwatch')
.click('button[type=submit]')
.assert.containsText('.mainline-results', 'Nightwatch.js')
.end();
});
});
import {NightwatchTests} from 'nightwatch';
const Ecosia: NightwatchTests = {
'demo test': () => {
browser
.url('https://www.ecosia.org/')
.setValue('input[type=search]', 'nightwatch')
.click('button[type=submit]')
.assert.containsText('.mainline-results', 'Nightwatch.js')
.end();
}
};
export default Ecosia;
除了常用的 BDD 语法之外,Nightwatch 还提供了一些方法来定义自己的行为。
测试套件特定的功能
describe('homepage test with describe', function() {
// testsuite specific capabilities
this.desiredCapabilities = {
browserName: 'firefox'
};
it('...', function() {...});
});
测试套件特定的标签
describe('homepage test with describe', function() {
// defining tags using bdd
this.tags = ['login', 'authentication''];
it('...', function() {...});
});
测试套件特定的重试
describe('homepage test with describe', function() {
// how many time to retry a failed testcase inside this test suite
this.retries(3);
// how many times to retry the current test suite in case of an assertion failure or error
this.suiteRetries(2);
it('...', function() {...});
});
完整的 BDD 语法
检索设置
所有当前设置都可通过 this.settings
获取。
describe('homepage test with describe', function() {
console.log('Settings', this.settings);
it('...', function() {
// ...
});
});
所需功能
测试套件特定的功能。
describe('homepage test with describe', function() {
this.desiredCapabilities = {};
it('...', function() {
// ...
});
});
单元测试
如果当前测试是单元/集成测试(即不会创建 Webdriver 会话),则启用此选项;
describe('homepage test with describe', function() {
this.unitTest = true;
it('...', function() {
// ...
});
});
在失败时结束会话
如果希望在出现故障或错误时保持浏览器窗口打开(用于调试),请将其设置为 false
。
describe('homepage test with describe', function() {
this.endSessionOnFail = false
it('...', function() {
// ...
});
});
在失败时跳过其余测试用例
如果希望在断言失败/错误的情况下执行其余测试用例/测试步骤,请将其设置为 false
describe('homepage test with describe', function() {
this.skipTestcasesOnFail = true
it('...', function() {
// ...
});
});
禁用/跳过测试套件
如果希望测试运行器跳过此测试套件,请将其设置为 true
describe('homepage test with describe', function() {
this.disabled = true
it('...', function() {
// ...
});
});
重试
describe('homepage test with describe', function() {
this.retries(3);
this.suiteRetries(2);
it('...', function() {
// ...
});
});
控制断言超时
控制断言和元素命令超时,直到找到元素或断言通过为止
describe('homepage test with describe', function() {
this.timeout(1000)
it('...', function() {
// ...
});
});
控制轮询间隔
控制断言或元素命令重试之间的轮询间隔
describe('homepage test with describe', function() {
this.retryInterval(100);
it('...', function() {
// ...
});
});
定义标签
为该测试套件定义标签。
describe('homepage test with describe', function() {
this.tags = ['login']
it('...', function() {
// ...
});
});
测试函数和钩子
describe('homepage test with describe', function() {
before(function(browser) {
this.homepage = browser.page.home();
});
it('startHomepage', () => {
this.homepage.navigate();
this.homepage.expect.section('@indexContainer').to.be.not.visible;
});
// Run only this testcase
//*
it.only('startHomepage', () => {
this.homepage.navigate();
});
*//
// skipped testcase: equivalent to: test.skip(), it.skip(), and xit()
xtest('async testcase', async browser => {
const result = await browser.getText('#navigation');
console.log('result', result.value)
});
test('version dropdown is enabled', browser => {
const navigation = this.homepage.section.navigation;
const navbarHeader = navigation.section.navbarHeader;
navbarHeader.expect.element('@versionDropdown').to.be.enabled;
});
after(browser => browser.end());
});
示例 Github 仓库
我们已经构建了一个完整的 Github 模板仓库,其中包含几个示例,我们会定期更新,包括一个 Github Actions 工作流程,供您入门。