【五】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>
View Code

根据运行结果,运行成功。

 

错误示例:

修改榨汁机模型类,这里去掉了一个水果字典

#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
View Code

总结:这里需要和Feature文件的Examples例子数据一致,不然会运行报错。

posted @ 2019-12-06 17:49  做一只热爱生活的小透明  阅读(1123)  评论(0编辑  收藏  举报