【问题标题】:How to pass complex object in cucumber feature file如何在黄瓜特征文件中传递复杂对象
【发布时间】:2020-06-15 17:17:32
【问题描述】:

我们的团队正在从 clean testng 转向 testng+cucumber。在尝试为一个简单的测试创建一个功能时,其中一个不可变对象被发送到每次运行时包含各种数据的服务(testng 世界中的数据提供者),我发现自己需要一个最多 11 个字段的步骤。这有点多 - 这不是一个好习惯。

黄瓜有可能从场景大纲中获取复杂对象吗? 我试图找到一些关于我的问题的文档,但没有弹出任何内容。也许我找错地方了,或者用谷歌搜索了错误的查询。

例如。

@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】:

    虽然可以在数据表中使用示例值:

    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.com/cucumber/cucumber-jvm/tree/master/java#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. 使用原型模式。这样,您只需描述对原型请求所做的更改
    3. 重新考虑您的测试策略并重组您的测试策略,以便黄瓜测试可以专注于高级行为,同时将细节下推到更小的单元测试中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 2016-12-23
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多