Hooks

Hooks(钩子) 用于在每个场景之前和之后设置和清理环境。有关传递给Hooks的第一个参数的规范,请参阅 API参考. 如果定义了多个Before hooks,会按它们被定义的顺序执行。多个 After hooks 按照它们被定义的相反顺序执行.

  1. var {After, Before} = require('cucumber');
  2. // 同步
  3. Before(function () {
  4. this.count = 0;
  5. });
  6. // 异步回调
  7. Before(function (testCase, callback) {
  8. var world = this;
  9. tmp.dir({unsafeCleanup: true}, function(error, dir) {
  10. if (error) {
  11. callback(error);
  12. } else {
  13. world.tmpDir = dir;
  14. callback();
  15. }
  16. });
  17. });
  18. //异步Promise
  19. After(function () {
  20. // 假设 this.driver 是 selenium webdriver 实例
  21. return this.driver.quit();
  22. });

标记的 hooks

Hooks 可以根据场景的标签有条件地选择执行。

  1. var {After, Before} = require('cucumber');
  2. Before(function () {
  3. //该hook会在所有场景之前执行
  4. });
  5. Before({tags: "@foo"}, function () {
  6. //该hook在使用@foo标记的场景之前执行
  7. });
  8. Before({tags: "@foo and @bar"}, function () {
  9. //这个hook将在使用@foo和@bar标记的场景之前执行
  10. });
  11. Before({tags: "@foo or @bar"}, function () {
  12. //这个钩子将在使用@foo或@bar标记的场景之前执行
  13. });
  14. //只有在指定标签时才可以使用下面的简写形式
  15. Before("@foo", function () {
  16. //这个钩子将在使用@foo标记的场景之前执行
  17. });

查看更多关于 标签表达式的文档

使用Before Hook跳过场景

如果你需要使用Before hook强制性地跳过测试,可以使用 跳过步骤定义的任何构造来完成此操作

这包括使用:同步返回,异步回调或异步Promise

  1. // 同步
  2. Before(function() {
  3. // 执行某些运行时检查,以决定是否跳过当前的场景
  4. return 'skipped'
  5. });

BeforeAll / AfterAll

如果您需要在所有场景之前或之后完成一些设置/清除工作,请使用BeforeAll / AfterAll。像hooks和步骤一样,这些可以是同步的、接受回调函数或返回一个Promise。

不同于Before / After,这些方法不会有world实例,即this指针指向的对象。虽然每个场景都有自己的world实例,BeforeAll / AfterAll hooks在所有场景之前/之后运行,因此没有world实例。

  1. var {AfterAll, BeforeAll} = require('cucumber');
  2. //同步
  3. BeforeAll(function () {
  4. //执行一些共享设置
  5. });
  6. //异步回调
  7. BeforeAll(function (callback) {
  8. //执行一些共享设置
  9. //执行回调(可选地在完成时传递出错信息)
  10. });
  11. //通过Promise异步
  12. AfterAll(function () {
  13. //执行一些共享清理
  14. return Promise.resolve()
  15. });