Nightwatch运行器(Nightwatch Runner)

Nightwatch包含一个命令行运行器,它可以很容易地运行测试并生成有用的输出。关于如何使用测试运行器,有一些不同的选项,这取决于你的安装类型。

Global

如果你已经在全局范围内(-g )安装了Nightwatch,就可以在任何地方使用Nightwatch。

$ nightwatch [source] [options]

项目具体设置

如果你已经把Nightwatch作为你的项目的依赖项安装了,你可以从node_modules/.bin目录下引用了。

Linux and MacOSX:
$ ./node_modules/.bin/nightwatch [source] [options]
Windows:

创建nightwatch.js文件,增加如下一行:

require('nightwatch/bin/runner.js');

然后运行如下:

C:\workspace\project> node nightwatch.js [source] [options]

Tests source

可选的source参数可以是一个或多个文件或整个文件夹。在src_folders去设置。

例子 - 单独文件

$ nightwatch tests/one/firstTest.js

例子 - 两个单独文件

$ nightwatch tests/one/firstTest.js tests/secondTest.js

例子 - 一个单独文件和一个文件夹

$ nightwatch tests/one/test.js tests/utils

命令行选项(Command-line Options)

测试运行器支持许多run-time选项被传递到。请运行以下命令查询更多帮助。

$ nightwatch --help
Name Shortname default description
--config -c ./nightwatch.json 本地nightwatch.json文件。配置文件在运行时使用,也包含了Selenium WebDriver设置选项。
--output -o tests_output 保存JUnit xml报告的位置
--reporter -r junit 预定义报告人或报告人文件位置时用的。
--env -e default 测试环境的定义nightwatch.json
--verbose 在会话期间扩展selenium日志输出
--version -v 显示版本号
--test -t 只运行指定的测试套件/模块。默认情况下会执行src_folders下的所有测试用例。
--testcase 只和--test一起使用。从当前测试套件/模块中运行指定的testcase。
--group -g 只运行指定组的测试,测试以组来划分它们放在同一个子文件夹下。
--skipgroup -s 跳过一个或多个测试组(它们中间以逗号分开)
--filter -f 指定一个过滤器,加载作为文件名格式化来使用。
--tag -a 通过标签来过滤测试模块,只有具体指定标签的测试才会被运行。
--skiptags 跳过有指定标签或标记的测试用例(逗号分隔)。
--retries 重试失败或错误的测试用例的次数达到指定的次数。重新尝试beforEach和afterEach hooks.
--suiteRetries 重试失败或错误的testsuites,直到指定的次数。如果在testsuites中定义了任何一个测试集,那么重新尝试before 和 after hooks

FIXME

Test Groups

可以将你的测试脚本划分到组中,并根据需要运行它们。要将测试组合在一起,只需将它们放在相同的子文件夹中,文件夹的名字即是组的名字。

例如:

lib/
  ├── selenium-server-standalone.jar
custom-commands/
  ├── loginUser.js
  ├── attachPicture.js
tests/
  ├── logingroup
  |   ├── login_test.js
  |   └── otherlogin_test.js
  ├── addressbook
  |   ├── addressbook_test.js
  |   └── contact_test.js
  ├── chat
  |   ├── chatwindow_test.js
  |   ├── chatmessage_test.js
  |   └── otherchat_test.js
  └── smoketests
      ├── smoke_test.js
      └── othersmoke_test.js

如果只运行smoketests组,你可以这样做:

$ nightwatch --group smoketests

同样,如果你想跳过运行smoketests组,你可以这样做:

$ nightwatch --skipgroup smoketests

想跳过多个组,只需要将他们用逗号分隔:

$ nightwatch --skipgroup addressbook,chat

Test Tags

你还可以根据标记对测试进行选择,例如:

module.exports = {
  '@tags': ['login', 'report'],
  'demo login test': function (client) {
     // test code
  }
};

比如你想测试所有关于report的功能,这些功能可能分布在不同的测试用例中,那么直接运行如下命令即可测试report功能:

$ nightwatch --tag report

也可以运行多个标签:

$ nightwatch --tag login --tag report

也可以跳过多个标签:

$ nightwatch --skiptags login,report

Disabling Tests

为了防止测试模块运行,只需将该模块中的禁用属性设置为true,如下:

module.exports = {
  '@disabled': true, // This will prevent the test module from running.

  'sample test': function (client) {
    // test code
  }
};

如果你不想运行已知的失败的测试用例,这是很有用的。

禁用个别方法

目前还不支持禁用单独的testcase。然后如下方式这样写 ''+function 可以将这个方法禁用掉,供参考。

module.exports = {
  'sample test': function (client) {
    // test code
  },

  // disabled
  'other sample test': ''+function (client) {
    // test code
  }
};

并发运行

从v0.5开始nightwatch支持并发测试。通过在命令行中指定多个环境来工作,用逗号分隔。例如:

$ nightwatch -e default,chrome

这样可以在多个相同或是不同的浏览器上运行。

终端输出

每个环境将作为一个单独的child_process运行,输出将被发送到主进程。

为了让输出更容易阅读,Nightwatch默认地缓冲了每个子进程的输出,并在最后显示所有的内容,按环境分组。

如果想禁用输出缓冲,并在发送到输出文档时看到每个子进程的输出,只需在nightwatch.json中将“live_output”:true

