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
}
这有利也有弊。您正在将数据与特征文件分开。在场景中引入技术细节。逐步失去数据匹配和转换的能力。主要专业数据可管理。
如果您想在单个场景中处理大量包含许多示例的数据,您可以执行以下操作
- 为示例集命名,例如foo_data
写一个场景,将 foo_data 作为一个整体来讨论
Given ...
When I bar with foo_data
Then I should see no foo_data errors
编写单个调用步骤定义来处理您的所有数据
When "I bar with foo_data" do
bar_with_foo_data
end
把你所有的文件处理数据的东西写在辅助方法里
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'}
我在场景大纲中有一个很大的例子 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
}
这有利也有弊。您正在将数据与特征文件分开。在场景中引入技术细节。逐步失去数据匹配和转换的能力。主要专业数据可管理。
如果您想在单个场景中处理大量包含许多示例的数据,您可以执行以下操作
- 为示例集命名,例如foo_data
写一个场景,将 foo_data 作为一个整体来讨论
Given ... When I bar with foo_data Then I should see no foo_data errors
编写单个调用步骤定义来处理您的所有数据
When "I bar with foo_data" do bar_with_foo_data end
把你所有的文件处理数据的东西写在辅助方法里
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'}