cucumber java从入门到精通(4)Scenario Outline及数据驱动
来源:互联网 发布:excel数据库函数怎么用 编辑:程序博客网 时间:2024/05/07 15:32
cucumber java从入门到精通(4)Scenario Outline及数据驱动
到目前为止,我们的TodoList类工作良好,不过离我们的预期——任务清单系统还是有不少差距,究其原因不过如下:
- 我们的feature不太完毕,没有测试任务清单的增删改查完成等功能;
- 我们输入的数据太过单一,只测试了1种输入输出的情况;
下面我们将着手解决数据输入太过单一的问题。我们将使用Scenario Outline技术。
什么是Scenario Outline
什么是Scenario Outline呢,我们不妨先去命令行里看一下,在命令行中输入
java -cp "jars/*" cucumber.api.cli.Main --i18n zh-CN
这将得到cucumber关键字的翻译:
| feature | "功能" || background | "背景" || scenario | "场景", "剧本" || scenario_outline | "场景大纲", "剧本大纲" || examples | "例子" || given | "* ", "假如", "假设", "假定" || when | "* ", "当" || then | "* ", "那么" || and | "* ", "而且", "并且", "同时" || but | "* ", "但是" || given (code) | "假如", "假设", "假定" || when (code) | "当" || then (code) | "那么" || and (code) | "而且", "并且", "同时" || but (code) | "但是" |
我们可以看到scenario outline被翻译成了场景大纲或者是剧本大纲。简单来说,场景大纲可以理解为同一个场景同一部戏,内容都一样,台词也一样,只是换了不同的演员来演。每个场景大纲定义了不同的演员列表,该场景的台词是一样,演员的动作也相同,只是每次换不同的演员去表演。所谓铁打的营盘流水的兵。因此,场景大纲里定义了几组演员,这个场景就要演几次。
cucumber的场景大纲不是用来定义演员的,而是用来定义数据的。大纲里定义几组数据,那么该场景就要跑几次。
增加Example
现在我们给我们的feature增加1组测试数据:
#language: zh-CN功能:任务管理 场景大纲: 完成任务 假设 我的任务清单里有<total>个任务 当 我完成<finished>件任务之后 那么 我还剩下<left>件未完成的任务 例子: | total | finished | left | | 3 | 1 | 2 | | 5 | 1 | 4 |
运行一下
run
我们发现cucumber报错了:
#language: zh-CN功能: 任务管理 场景大纲: 完成任务 # todo.feature:5 假设我的任务清单里有<total>个任务 当我完成<finished>件任务之后 那么我还剩下<left>件未完成的任务 例子: 场景大纲: 完成任务 # todo.feature:12 假设我的任务清单里有3个任务 # TodoStep.iHaveSomeTasks(int) 当我完成1件任务之后 # TodoStep.iFinishSomeTasks(int) 那么我还剩下2件未完成的任务 # TodoStep.iLeftSomeTasks(int) 场景大纲: 完成任务 # todo.feature:13 假设我的任务清单里有5个任务 # TodoStep.iHaveSomeTasks(int) java.lang.AssertionError: expected:<3> but was:<5> at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:834) at org.junit.Assert.assertEquals(Assert.java:645) at org.junit.Assert.assertEquals(Assert.java:631) at step_definitions.TodoStep.iHaveSomeTasks(TodoStep.java:15) at ?.假设我的任务清单里有5个任务(todo.feature:6) 当我完成1件任务之后 # TodoStep.iFinishSomeTasks(int) 那么我还剩下4件未完成的任务 # TodoStep.iLeftSomeTasks(int)Failed scenarios:todo.feature:13 # 场景大纲: 完成任务2 Scenarios (1 failed, 1 passed)6 Steps (1 failed, 2 skipped, 3 passed)0m0.166sjava.lang.AssertionError: expected:<3> but was:<5> at org.junit.Assert.fail(Assert.java:88) at org.junit.Assert.failNotEquals(Assert.java:834) at org.junit.Assert.assertEquals(Assert.java:645) at org.junit.Assert.assertEquals(Assert.java:631) at step_definitions.TodoStep.iHaveSomeTasks(TodoStep.java:15) at ?.假设我的任务清单里有5个任务(todo.feature:6)
看起来密密麻麻,实际上的意思就是场景大纲里的第二组数据报错了,我们的TodoList的实现无法满足第二组数据,想想这也是应该的。
在这里要解释一下例子
这个关键字。例子在英文里叫Example,是feature关键字。紧跟在例子后的一半都是1个数据列表,从上文可以看到,一目了然。数据列表有表头,表后下面的行跟着的是测试数据。
Scenario Outline运行流程
Scenario Outline的运行流程就是先从例子里读一行数据,然后根据该数据的column也即是表头,在steps里找到相应的<column>
字段,用具体的数据进行替换。例子里有2行数据这个Scenario就会运行2次。因此我们上面的feature文件实际上是这样运行的:
假设 我的任务清单里有3个任务当 我完成1件任务之后那么 我还剩下2件未完成的任务假设 我的任务清单里有5个任务当 我完成1件任务之后那么 我还剩下4件未完成的任务
重构并让用例通过
我们的用例已经测试出TodoList类的缺陷了,是时候重构一下了,先重构TodoStep.java文件
代码很简单,就不一一解释了。
运行一下
compile && run
结果如下,所有的step都pass了。
#language: zh-CN 功能: 任务管理 场景大纲: 完成任务 # todo.feature:5 假设我的任务清单里有<total>个任务 当我完成<finished>件任务之后 那么我还剩下<left>件未完成的任务 例子: 场景大纲: 完成任务 # todo.feature:12 假设我的任务清单里有3个任务 # TodoStep.iHaveSomeTasks(int) 当我完成1件任务之后 # TodoStep.iFinishSomeTasks(int) 那么我还剩下2件未完成的任务 # TodoStep.iLeftSomeTasks(int) 场景大纲: 完成任务 # todo.feature:13 假设我的任务清单里有5个任务 # TodoStep.iHaveSomeTasks(int) 当我完成1件任务之后 # TodoStep.iFinishSomeTasks(int) 那么我还剩下4件未完成的任务 # TodoStep.iLeftSomeTasks(int) 2 Scenarios (2 passed) 6 Steps (6 passed) 0m0.133s
总结
从上面的例子里我们就可以看出自动化对生产力的提升帮助巨大。假设我们还需要测试100组数据,如果人肉手点的话,那么执行用例的人自然是痛不欲生,而且我们也没有办法完全保证数据输入的准确性,毕竟老虎也会有打盹的时候,何况是人。但是如果用自动化测试的话,增加数据无非就是在数据表中增加一些行,工作量不是特别大,而且可以比较容易的检查出数据是否准确。
像这种以增加输入输出数据的方式增加用例的测试用例设计方法,我们可以称之为数据驱动。
下一节我们将进一步的实现项目工程学上的自动化,我们将使用maven来搭建cucumber项目。
- cucumber java从入门到精通(4)Scenario Outline及数据驱动
- cucumber java从入门到精通(1)初体验
- cucumber java从入门到精通(3)简单实现及断言
- cucumber java从入门到精通(5)使用maven创建cucumber java项目
- cucumber java从入门到精通(2)用代码定义步骤
- JAVA从入门到精通(4)
- (转帖)java从入门到精通
- Java学习从入门到精通 ()
- JAVA从入门到精通(1)
- JAVA从入门到精通(2)
- JAVA从入门到精通(3)
- JAVA从入门到精通
- JAVA从入门到精通
- JAVA从入门到精通
- java 从入门到精通
- Java从入门到精通
- java从入门到精通
- java从入门到精通
- CSDN-markdown编辑器
- javaweb学习总结(四十二)——Filter(过滤器)学习
- 毕业了,我选择开始奋斗
- Scrollview子View为LinearLayout不够一屏留白情况
- javaweb学习总结(四十三)——Filter高级开发
- cucumber java从入门到精通(4)Scenario Outline及数据驱动
- Leetcode 367. Valid Perfect Square 平方数验证
- javaweb学习总结(四十四)——监听器(Listener)学习
- OkHttp 使用
- thinkphp Parse error: syntax error, unexpected T_CONST in /www/web/111_com/public_html/youxicidian/T
- php变量和对象销毁问题
- cucumber java从入门到精通(5)使用maven创建cucumber java项目
- 什么是freemark
- javaweb学习总结(四十五)——监听器(Listener)学习二