我们的团队正在从clean testng转向testng+cucumber。当我试图为一个简单的测试创建一个功能,在这个测试中,一个不可改变的对象在每次运行时都会被发送到带有各种数据的服务中(testng世界中的dataprovider),我发现自己需要一个最多有11个字段的步骤。这有点多--这不是一个好的做法。
有没有可能cucumber可以从场景大纲中获取复杂的对象呢?我试图找到一些关于我的问题的文档,但没有弹出。也许我找错了地方,或者用错误的查询方式进行搜索。
例如
@Test(
dataProvider = "data"
)
public void sendRequestTest(
SomeComplexRequest request
) {
//Given
some test data prep
//When
Responce resp = sendRequestToService(request);
//Then
assertEquals(resp, expectedResp);
}
@Builder
class SomeComplexRequest{
dataType Field1;
dataType Field2;
dataType Field3;
...
dataType FieldN;
}
虽然可以使用数据表中的示例值。
Feature: Basic Arithmetic
Background: A Calculator
Given a calculator I just turned on
Scenario Outline: Many additions
Given the previous entries:
| first | second | operation |
| <x> | <y> | <op1> |
| <q> | <r> | <op2> |
When I press +
And I add <a> and <b>
And I press +
Then the result is <c>
Examples: Single digits
| x | y | op1 | q | r | op2 | a | b | c |
| 1 | 1 | + | 2 | 1 | + | 1 | 2 | 8 |
| 0 | 1 | + | 1 | 2 | + | 2 | 3 | 9 |
虽然可以在你的步骤定义中把这个数据表转换为一个对象。
@Given("the previous entries:")
public void thePreviousEntries(List<Entry> entries) {
for (Entry entry : entries) {
calc.push(entry.first);
calc.push(entry.second);
calc.push(entry.operation);
}
}
通过使用一个表转换器将表变成一个条目列表。
https:/github.comcucumbercucumber-jvmtreemasterjava#transformers。
private final ObjectMapper objectMapper = new ObjectMapper();
@DefaultParameterTransformer
@DefaultDataTableEntryTransformer
@DefaultDataTableCellTransformer
public Object transformer(Object fromValue, Type toValueType) {
return objectMapper.convertValue(fromValue, objectMapper.constructType(toValueType));
}
你可能没有以最有利的方式使用Cucumber。有了11个参数,你可能事实上甚至没有以最有利的方式使用你当前的单元测试。
考虑一下