代码如下所示。我想让它去测试keyNames的所有元素。但是,如果任何测试失败,并且没有迭代所有数组元素,它就会停止。我的理解是,在assertAll中,所有断言都被执行,任何失败都应该一起报告。
谢谢你的时间和帮助。
private void validateData(SearchHit searchResult, String [] line){
for(Integer key : keyNames){
String expectedValue = getExpectedValue(line, key);
String elementName = mappingProperties.getProperty(key.toString());
if (elementName != null && elementName.contains(HEADER)){
assertAll(
() -> assumingThat((expectedValue != null && expectedValue.length() > 0),
() -> {
String actualValue = testHelper.getHeaderData(searchResult, elementName);
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}
}
)
);
}
}
}发布于 2018-07-12 14:44:20
Assertions.assertAll()的javadoc声明:
断言所有提供的可执行文件都不会引发异常。
实际上,您在每次迭代时都在assertAll()中提供了一个单独的assertAll()。
因此,循环中任何迭代中的失败都会终止测试执行。
实际上,您每次最多只请求一个断言,从而多次调用assertAll():
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}您想要的是反向操作:通过传递多个执行所需断言的assertAll()实例来调用Executable。
因此,您可以使用一个经典循环在List中收集它们,并以这种方式传递它:assertAll(list.stream())或创建一个Stream<Executable>,而不需要任何收集和传递,例如assertAll(stream)。
这里有一个包含Stream的版本(根本没有测试),但是您应该有这样的想法:
Stream<Executable> executables =
keyNames.stream()
.map(key->
// create an executable for each value of the streamed list
()-> {
String expectedValue = getExpectedValue(line, key);
String elementName = mappingProperties.getProperty(key.toString());
if (elementName != null && elementName.contains(HEADER)){
assumingThat((expectedValue != null && expectedValue.length() > 0),
() -> {
String actualValue = testHelper.getHeaderData(searchResult, elementName);
if(expectedValue != null) {
assertEquals(expectedValue, actualValue, " ###Element Name -> " + elementName +" : Excepted Value ### " + expectedValue + " ### Actual Value ###" + actualValue);
}
}
);
}
}
);
Assertions.assertAll(executables);发布于 2018-07-12 15:04:52
assertAll()对传递给assertAll()调用的所有断言和错误进行分组。它不会在测试方法期间发生的所有调用中对断言进行分组。
在您发布的代码中,您将一个断言lambda传递到assertAll()中。它不会对多个键的错误进行分组,因为每个key都有一个单独的assertAll()调用。
要确保单独测试集合中的所有值,请查看参数化试验。
发布于 2018-07-17 06:59:24
正如@user31601所指出的,参数化测试(参见文档)会自动独立测试所有情况。
这导致了以下(稍微简单一些的)代码:
@ParameterizedTest
@MethodSource("getKeys")
void testKey(String key) {
String elementName = mappingProperties.getProperty(key.toString());
assumeTrue(elementName != null);
assumeTrue(elementName.contains(HEADER));
String expectedValue = getExpectedValue(line, key);
assumeTrue(expectedValue != null);
assumeTrue(expectedValue.length() > 0);
String actualValue = testHelper.getHeaderData(searchResult, elementName);
String doc = String.format("name: %s, expected %s, actual %s", elementName, expectedValue, actualValue);
assertEquals(expectedValue, actualValue, doc);
}
private static Stream<String> getKeys() {
return keyNames.stream()
}https://stackoverflow.com/questions/51308316
复制相似问题