如何获取junit测试中有多少assertEquals语句通过/失败的报告

时间:2018-02-18 02:47:39

标签: java maven junit assert maven-surefire-plugin

我正在尝试测试由服务类生成的一组结果,其中包含一些已定义的expected结果。该服务产生actual结果。

使用包含一些值和预期结果的json文件中的值来提供服务。使用serviceexpected的输出与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();
        }
    }

3 个答案:

答案 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();
        }
    }