步骤定义

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

  1. var {Then, When} = require('cucumber');
  2. var assert = require('assert');
  3. var fs = require('fs');
  4. var mzFs = require('mz/fs')
  5. var seleniumWebdriver = require('selenium-webdriver');
  6. //同步
  7. Then(/^the response status is (.*)$/, function (status) {
  8. assert.equal(this.responseStatus, status)
  9. });
  10. //异步-回调
  11. //
  12. //回调作为额外的参数传入,当步骤的操作执行完后可调用这个回调
  13. Then(/^the file named (.*) is empty$/, function (fileName, callback) {
  14. fs.readFile(fileName, 'utf8', function(error, contents) {
  15. if (error) {
  16. callback(error);
  17. } else {
  18. assert.equal(contents, '');
  19. callback();
  20. }
  21. });
  22. });
  23. //异步 - Promise
  24. //
  25. //返回一个Promise. 当这个Promise resolve或者reject时这个步骤完成
  26. When(/^I view my profile$/, function () {
  27. // Assuming this.driver is a selenium webdriver
  28. return this.driver.findElement({css: '.profile-link'}).then(function(element) {
  29. return element.click();
  30. });
  31. });

定义函数包装器

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

  1. // features/step_definitions/file_steps.js
  2. var {Then} = require('cucumber');
  3. var assert = require('assert');
  4. var mzFs = require('mz/fs');
  5. Then(/^the file named (.*) is empty$/, function *(fileName) {
  6. contents = yield mzFs.readFile(fileName, 'utf8');
  7. assert.equal(contents, '');
  8. });
  9. // features/support/setup.js
  10. var {setDefinitionFunctionWrapper} = require('cucumber');
  11. var isGenerator = require('is-generator');
  12. var Promise = require('bluebird');
  13. setDefinitionFunctionWrapper(function (fn) {
  14. if (isGenerator.fn(fn)) {
  15. return Promise.coroutine(fn);
  16. } else {
  17. return fn;
  18. }
  19. });

Pending的步骤

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

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

跳过的步骤

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

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

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

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