Testng - 仅跳过失败数据集的相关测试

Testng - Skip dependent tests for only failed data sets

我正在尝试修改我的相关测试,以便它们以特定方式 运行 并且尚未找到可行的方法。例如,假设我有以下两个测试和定义的数据提供者:

@Dataprovider(name = "apiResponses")
Public void queryApi(){
  return getApiResponses().entrySet().stream().map(response -> new Object[]{response.getKey(), response.getValue()}).toArray(Object[][]::new);
}

@Test(dataprovider = "apiResponses")
Public void validateApiResponse(Object apiRequest, Object apiResponse){
  if(apiResponse.statusCode != 200){
    Assert.fail("Api Response must be that of a 200 to continue testing");
  }
}

@Test(dataprovider = "apiResponses", dependsOnMethod="validateApiResponse")
Public void validateResponseContent(Object apiRequest, Object apiResponse){
  //The following method contains the necessary assertions for validating api repsonse content
  validateApiResponseData(apiResponse); 
}

假设我有 100 个 api 请求要验证,如果这 100 个请求中有一个请求 return 状态代码不是 200,则 validateResponseContent将跳过所有 100 个。我试图实现的是,仅对 api 的 return 响应跳过状态代码为 200 的依赖测试,并且所有测试都将跳过运行 对于 return 状态代码为 200 的响应。

添加 if/else 块不会解决这个问题吗?

@Test(dataprovider = "apiResponses")
Public void validateApiResponse(Object apiRequest, Object apiResponse){
  if(apiResponse.statusCode != 200){
    Assert.fail("Api Response must be that of a 200 to continue testing");
  } else {
    validateApiResponseData(apiResponse);
  }
}

您应该使用 TestNG Factory,它会为每个实例创建包含 apiRequestapiResponse 的实例。现在,每个实例基本上都会首先 运行 对状态代码进行断言,然后再继续验证实际的 api 响应。

这是一个示例,展示了它的样子:

public class TestClassSample {
    private Object apiRequest, apiResponse;

    @Factory(dataProvider = "apiResponses")
    public TestClassSample(Object apiRequest, Object apiResponse) {
        this.apiRequest = apiRequest;
        this.apiResponse = apiResponse;
    }

    @Test
    public void validateApiResponse() {
        Assert.assertEquals(apiResponse.statusCode, 200, "Api Response must be that of a 200 to continue testing");
    }

    @Test(dependsOnMethods = "validateApiResponse")
    public void validateResponseContent() {
        //The following method contains the necessary assertions for validating api repsonse content
        validateApiResponseData(apiResponse);
    }

    @DataProvider(name = "apiResponses")
    public static java.lang.Object[][] queryApi() {
        return getApiResponses().entrySet()
                .stream().map(
                        response -> new java.lang.Object[]{
                                response.getKey(), response.getValue()
                        })
                .toArray(Object[][]::new);
    }
}