【五】behave场景大纲Scenario Outline作为参数化实例四
教程4:Scenario Outline 在测试同一个场景时,很多时候我们需要输入各种各样的数据来验证不同的结果输出,这时我们用Scenario Outlines就可以实现了
目标:使用场景大纲作为参数化模板(避免太多类似的场景),
Scenarios Outlines来实现数据驱动,在behave实现数据驱动测试可以使用Scenario Outline这个关键字配合Examples这个关键字使用。 不同的数据会在相同的方法中执行。
下面我们就用一个榨汁机来做示例:
1.先编写Feature Test功能测试文件
#file tutorial04_scenario_outline.feature Feature: 场景大纲 Scenario Outline: 用榨汁机来炸 <thing> Given 我放了一个 "<thing>" 在榨汁机里 When 我打开榨汁机 Then 它应该是 "<other_thing>" Examples: 水果 | thing | other_thing| | 葡萄 | 葡萄汁 | | 香蕉 | 香蕉汁 | Examples: 蔬菜类 |thing | other_thing| |黄瓜 |黄瓜汁 | |西红柿 |西红柿汁|
上面的例子中 使用了Scenario Outline来定义scenario 在GIVEN中使用 <varible name>
来定义数据变量。
例子中有两个变量 <thing>
和<other thing>
这两个变量名会在Examples中变为table的heading。Examples中的表格数据就是传入方法的数据。
behave会运行表格中的每一行,每一行就代表着一个场景.
2.编写榨汁机模型类
#encoding:utf-8 #date:2019/12/6 15:24 #@Author:sunny class Juicer(object): Detaillist={ "葡萄":"葡萄汁", "香蕉":"香蕉汁", "黄瓜":"黄瓜汁", "西红柿":"西红柿汁" } def __init__(self): self.thing=None self.result=None #断言Then def get_result(self,thing): return self.Detaillist.get(thing,'_thing') #放东西进去榨汁机 def add(self,thing): self.thing=thing #得到结果 def open_Juicer(self): self.result=self.get_result(self.thing)
3.编写自动化测试类
#encoding:utf-8 #date:2019/12/6 15:10 #@Author:sunny from behave import * from hamcrest import * from features.steps.Juicer import Juicer @given('我放了一个 "{thing}" 在榨汁机里') def step_given_thing_into_juicer(context,thing): context.juicer=Juicer() context.juicer.add(thing) @when('我打开榨汁机') def step_when_juicer_in(context): context.juicer.open_Juicer() @then('它应该是 "{other_thing}"') def step_then_shoud_it_be(context,other_thing): assert_that(context.juicer.result,equal_to(other_thing))
运行结果:
E:\exercise\producer2-test>behave Feature: 场景大纲 # features/tutorial04_scenario_outline.feature:1 Scenario Outline: 用榨汁机来炸 葡萄 -- @1.1 水果 # features/tutorial04_scenario_outline.feature:10 Given 我放了一个 "葡萄" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "葡萄汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 香蕉 -- @1.2 水果 # features/tutorial04_scenario_outline.feature:11 Given 我放了一个 "香蕉" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "香蕉汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 黄瓜 -- @2.1 蔬菜类 # features/tutorial04_scenario_outline.feature:15 Given 我放了一个 "黄瓜" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "黄瓜汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 西红柿 -- @2.2 蔬菜类 # features/tutorial04_scenario_outline.feature:16 Given 我放了一个 "西红柿" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "西红柿汁" # features/steps/step_tutorial04.py:18 1 feature passed, 0 failed, 0 skipped 4 scenarios passed, 0 failed, 0 skipped 12 steps passed, 0 failed, 0 skipped, 0 undefined Took 0m0.007s E:\exercise\producer2-test>
根据运行结果,运行成功。
错误示例:
修改榨汁机模型类,这里去掉了一个水果字典
#encoding:utf-8 #date:2019/12/6 15:24 #@Author:sunny class Juicer(object): Detaillist={ "葡萄":"葡萄汁", "香蕉":"香蕉汁", "黄瓜":"黄瓜汁", } def __init__(self): self.thing=None self.result=None def get_result(self,thing): return self.Detaillist.get(thing,'_thing') def add(self,thing): self.thing=thing def open_Juicer(self): self.result=self.get_result(self.thing)
运行结果:
E:\exercise\producer2-test>behave Feature: 场景大纲 # features/tutorial04_scenario_outline.feature:2 Scenario Outline: 用榨汁机来炸 葡萄 -- @1.1 水果 # features/tutorial04_scenario_outline.feature:11 Given 我放了一个 "葡萄" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "葡萄汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 香蕉 -- @1.2 水果 # features/tutorial04_scenario_outline.feature:12 Given 我放了一个 "香蕉" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "香蕉汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 黄瓜 -- @2.1 蔬菜类 # features/tutorial04_scenario_outline.feature:16 Given 我放了一个 "黄瓜" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "黄瓜汁" # features/steps/step_tutorial04.py:18 Scenario Outline: 用榨汁机来炸 西红柿 -- @2.2 蔬菜类 # features/tutorial04_scenario_outline.feature:17 Given 我放了一个 "西红柿" 在榨汁机里 # features/steps/step_tutorial04.py:9 When 我打开榨汁机 # features/steps/step_tutorial04.py:14 Then 它应该是 "西红柿汁" # features/steps/step_tutorial04.py:18 Assertion Failed: Expected: '西红柿汁' but: was '_thing' Failing scenarios: features/tutorial04_scenario_outline.feature:17 用榨汁机来炸 西红柿 -- @2.2 蔬菜类 0 features passed, 1 failed, 0 skipped 3 scenarios passed, 1 failed, 0 skipped 11 steps passed, 1 failed, 0 skipped, 0 undefined Took 0m0.003s E:\exercise\producer2-test>behave
总结:这里需要和Feature文件的Examples例子数据一致,不然会运行报错。
善于跌倒仍喜爱奔跑~