黄瓜测试 - 将场景轮廓的示例表分成较小的块

时间:2018-03-22 20:18:19

标签: cucumber integration-testing cucumber-jvm cucumber-java cucumber-junit

我在场景大纲中有一个大的示例表,大约有20列

 Scenario Outline: ....
    Given ....
    When ...
    Then ....
    Examples:
    |col1|col2|col3|col4|col5|........|col20|
    |val1|val2|val3|val4|val5|........|val20|

是否可以将示例表拆分为更小的块,如此

 Examples:
    |col1|col2|col3|col4|col5|
    |val1|val2|val3|val4|val5|

    |col6|col7|col8|col9|col10|
    |val6|val7|val8|val9|val10|

   ....upto 20

3 个答案:

答案 0 :(得分:1)

一种方法是使用gherkin with qaf,它支持外部文件excle / csv / xml / json或数据库中提供的示例。在这种情况下,您的方案可能如下所示:

Scenario Outline: ....
    Given ....
    When ...
    Then ....
    Examples:{'datafile':'resources/testdata.xls'}

答案 1 :(得分:0)

示例表的每一行表示一个场景运行。如果分解行,那么每个scenariooutline运行中的某些值将没有值,并且您将有更多的运行然后实际需要。所以答案是否定的。

您可以尝试将所有数据或部分数据存储在Excel文件甚至数据库中。 excel或db将具有唯一的键列,该列需要匹配示例表中的行索引。

功能文件 -

Given Data is stored in file located at //project/module/data/bigscenario.xlsx and use index <DataRowIndex>
Given
When
Then

Examples:
| DataRowIndex |
| 1 |
| 2 |
| 3 |
| 5 | //Even skip index so 4 will not run

StepDefinition代码 -

private static boolean dataFlag = false;
private static Map<Integer, DataObject> data = new HashMap<>();
private int rowindex;

@Given("^Data is stored in file located at (.*?) and use index (.*?)")
public void getData(String path, int rowindex) {
     if(!dataFlag) {
         //Access data from excel using apache poi or db code, and store in map as dataobjects.
         dataFlag = true; //Data access runs only for first scenario run.
     }
     this.rowindex = rowindex; //Key to get data for scenario from map
}

这有其优点和缺点。您正在从要素文件中分离数据。在场景中引入技术细节。逐步失去数据匹配和转换的功能。主要专业数据是可管理的。

答案 2 :(得分:0)

如果您想在单个场景中处理大量数据,您可以执行以下操作

  1. 为这组示例添加名称,例如foo_data
  2. 编写一个将foo_data作为单个实体进行讨论的场景

    Given ...
    When I bar with foo_data
    Then I should see no foo_data errors
    
  3. 编写单个调用步骤定义来处理所有数据

    When "I bar with foo_data" do
      bar_with_foo_data
    end
    
  4. 在助手方法中编写所有文件处理数据等

    def bar_with_foo_data
      items = import file ...
      items.each do |item|
      bar_with item: item
      ...
    end
    

    你在这里做的是将你如何运行测试的细节分解为代码和黄瓜。