你可以在每个浏览器(通过desiredCapabilities)创建一个单独的环境,然后并行地运行它们。此外,使用filter和exclude选项测试可以在每个环境中进行拆分,以便并行运行。

Via Workers

在v0.版本7引入了一个新特性,允许并行运行测试。当启用这个功能时,测试运行器将启动一个可配置的子进程,然后将所加载的测试分发到并行运行。

想启动测试workers,设置test_workers最高级的属性,如下:

"test_workers": {
  "enabled": true,
  "workers": "auto"
}

或者,简单的:

"test_workers": true

worker选项配置可以同时运行多个子进程

  • “auto”——由cpu数量决定,例如4个cpu,意味着4个worker
  • {number} - 指定确切的workers数量

测试并发性是在文件级别完成的。每个测试文件将填充一个测试worker位置。测试文件中的单个测试/步骤不会并发运行。

在并行运行测试时,0.9版本为显示输出提供了改进的支持。建议在测试环境中设置detailed_output to false,以提高输出的可读性。

Using Grunt

Grunt是一个流行的JavaScript任务运行程序。从Nightwatch0.6版本开始,很容易与繁重的任务捆绑在一起,可以在现有的Grunt-based构建配置中运行测试用例

用法

首先,在你的Gruntfile.js的顶部加载Nightwatch grunt任务

module.exports = function(grunt) {
  var nightwatch = require('nightwatch');
  nightwatch.initGrunt(grunt);

  // ...

};

任务配置和目标

Nightwatch任务将有一个或多个目标,可以以多种方式使用,其中一种方法是将它们映射到环境。相关的设置参数:

  • options - 目前可用的唯一选项是cwd - 当前工作目录
  • argv - 命令行参数通常会床底到Nightwatch运行器(例如:env)
  • settings - 测试设置指定为一个单独的Nightwatch环境。

例如:

grunt.initConfig({
  nightwatch: {
    options: {
      cwd: './'
    },

    'default' : {},

    browserstack: {
      argv: {
        env: 'browserstack'
      },
      settings: {
        silent: true
      }
    },

    'all' : {
      argv: {
        env: 'default,browserstack'
      }
    },
  }
});

执行一下任务:

$ grunt nightwatch:default

$ grunt nightwatch:browserstack

如果你感兴趣的话,也可以使用一些Nightwatch第三方的Grunt插件,最受欢迎的是grunt-nightwatch

Using Mocha

Nightwatch从0.8版本开始,与流行的Mocha测试运行器捆绑在一起,它允许使用Mocha运行测试,从而利用它的接口和报告。

用法

有两种主要的方法在Nightwatch中使用Mocha。

Mocha作为一个可选的测试运行器,通过在nightwatch.json中的test_runner来特殊指定。

可以为Mocha定制设置:

{
  ...
  "test_runner" : {
    "type" : "mocha",
    "options" : {
      "ui" : "bdd",
      "reporter" : "list"
    }
  }
  ...
}

或 简单的:

{
  ...
  "test_runner" : "mocha"
  ...
}

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

test_runner也可以在测试环境中指定:

{
  "test_settings" : {
    "mocha_tests" : {
      "test_runner" : {
        "type" : "mocha",
        "options" : {
          "ui" : "tdd",
          "reporter" : "list"
        }
      }
    }
  }
  ...
}

例如:

在Mocha上编写测试与在Nightwatch中编写测试是一样的。每个testcase都接收到client对象,hooks也异步操作接收一个done的回调。

describe('Google demo test for Mocha', function() {

  describe('with Nightwatch', function() {

    before(function(client, done) {
      done();
    });

    after(function(client, done) {
      client.end(function() {
        done();
      });
    });

    afterEach(function(client, done) {
      done();
    });

    beforeEach(function(client, done) {
      done();
    });

    it('uses BDD to run the Google simple test', function(client) {
      client
        .url('http://google.com')
        .expect.element('body').to.be.present.before(1000);

      client.setValue('input[type=text]', ['nightwatch', client.Keys.ENTER])
        .pause(1000)
        .assert.containsText('#main', 'Night Watch');
    });
  });
});

当从Nightwatch使用mocha测试运行器时,一些cli选项是不可用的,比如--retries,--suiteRetries,--reporter。

使用标准的Mocha

使用标准的Mocha运行Nightwatch测试也是可能的,尽管需要更的样板代码,你需要管理selenium服务器。

例如

var nightwatch = require('nightwatch');

describe('Github', function() {
  var client = nightwatch.initClient({
    silent : true
  });

  var browser = client.api();

  this.timeout(99999999);

  before(function() {

    browser.perform(function() {
      console.log('beforeAll')
    });

  });

  beforeEach(function(done) {
    browser.perform(function() {
      console.log('beforeEach')
    });

    client.start(done);
  });


  it('Demo test GitHub', function (done) {
    browser
      .url('https://github.com/nightwatchjs/nightwatch')
      .waitForElementVisible('body', 5000)
      .assert.title('nightwatchjs/nightwatch · GitHub')
      .waitForElementVisible('body', 1000)
      .assert.visible('.container .breadcrumb a span')
      .assert.containsText('.container .breadcrumb a span', 'nightwatch', 'Checking project title is set to nightwatch');

    client.start(done);
  });

  afterEach(function() {
    browser.perform(function() {
      console.log('afterEach')
    });
  });

  after(function(done) {
    browser.end(function() {
      console.log('afterAll')
    });

    client.start(done);
  });

});

results matching ""

    No results matching ""