黄瓜测试用例在一起运行时失败但在单独运行时通过

时间:2018-06-14 18:35:09

标签: cucumber cucumber-java spring-boot-test

我正在使用SpringBoot和Cucumber。一个特定的测试用例在一起运行时失败,在单独运行时通过。同一个功能文件中的其他方案似乎工作正常。我尝试了以下链接,但它们没有用。

  • link1link2link3link4link5
  • 我还试图将有问题的场景隔离到一个单独的功能文件,并为该功能写了一个独占的步骤def,但仍然没有运气。
  • 我尝试引入@After和@Before钩子将stepdef文件中的Instance变量值重置为null。
  • 我甚至尝试切换Sample-payload和id Count Set
  • 的位置

现在我用完了选项。请帮忙。

功能文件:

Scenario Outline: To check if the service returns all the ids when more than 10000 Ids are returned by the query
Given sample request <payload>
 When the new end point is invoked
 Then the service returns <idCount> Ids

Examples: 
  | payload          | idCount | 
  | sample-payload-1 | 17575   | 
  | sample-payload-2 | 4       | 
  | sample-payload-3 | 23535   | 
  | sample-payload-4 | 34535   | 

步骤默认文件:

public class MyStepdefs extends AbstractStepsDefs {

@Autowired
MyController myController;

private String requestPayload;

private List<String> ids;

@Given("^sample request (.+)$")
public void sample_request_something(String payload) throws Throwable {
    this.requestPayload = payload;
}

@When("^the new end point is invoked$")
public void the_new_end_point_is_invoked() throws Throwable {
    String responseJSON = MyUtil.getPostResponseJSON(myController, "/ids", requestPayload);
    responseJSON = responseJSON.replace("[", "").replace("]", "").replaceAll("\"", "");
    ids = Arrays.asList(responseJSON.split(","));
}

@Then("^service returns list of available (.+)$")
public void service_returns_list_of_available_something(String ids) throws Throwable {
    List<String> list = Arrays.asList(ids.split(","));
    Assert.assertTrue(this.ids.containsAll(list));
}

@Then("^the service returns (.+) ids$")
public void the_service_returns_ids(String idCount) throws Throwable {
    System.out.println("Actual Size:" + this.ids.size());
    System.out.println("Expected Size:" + Integer.parseInt(idCount));
    Assert.assertEquals(this.ids.size(), Integer.parseInt(idCount));
}

@After
@Before
public void cleanUp() {
    ids = null;
}

}

现在我已经没有选择了。请帮忙。

UPDATE1: stepdef类中的第二个then块失败。 sample-payload-1和sample-payload-2通过,但另外两个失败。即使在更改了样本有效负载的顺序之后,测试也会失败。

我得到的错误是断言错误,因为ids列表的大小不同。但是,当我单独运行相同的测试时,我不会因为大小匹配而得到此错误。

1 个答案:

答案 0 :(得分:1)

问题在于实例变量我曾用counter来循环触发查询并提取结果的逻辑。第一个测试样本[sample-payload-1]将单独工作,因为它具有实例counter的新副本。后续示例仅包含 更改 counter值。

这解释了为什么测试用例在单独运行时通过,因为没有其他测试会使用 已更改 counter

FIX:修复是在退出实现/服务类之前将counter重置回0,以便后续请求具有新的{{1} }}

经验教训:如果封闭类的counterscope,则永远不要依赖实例变量。对于每次调用Class

中的方法,该值将不断变化