Cucumber 测试 - 将场景大纲示例 table 分成更小的块

Cucumber tests - break example table of scenario outline into smaller chunks

我在场景大纲中有一个很大的例子 table,大约有 20 列

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

是否可以像这样将示例 table 分成更小的块

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

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

   ....upto 20

示例的每一行 table 表示一个场景 运行。如果您拆分该行,那么每个场景大纲 运行 中的某些值将没有值,而且您将拥有比实际需要更多的 运行。所以答案是否定的。

您可以尝试将所有数据或部分数据存储在特征文件之外,存储在 excel 文件甚至数据库中。 excel 或数据库将有一个唯一键列,需要与示例中的行索引相匹配 table.

特征文件-

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

Step定义代码-

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
}

这有利也有弊。您正在将数据与特征文件分开。在场景中引入技术细节。逐步失去数据匹配和转换的能力。主要专业数据可管理。

如果您想在单个场景中处理大量包含许多示例的数据,您可以执行以下操作

  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
    

    您在这里所做的是将您如何 运行 测试的细节推送到代码中,并从 Cucumber 中导出。

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

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