步骤定义

步骤定义是Gherkin语言写的剧本文件和实际被测试的系统之间的粘合剂. 使用 Given, When, Then. 正则表达式中的匹配组匹配到的结果会作为参数传递给步骤定义。

JavaScript
const { Then, When } = require('cucumber');
const assert = require('assert');
const fs = require('fs');
const mzFs = require('mz/fs')
const seleniumWebdriver = require('selenium-webdriver');

//同步
Then(/^the response status is (.*)$/, function (status) {
  assert.equal(this.responseStatus, status)
});

//异步-回调
//
//回调作为额外的参数传入,当步骤的操作执行完后可调用这个回调
Then(/^the file named (.*) is empty$/, function (fileName, callback) {
  fs.readFile(fileName, 'utf8', function(error, contents) {
    if (error) {
      callback(error);
    } else {
      assert.equal(contents, '');
      callback();
    }
  });
});

//异步 - Promise
//
//返回一个Promise. 当这个Promise resolve或者reject时这个步骤完成
When(/^I view my profile$/, function () {
  // Assuming this.driver is a selenium webdriver
  return this.driver.findElement({css: '.profile-link'}).then(function(element) {
    return element.click();
  });
});

定义函数包装器

如果你想用一些额外的逻辑来封装步骤或hook定义,你可以使用setDefinitionFunctionWrapper(fn)。定义函数将在全部加载后但在测试开始运行之前进行封装。一个使用例子是封装生成器(generator)函数以返回一个Promise。Cucumber会做一个额外的包装,以确保功能保留其原有的长度。

JavaScript
// features/step_definitions/file_steps.js
const { Then } = require('cucumber');
const assert = require('assert');
const mzFs = require('mz/fs');

Then(/^the file named (.*) is empty$/, function *(fileName) {
  contents = yield mzFs.readFile(fileName, 'utf8');
  assert.equal(contents, '');
});

JavaScript
// features/support/setup.js
const { setDefinitionFunctionWrapper } = require('cucumber');
const isGenerator = require('is-generator');
const Promise = require('bluebird');

setDefinitionFunctionWrapper(function (fn) {
  if (isGenerator.fn(fn)) {
    return Promise.coroutine(fn);
  } else {
    return fn;
  }
});

Pending的步骤

Pending即有步骤定义但未实现的步骤,标记这种步骤的方式随着返回方式的不同而不同

  • 同步 - 返回 'pending'
  • 异步回调 - 使用参数null, 'pending'执行回调
  • 异步Promise - Promise resolve成'pending',例如return Promise.resolve('pending')

跳过的步骤

标记某个步骤为跳过也将跳过的同一场景中的其余的步骤。

这可用于将场景标记为基于运行时条件跳过。

随着返回方式的不同有不同的标记跳过方式

  • 同步 - 返回 'skipped'
  • 异步回调 - 使用参数 null, 'skipped'调用回调函数
  • 异步Promise - 返回resolve成'skipped'的Promise

results matching ""

    No results matching ""