如何在黄瓜特征文件中传递复杂的对象?

问题描述 投票:0回答:1

我们的团队正在从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;
} 
cucumber testng cucumber-jvm testng-dataprovider
1个回答
1
投票

虽然可以使用数据表中的示例值。

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个参数,你可能事实上甚至没有以最有利的方式使用你当前的单元测试。

考虑一下

  1. 从你的测试中消除所有偶然的细节。
  2. 使用proto类型模式。这样,你只需要描述对原型请求所做的修改即可
  3. 重新思考你的测试策略,重组你的测试策略,使你的黄瓜测试可以专注于高层次的行为,同时把细节推到更小的单元测试中。
© www.soinside.com 2019 - 2024. All rights reserved.