行为:用动态示例编写场景大纲

Ada*_*tan 3 cucumber gherkin python-behave

小黄瓜/行为Examples

Gherkin 语法功能使用示例进行自动化测试

Feature: Scenario Outline (tutorial04)

  Scenario Outline: Use Blender with <thing>
    Given I put "<thing>" in a blender
    When I switch the blender on
    Then it should transform into "<other thing>"

    Examples: Amphibians
        | thing         | other thing |
        | Red Tree Frog | mush        |
        | apples        | apple juice |

    Examples: Consumer Electronics
        | thing         | other thing |
        | iPhone        | toxic waste |
        | Galaxy Nexus  | toxic waste |
Run Code Online (Sandbox Code Playgroud)

测试套件将运行四次,每个示例运行一次,给出类似于以下内容的结果:

在此输入图像描述

我的问题

如何使用该Examples部分中的机密数据进行测试?例如,我想使用用户 ID 或 SSN 号码测试内部 API,而不将数据硬编码在功能文件中。

Examples有没有办法从外部源动态加载?

更新:Behaviour项目上打开了一个github问题

Leo*_*rdo 5

我想出了另一个解决方案(behave-1.2.6):

我设法使用 动态创建场景大纲的示例before_feature

给定一个特征文件 ( x.feature):

Feature: Verify squared numbers

  Scenario Outline: Verify square for <number>
    Then the <number> squared is <result>

Examples: Static
  | number | result |
  |   1    |    1   | 
  |   2    |    4   |
  |   3    |    9   |
  |   4    |   16   |

  # Use the tag to mark this outline
  @dynamic
  Scenario Outline: Verify square for <number>
    Then the <number> squared is <result>

Examples: Dynamic
  | number | result |
  |   .    |    .   | 
Run Code Online (Sandbox Code Playgroud)

以及步骤文件 ( steps/x.step):

from behave import step

@step('the {number:d} squared is {result:d}')
def step_impl(context, number, result):
    assert number*number == result
Run Code Online (Sandbox Code Playgroud)

技巧是使用before_featurein environment.py,因为它已经将示例表解析为场景大纲,但尚未从大纲生成场景。

import behave
import copy

def before_feature(context, feature):
    features = (s for s in feature.scenarios if type(s) == behave.model.ScenarioOutline and
                'dynamic' in s.tags)
    for s in features:
        for e in s.examples:
            orig = copy.deepcopy(e.table.rows[0])
            e.table.rows = []
            for num in range(1,5):
                n = copy.deepcopy(orig)
                # This relies on knowing that the table has two rows.
                n.cells = ['{}'.format(num), '{}'.format(num*num)]
                e.table.rows.append(n)
Run Code Online (Sandbox Code Playgroud)

这仅适用于标记有 的场景大纲@dynamic

结果是:

behave -k --no-capture
Feature: Verify squared numbers # features/x.feature:1

  Scenario Outline: Verify square for 1 -- @1.1 Static  # features/x.feature:8
    Then the 1 squared is 1                             # features/steps/x.py:3

  Scenario Outline: Verify square for 2 -- @1.2 Static  # features/x.feature:9
    Then the 2 squared is 4                             # features/steps/x.py:3

  Scenario Outline: Verify square for 3 -- @1.3 Static  # features/x.feature:10
    Then the 3 squared is 9                             # features/steps/x.py:3

  Scenario Outline: Verify square for 4 -- @1.4 Static  # features/x.feature:11
    Then the 4 squared is 16                            # features/steps/x.py:3

  @dynamic
  Scenario Outline: Verify square for 1 -- @1.1 Dynamic  # features/x.feature:19
    Then the 1 squared is 1                              # features/steps/x.py:3

  @dynamic
  Scenario Outline: Verify square for 2 -- @1.2 Dynamic  # features/x.feature:19
    Then the 2 squared is 4                              # features/steps/x.py:3

  @dynamic
  Scenario Outline: Verify square for 3 -- @1.3 Dynamic  # features/x.feature:19
    Then the 3 squared is 9                              # features/steps/x.py:3

  @dynamic
  Scenario Outline: Verify square for 4 -- @1.4 Dynamic  # features/x.feature:19
    Then the 4 squared is 16                             # features/steps/x.py:3

1 feature passed, 0 failed, 0 skipped
8 scenarios passed, 0 failed, 0 skipped
8 steps passed, 0 failed, 0 skipped, 0 undefined
Took 0m0.005s
Run Code Online (Sandbox Code Playgroud)

这依赖于具有正确形状的示例表作为最终表,在我的示例中,有两行。我也不大惊小怪地创建新behave.model.Row对象,我只是从表中复制一个对象并更新它。为了更加丑陋,如果您使用文件,您可以将文件名放在示例表中。