我正在尝试测试由服务类生成的一组结果,其中包含一些已定义的expected
结果。该服务产生actual
结果。
使用包含一些值和预期结果的json文件中的值来提供服务。使用service
将expected
的输出与AssertEquals
结果进行比较,并且测试仅在它们相等时才通过。
即使某些AssertEquals
失败也可以继续测试,并生成一个AssertEquals
已通过或失败的报告。
我探究了maven surefire
,但我无法得到预期的结果。
注意:只有一种@Test
方法。只有这种方法,我才会多次使用不同的参数调用服务并比较expected
& actual
结果
@Test
public void createTest() throws Exception {
try {
// some other code to read the file
JSONParser parser = new JSONParser();
// ruleValidationResourcePath is location of the file
JSONArray array = (JSONArray) parser.parse(new FileReader(ruleValidationResourcePath));
//looping this json and passing each object values to a service
for(Object o:array){
JSONObject rulesValidation = (JSONObject) o;
String ruleAdExpr = (String) rulesValidation.get("ruleA");
String _result = (String)rulesValidation.get("result");
PatObj patObj= new PatObj ();
patObj.setRule(ruleAdExpr.trim());
//service is an instance of class which hold props method
PatObj pat = service.props(patObj);
if(patObj.getRule() != null){
String _machineRule =pat .getMachine_rule().toLowerCase().trim();
String expResult = _result.toLowerCase().trim();
// here some _machineRule & expResult may be different
// currently test is failing if they are not equal
// will like to continue test even if they are not equal
// and create report of how many failed/passed
Assert.assertEquals(_machineRule,expResult);
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
答案 0 :(得分:1)
即使某些AssertEquals失败,是否可以继续测试。
是的,这是可能的,但我不建议你这样做,因为它是误用JUnit。
JUnit方法遵循以下规则:测试应该每个测试方法仅检查一个特定情况。
在您的情况下,JSON加载逻辑只是一个设置,您使用不同的参数检查getMachineRule()
方法。
JUnit世界有自己的处理此类案件的机制。
如何正确实施
您需要通过参数化来重新测试。
首先将JUnitParams添加到您的项目中。
然后,您需要引入一个方法来加载JSONArray
并将其结果用作测试的参数。
所有在一起:
@RunWith(JUnitParamsRunner.class)
public class RoleTest {
@Test
@Parameters
public void createTest(JSONObject rulesValidation) throws Exception {
// use the same logic as you have inside your "for" loop
//...
assertEquals(machineRule, expResult);
}
private Object[] parametersForCreateTest() {
// load JSON here and convert it to array
JSONParser parser = new JSONParser();
JSONArray jsonArray = (JSONArray) parser.parse(
new FileReader(ruleValidationResourcePath)
);
return jsonArray.toArray();
}
}
这样createTest
的执行次数与JSONArray
中的对象一样多,您将看到每次特定投放的报告(即使其中一些失败)。
注意:方法命名很重要。返回参数的方法应该以与测试方法相同的方式命名,但前缀为parametersFor
- 在您的情况下为parametersForCreateTest
。在the documentation中查找更多示例。
答案 1 :(得分:0)
这与Assertion的意图完全相反。这里遇到的一个困难是失败的断言会引发错误而不是异常。
您可以使用:
catch (AssertionError e) {
...
一旦你发现错误,你仍需要计算它,这样如果你只是使用if语句进行比较并记录结果,那么代码会更清晰
if(_machineRule.equals(expResult)) {success++;}
然后
Assert.assertEquals(expectedCount,success);
循环完成列表中所有元素的处理后。另一种方法可能是:
try{
Assert.assertEquals(_machineRule,expResult);
System.out.println(description + " - passed");
}catch(AssertionError e){
System.out.println(description + " - failed");
throw e;
}
答案 2 :(得分:0)
我相信您需要junit 4.7+ API中的 org.junit.rules.ErrorCollector 规则。它应该完全符合您的要求;允许单个测试多次断言并单独报告每个检查的结束状态。
//This must be public
@Rule
public ErrorCollector collector = new ErrorCollector();
@Test
public void createTest() throws Exception {
try {
// some other code to read the file
JSONParser parser = new JSONParser();
// ruleValidationResourcePath is location of the file
JSONArray array = (JSONArray) parser.parse(new FileReader(ruleValidationResourcePath));
//looping this json and passing each object values to a service
for(Object o:array){
JSONObject rulesValidation = (JSONObject) o;
String ruleAdExpr = (String) rulesValidation.get("ruleA");
String _result = (String)rulesValidation.get("result");
PatObj patObj= new PatObj ();
patObj.setRule(ruleAdExpr.trim());
//service is an instance of class which hold props method
PatObj pat = service.props(patObj);
if(patObj.getRule() != null){
String _machineRule =pat .getMachine_rule().toLowerCase().trim();
String expResult = _result.toLowerCase().trim();
// here some _machineRule & expResult may be different
// currently test is failing if they are not equal
// will like to continue test even if they are not equal
// and create report of how many failed/passed
collector.checkThat(expResult, IsEqual.equalTo(_machineRule));
//Assert.assertEquals(_machineRule,expResult);
}
}
} catch (FileNotFoundException e) {
collector.addError(e);
// e.printStackTrace();
}
}