使用 Mocha 作为测试运行器

概述

在 Nightwatch 2 中,集成的 Mocha 运行器已升级为使用 **Mocha v9**,并且实现也已更新以匹配 Nightwatch 在其自己的默认测试运行器中提供的大多数功能,例如使用标签或全局测试钩子的能力。

为什么选择 Mocha?

即使 Nightwatch 从版本 1.3 开始就支持使用 BDD describe 接口编写测试,但考虑到 Mocha 极高的知名度、悠久的历史和易用性,它仍然是一个有吸引力的选择。

Mocha 对高级报告的支持仍然是无与伦比的,因此我们竭尽全力确保 Mocha 与 Nightwatch 2 的配合更佳。

配置

为了在 Nightwatch 中使用 Mocha,您需要设置 test_runner 配置属性并将类型设置为 mocha。还可以指定 Mocha 的自定义选项

nightwatch.conf.js
{
  // other settings...
  test_runner: {
    type : 'mocha',
    options : {
      ui : 'bdd',
      reporter : 'list'
    }
  }
}

或者简单地

nightwatch.conf.js
{
  test_runner : 'mocha'
}

可以在 这里找到支持的 Mocha 选项的完整列表。

也可以在测试环境级别指定 test_runner 选项

nightwatch.conf.js
{
  test_settings : {
    default: {
      test_runner: 'default'
    },
    
mocha_tests: { test_runner : { type : "mocha", options : { ui : "bdd", reporter : "list" } } } } }

CLI 选项

Nightwatch 支持一些作为主 nightwatch CLI 工具的参数指定的 Mocha 特定 CLI 选项。其中一些(如 retries)在 Nightwatch 中也有定义的行为,当使用 Mocha 时,Nightwatch 将委派它们。

以下是目前支持的参数列表

  • --reporter
  • --grep
  • --fail-fast - 在 Mocha 中定义为 --bail
  • --retries
  • --fgrep
  • --invert

示例:

npx nightwatch examples/tests/ --reporter mochawesome

扩展 describe() 语法

Nightwatch 2 中的新 Mocha 支持已构建为尽可能匹配 内置 Nightwatch describes() 语法 中提供的扩展语法。

以下是使用 Mocha 在 Nightwatch 中可用的完整语法

describe('homepage test with describe', function() {
  // All current settings are available via this.settings
  // console.log('Settings', this.settings);
  
// All current cli arguments are available via this.argv // console.log('argv', this.argv);
// The current mocha options object // console.log('mochaOptions', this.mochaOptions);
// All current globals are available via this.globals // console.log('globals', this.globals);
// testsuite specific capabilities // this.desiredCapabilities = {};
// Enable this if the current test is a unit/integration test (i.e. no Webdriver session will be created) // this.unitTest = false
// Set this to false if you'd like the browser window to be kept open in case of a failure or error (useful for debugging) // this.endSessionOnFail = true
// Set this to false if you'd like the rest of the test cases/test steps to be executed in the event of an assertion failure/error // this.skipTestcasesOnFail = true
// this.suiteRetries(2);
// Control the assertion and element commands timeout until when an element should be located or assertion passed // this.waitForTimeout(1000)
// Control the unit test timeout // this.timeout(1000)
// Controll the polling interval between re-tries for assertions or element commands // this.waitForRetryInterval(100);
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 xit() it.skip('async testcase', async browser => { const result = await browser.getText('#navigation'); console.log('result', result.value) });
after(browser => browser.end()); });

示例

使用 Mocha 编写测试与在 Nightwatch 中编写测试相同。每个测试用例都会收到 browser 对象,hooks 也会收到一个用于异步操作的 done 回调函数。

tests/sampleTest.js
describe('Google demo test for Mocha', function() {
  
describe('with Nightwatch', function() {
before(function(browser, done) { done(); });
after(function(browser, done) { browser.end(function() { done(); }); });
afterEach(function(browser, done) { done(); });
beforeEach(function(browser, done) { done(); });
it('uses BDD to run the Google simple test', function(browser) { browser .url('https://google.com') .expect.element('body').to.be.present.before(1000);
browser.setValue('input[type=text]', ['nightwatch', browser.Keys.ENTER]) .pause(1000) .assert.containsText('#main', 'Night Watch'); }); }); });

使用 mochawesome 报告器

Mochawesome 是一个非常流行的自定义报告器,用于与 Mocha 配合使用,并且在使用 Mocha 作为测试运行器时,它也可以与 Nightwatch 配合使用。

要使用 Mochawesome,只需使用上述信息将 Mocha 配置为 test_runner,然后使用 NPM 安装它

npm i mochawesome --save-dev

要将其用作报告器,只需传递 --reporter mochawesome 参数,如下所示

npx nightwatch examples/tests/ --reporter mochawesome

配置报告器选项

可以在主 Nightwatch 配置中的 reporterOptions 字典(位于 test_runner 内)中定义 Mochawesome 报告器选项

nightwatch.conf.js

{
  // ...
  test_runner: {
    type : 'mocha',
    options : {
      ui : 'bdd',
      reporter : 'mochawesome',
      reporterOptions: {
        reportDir: './output'
      }
    }
  }
}

并行运行

当使用测试工作进程并行运行测试时,您需要安装 mochawesome 需要的一些额外软件包

npm install mochawesome-report-generator mochawesome-merge --save-dev

使用 mocha-junit-reporter

当使用 Mocha 时,Nightwatch 的默认内置 JUnit 报告器不可用,但可以使用流行的 mocha-junit-reporter 作为完美替代。

您只需从 NPM 安装它,它就可以正常运行。如果需要,您可以选择以与 mochawesome 报告器相同的方式配置其设置

nightwatch.conf.js
{
  // ...
  test_runner: {
    type : 'mocha',
    options : {
      reporterOptions: {
        reportDir: './output'
      }
    }
  }
}
npm i mocha-junit-reporter --save-dev

要将其用作报告器,只需传递 --reporter mocha-junit-reporter 参数,如下所示

npx nightwatch examples/tests/ --reporter mocha-junit-reporter