Cucumber简单介绍
简介
cucumber 是一个能够理解用普通语言 描述的测试用例的行为驱动开发(BDD)的自动化测试工具,
其本质上是使用根据正则表达式匹配自然语言,然后依次执行对应的方法,以达到测试的目的。
优点:
-
支持不同的语言,例如Java、.net、Ruby
-
它充当业务与技术间桥梁的角色。可以通过在纯英文文本中创建一个测试用例来实现这一点。
-
它允许在不知道任何代码的情况下编写测试脚本,它允许非程序员参与。
-
由于简单的测试脚本架构,Cucumber提供了代码可重用性
组成
组成:Features、Step_definitions、Cucumber command
Features: 功能
-
基于Gerkins. 支持多种语言,
-
以.features命名
-
每个features包含多个scenarios,每个scenarios包含多个step
Step_definitions
-
根据feature文件中定义的step编写对应的测试代码。
Cucumber command
-
运行:*.feature文件。cucumber会分析feature文件中定义的step,然后去step - definitions寻找相匹配的step,执行step中的代码。
-
对于Cucumber而言,除了顶层的features文件夹是强制性的之外,其它目录结构都不是强制性的,Cucumber将对features文件夹下的所有内容进行扁平化(flatten)处理和首字母排序。具体来说,Cucumber在运行时,首先将递归的执行features文件夹下的所有Ruby文件(其中则包括Step文件),然后通过相同的方式执行Feature文件。但是,如果features文件夹下存在support子文件夹,并且support下有名为env.rb的文件,Cucumber将首先执行该文件,然后执行support下的其它文件,再递归执行featues下的其它文件
组件之间的工作原理如图:
在Cucumber项目中,当我们执行cucumber命令时,会首先执行features/support目录下的几个支持文件:env,hooks,world和transforms。Cucumber的这些系统文件的执行顺序如下图所示:
-
env.rb:通常用于准备环境变量;
-
transforms.rb:用于转换feature描述中需要正则匹配的字符串,通过调用Cucumber::RbSupport::RbDsl的Transform方法,完成字符串到自定义类型的转换;
-
hooks.rb:是一个钩子,其中定义了Before、After与at_exit方法,通过提供block执行场景前、后以及退出执行后的相关逻辑
-
world.rb:World可以看做是Cucumber在每个场景之前所要创建的对象的实例,它使得每一个Step Definition可以调用该实例的方法。World在Cucumber中被定义为方法,接受可变参数mudules,以及一个proc
Gerkin( cucumber的语言输出)
Gherkin是自然语言测试的简单语法。一个完整的测试是由多个step组成的,step即最小单元,如何复用step是非常关键的问题。多个step组成一个Scenario,即一个完整的测试case。多个Scenario组成一个Feature,即一组相关的测试case。
关键字
-
Feature
-
Example(or Scenario)
-
Given,When,Then,And,But(steps)
-
Background
-
Scenario Outline (or Scenario Template)
-
Examples (or Scenarios)
它们的含义与原有自动化测试工具中的概念相同,类比如下:
Cucumber | Unit Test |
---|---|
Feature (功能) | test suite (测试用例集) |
Scenario(情景) | test case (测试用例) |
Given(给定) | setup(创建测试所需环境) |
When(当) | test(触发被测事件) |
Then(则) | assert(断言,验证结果) |
简单例子
cucumber --init create features create features/step_definitions create features/support create features/support/env.rb
Test.feature
其他
多组数据测试
实现多组数据的测试要用到Scenario Outline和Examples这一对关键字
钩子
在很多情况下,我们需要在每个scenario之前(before)和之后(after)执行某些相同的操作
Before: 在每个scenario前执行
After: 在每个scenario后执行
AfterStep: 在每个scenario后执行
我们可以把这些hooks放在features文件夹下面的任何ruby文件里面,但一般推荐的做法是把它们放在features/support/hooks.rb 文件里
另外,Hooks可以被定义任意次。如果在每个scenario之前有十件不同的事需要我们去处理,我们可以定义十个Before 钩子(hooks),他们会按定义的顺序去执行
背景
一般情况下,background代替Before钩子,它们可以为每个scenario创建逻辑的上下文。
Background会在每个scenario之前执行,就像Before钩子一样。但如果存在Before 钩子,那个它们会先于background执行。
当我们有相同的操作时,为了遵守DRY原则,我们可以选择hooks或background。至于选择哪一种方式,取决于当它们明确的出现在feature文件里是否有价值。
Cucumber常见指令
-
--i18n help #查看支持的语言 —高版本cucumber不支持,当前2.4.0版本支持,2.99.0版本不支持
--i18n zh-CN #查看语言支持的关键字 zh-CN, en
-
-t, --tags TAG_EXPRESSION
cucumber --tags @add --tags @two,@three
3.-d, --dry-run
执行feature文件而不执行steps,仅校验了feature的语法
-
-l, --lines LINES
执行指定行对应的用例
-
-f, --format FORMAT
-
-o, --out [FILE|DIR]
文件输出