JUnit中Failure、Error区别

在运行TestRunner执行您的测试时,您会发现到有FailureError两种测试尚未通过的讯息。

Failure指的是预期的结果与实际运行单元的结果不同所导致,例如当您使用assertEquals()或其它assertXXX()方法断言失败时,就会回报Failure,这时候您要检查您的单元方法中的逻辑设计是否有误。

Error指的是您程式没有考虑到的情况,在断言之前程式就因为某种错误引发例外而终止,例如在单元中存取某个阵列,因为存取超出索引而引发ArrayIndexOutOfBoundsException,这会使得单元方法无法正确完成,在测试运行到asertXXXX()前就提前结束,这时候您要检查您的单元方法中是否有未考虑到的情况而引发流程突然中断。

来看个实际的例子,如果您设计了下面的测试案例:

ObjectArrayTest.java 
package onlyfun.caterpillar.test;

import onlyfun.caterpillar.ObjectArray;

import junit.framework.TestCase;

public class ObjectArrayTest extends TestCase {

public void testAdd() {  

      ObjectArray objArr = new ObjectArray();     

   Object testObj = new Object();     

   Object obj = objArr.setObject(0, testObj);   

     assertEquals(testObj, obj);   

 }   

public static void main(String[] args) {      

  junit.textui.TestRunner.run(ObjectArrayTest.class); 

   }

}

然后根据这个测试案例,您撰写了ObjectArray类别:

ObjectArray.java 
package onlyfun.caterpillar;public class ObjectArray {    private Object[] objs;        public Object setObject(int i, Object o) {        return objs[i];    }}

接下来运行TestRunner,您发现程式回报了Error
.E
Time: 0
There was 1 error:
1) testAdd(onlyfun.caterpillar.test.ObjectArrayTest)
      java.lang.NullPointerException
....
....
FAILURES!!!
Tests run: 1,  Failures: 0,  Errors: 1
 

仔细看一下您所设计的ObjectArray类别,显然程式撰写的太勿忙,忘了初始化Object阵列了,因而引发了 NullPointerException,这是程式设计上的错误,使得尚未进行断言之前就引发例外中断,所以修正一下ObjectArray,提供一个建构函式,预设产生长度为10的阵列:

ObjectArray.java 
package onlyfun.caterpillar;

public class ObjectArray { 

   private Object[] objs;   

     public ObjectArray() {   

     objs = new Object[10];  

  }       

 public Object setObject(int i, Object o) {   

     return objs[i];   

 }

}

再运行一次TestRunner,这次Error没了,但是有Failure
.F
Time: 0
There was 1 failure:
1) testAdd(onlyfun.caterpillar.test.ObjectArrayTest)
     junit.framework.AssertionFailedError:
      expected:<
java.lang.Object@10b30a7> but was:
....
....
FAILURES!!!
Tests run: 1,  Failures: 1,  Errors: 0
 

这表示可以执行到assertEquals()完毕,但是断言失败,所以再设计程式以消除Failure

ObjectArray.java 
package onlyfun.caterpillar;

public class ObjectArray {

private Object[] objs;     

   public ObjectArray() {  

      objs = new Object[10];  

  }   

public Object setObject(int i, Object o) {  

      objs[i] = o;        return objs[i];   

 }

}

再次运行TestRunner,这次应该可以通过测试了。

如果您的单元在执行时,使用throws声明会丢出某些例外,例如IOException,您希望可以在testXXXX()中测试例外是否真的被丢出,您可以使用try.....catch来处理,下面这个程式是个实例,假设java.io.FileReader是您所设计的类别,您提供一个测试档案 test.txt

FileReaderTest.java 
package onlyfun.caterpillar.test;

 import java.io.*;

 import junit.framework.TestCase;

public class FileReaderTest extends TestCase { 

public void testClose() throws IOException { 

       FileReader reader = new FileReader("test.txt");   

reader.close(); 

        try {        

     reader.read();     

        fail("reading file after closed" +                  " and didn't throw IOException");    

     }    

     catch(IOException e) {    

        assertTrue(true);       

 }    

 }    

 public static void main(String[] args) {  

       junit.textui.TestRunner.run(FileReaderTest.class);  

   }

}

您所测试的可能是一个预期会丢出的例外,您想要看看当错误的情况成立时,是不是真会丢出例外,例如 testClose() 测试FileReader close()之后如果再read(),是不是会如期丢出IOException,您先行在方法中用try....catch捕捉了这个例外,如果没有如期丢出例外,则不会被catch捕捉,而程式流程继续往下,执行到 fail() 陈述,这表示例外处理没有发生,此时主动丢出一个Failure,表示程式的执行并不如您所预期的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 JUnit Error 是指测试代码的严重问题,这些问题无法通过断言或异常来捕获和处理。通常,Error 表示测试代码存在一些严重的问题,比如内存溢出、死锁等等。与之相对的是,JUnit 的异常(Exception)是指测试代码的一些可预测的异常,比如空指针异常、数组越界异常等等,这些异常可以通过断言来处理。在 JUnit ,如果测试代码出现了 Error,那么这个测试用例会被标记为失败(Failed),而不是通过(Passed)。 ### 回答2: 在JUnit,错误(error)的出现是由于以下几种情况: 1. 代码错误:当测试代码存在编译错误或逻辑错误时,会导致测试无法通过,从而出现错误。比如,在测试方法调用了一个不存在的方法或者传递了错误的参数等。 2. 断言错误:断言(assert)用于检查测试结果是否符合预期,如果测试结果与预期不一致,就会触发断言错误。例如,在测试期望某个方法返回一个特定的值,但实际返回的值与期望值不同,就会引发断言错误。 3. 异常错误:某些测试情况下,我们期望被测试代码会抛出一个异常,如果没有抛出异常或者抛出了不符合预期的异常,就会产生异常错误。例如,可以编写测试来验证是否能正确地捕获并处理预期的异常。 4. 测试配置错误:在JUnit,有时候错误可能是由测试的配置问题引起的。比如,使用了错误的测试数据、错误的测试环境或者错误的设置等。 5. 环境错误:有时候错误可能是由于测试环境问题引起的,比如依赖的外部资源不可用、网络连接断开或者无法访问数据库等。 总之,JUnit错误的出现是因为测试代码或测试环境存在问题,导致测试无法正常运行或者测试结果与预期不一致。为了解决这些错误,我们需要仔细检查代码、断言语句和测试配置,并确保测试环境的正确设置。 ### 回答3: 在JUniterror的出现通常是由于以下几个原因: 1. 代码错误:当在测试方法存在代码错误时,会导致error的出现。例如,语法错误、逻辑错误或变量赋值错误等。这些错误会导致测试方法无法正确执行,从而产生error。 2. 断言失败:在测试方法,通常会使用断言语句来验证预期结果和实际结果是否一致。如果断言失败,即预期和实际结果不一致,就会触发错误。这可以是由于被测试的代码存在问题,或者测试数据的期望值和实际值不匹配所致。 3. 异常抛出:有时,在测试方法可能会故意抛出异常,以验证代码对异常的处理是否正确。如果异常没有被捕获或未按预期处理,就会导致error的出现。例如,NullPointerException、ArrayIndexOutOfBoundsException等异常。 4. 测试环境配置不正确:在运行JUnit测试时,如果测试环境的配置不正确,例如缺少依赖库、配置文件错误等,也可能导致error的出现。 在JUniterror通常表示测试方法无法正常执行,而不是像异常一样表示代码的错误或错误的输入。当出现error时,通常需要检查代码、断言语句、异常处理等,并对测试环境进行适当的配置和修复,以确保测试方法能够正确执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值