Cucumber 测试用例在 运行 一起时失败,但在 运行 单独时通过
Cucumber test cases fail when run together but pass when run individually
我正在使用 SpringBoot 和 Cucumber。一个特定的测试用例在 运行 一起时失败,在 运行 单独时通过。同一功能文件中的其他场景似乎工作正常。我尝试了以下链接,但它们没有用。
- link1, link2, link3, link4,
- 我也尝试将有问题的场景限定运行到一个单独的功能文件中,并为该功能编写了一个独占的步骤定义,但仍然没有成功。
- 我尝试引入@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;
}
}
现在我 运行 别无选择。请帮忙。
更新 1:
stepdef class 中的第二个 then
块失败。 sample-payload-1 和 sample-payload-2 通过,但其他两个失败。即使更改了样本有效载荷的顺序,测试也会失败。
我得到的错误是断言错误,因为 ids
列表的大小不相同。但是当我 运行 单独进行相同的测试时,我不会收到此错误,因为大小匹配。
问题出在 实例变量 上,我曾将其用作 counter
来循环触发查询并提取结果的逻辑。第一个测试样本 [sample-payload-1
] 将单独工作正常,因为它有实例 counter
的新副本。后续样本将只有 altered counter
值。
这解释了为什么测试用例在 运行 时单独通过,因为没有另一个测试会使用 altered counter
.
修复: 修复是在我退出 implementation/service class 之前将 counter
重置回 0
所以后续请求将有一个新的 counter
经验教训: 如果封闭 Class 的 scope
是 Singleton
,则永远不要依赖实例变量。每次调用 Class
中的方法时,该值都会不断变化
我正在使用 SpringBoot 和 Cucumber。一个特定的测试用例在 运行 一起时失败,在 运行 单独时通过。同一功能文件中的其他场景似乎工作正常。我尝试了以下链接,但它们没有用。
- link1, link2, link3, link4,
- 我也尝试将有问题的场景限定运行到一个单独的功能文件中,并为该功能编写了一个独占的步骤定义,但仍然没有成功。
- 我尝试引入@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;
}
}
现在我 运行 别无选择。请帮忙。
更新 1:
stepdef class 中的第二个 then
块失败。 sample-payload-1 和 sample-payload-2 通过,但其他两个失败。即使更改了样本有效载荷的顺序,测试也会失败。
我得到的错误是断言错误,因为 ids
列表的大小不相同。但是当我 运行 单独进行相同的测试时,我不会收到此错误,因为大小匹配。
问题出在 实例变量 上,我曾将其用作 counter
来循环触发查询并提取结果的逻辑。第一个测试样本 [sample-payload-1
] 将单独工作正常,因为它有实例 counter
的新副本。后续样本将只有 altered counter
值。
这解释了为什么测试用例在 运行 时单独通过,因为没有另一个测试会使用 altered counter
.
修复: 修复是在我退出 implementation/service class 之前将 counter
重置回 0
所以后续请求将有一个新的 counter
经验教训: 如果封闭 Class 的 scope
是 Singleton
,则永远不要依赖实例变量。每次调用 Class