JUnit4 使用注解(元注释)进行测试

引用:http://hi.baidu.com/engly0/blog/item/7586790142d64596e950cd9c.html

 

JUnit 4 使用 Java 5 中的注解(annotation

 

 

@Before
使用了该元数据的方法在每个测试方法执行之前都要执行一次。

@After

使用了该元数据的方法在每个测试方法执行之后要执行一次。

注意:@Before@After标示的方法只能各有一个。这个相当于取代了JUnit以前版本中的setUptearDown方法,当然你还可以继续叫这个名字,不过JUnit不会霸道的要求你这么做了。
JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTruetrue)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型

@Test(timeout=xxx):
该元数据传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。

3     @Test(expected=UnsupportedDBVersionException.class)

指定抛出异常,没有异常测试不过. 

@Test(expected=*.class)

 


@ignore

该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。

 

Spring 相关

@Timed

表明被注解的测试方法必须在规定的时间区间内执行完成(以毫秒记)。如果测试执行时间超过了规定的时间区间,测试就失败了。

注意该时间区间包括测试方法本身的执行,任何重复测试(参见 @Repeat),还有任何测试fixture的set up或tear down时间。

Spring的@Timed注解与JUnit 4的@Test(timeout=...)支持具有不同的语义。 特别地,鉴于JUnit 4处理测试执行超时(如通过在一个单独的线程中执行测试方法)的方式, 我们不可能在一个事务上下文中的测试方法上使用JUnit的@Test(timeout=...)配置。因此, 如果你想将一个测试方法配置成计时具事务性的, 你就必须联合使用Spring的@Timed及@Transactional注解。 还值得注意的是@Test(timeout=...)只管测试方法本身执行的次数,如果超出的话立刻就会失败; 然而,@Timed关注的是测试执行的总时间(包括建立和销毁操作以及重复),并且不会令测试失败。

@Timed(millis=1000)

 

 

@ContextConfiguration 注解有以下两个常用的属性:

locations:可以通过该属性手工指定 Spring 配置文件所在的位置,可以指定一个或多个 Spring 配置文件。如下所示:
@ContextConfiguration(locations={“xx/yy/beans1.xml”,” xx/yy/beans2.xml”})inheritLocations:是否要继承父测试用例类中的 Spring 配置文件,默认为 true。如下面的例子:

 

如:

@ContextConfiguration(locations={"base-context.xml"}) 

 public class BaseTest { // ... } 

@ContextConfiguration(locations={"extended-context.xml"}) 

 public class ExtendedTest extends BaseTest { // ... }


@IfProfileValue

提示一下,注解测试只针对特定的测试环境。 如果配置的ProfileValueSource类返回对应的提供者的名称值, 这个测试就可以启动。这个注解可以应用到一个类或者单独的方法。

@IfProfileValue(name=”java.vendor”, value=”Sun Microsystems Inc.”)

 

同时@IfProfileValue可配置一个值列表 (使用OR 语义) 来在JUnit环境中获得TestNG的测试组支持。 看下面的例子:

@IfProfileValue(name=”test-groups”, values={”unit-tests”, “integration-tests”})

 

@ProfileValueSourceConfiguration

类级别注解用来指定当通过@IfProfileValue注解获取已配置的profile值时使用何种ProfileValueSource。 如果@ProfileValueSourceConfiguration没有在测试中声明,将默认使用SystemProfileValueSource。

@ProfileValueSourceConfiguration(CustomProfileValueSource.class)

 

@DirtiesContext

在测试方法上出现这个注解时,表明底层Spring容器在该方法的执行中被“污染”,从而必须在方法执行结束后重新创建(无论该测试是否通过)。

 

@ExpectedException

表明被注解方法预期在执行中抛出一个异常。预期异常的类型在注解中给定。如果该异常的实例在测试方法执行中被抛出, 则测试通过。同样的如果该异常实例没有在测试方法执行时抛出,则测试失败。

@ExpectedException(SomeBusinessException.class)

 

@Repeat

表明被注解的测试方法必须重复执行。执行的次数在注解中声明。

注意重复执行范围包括包括测试方法本身的执行,以及任何测试fixture的set up或tear down。

@Repeat(10)

 

@Rollback

表明被注解方法的事务在完成后是否需要被回滚。 如果true,事务将被回滚,否则事务将被提交。 使用@Rollback接口来在类级别覆写配置的默认回滚标志。

@Rollback(false)

 

@NotTransactional

出现该注解表明测试方法必须不在事务中执行。

@NotTransactional

 

Spring TestContext Framework还支持下面这些非特定于测试的注解,并且保持其语义不变。

@Autowired@Qualifier@Resource (javax.annotation)如果JSR-250可用@PersistenceContext (javax.persistence)如果JPA可用@PersistenceUnit (javax.persistence)如果JPA可用@Required@Transactional

 

 

@TestExecutionListeners

定义类级别的元数据,TestExecutionListeners会使用TestContextManager进行注册。 通常,@TestExecutionListeners与@ContextConfiguration会搭配使用。

@ContextConfiguration @TestExecutionListeners({CustomTestExecutionListener.class, AnotherTestExecutionListener.class})

 

 

@TransactionConfiguration

为配置事务性测试定义了类级别的元数据。特别地,如果需要的PlatformTransactionManager不是“transactionManager”的话, 那么可以显式配置驱动事务的PlatformTransactionManager的bean名字。此外, 可以将defaultRollback标志改为false。通常,@TransactionConfiguration与@ContextConfiguration搭配使用。

@ContextConfiguration @TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)

 

 

@BeforeTransaction
表明被注解的public void方法应该在测试方法的事务开始之前执行, 该事务是通过@Transactional注解来配置的。

@BeforeTransaction

 

 

@AfterTransaction

表明被注解的public void方法应该在测试方法的事务结束之后执行, 该事务是通过@Transactional注解来配置的。

@AfterTransaction

    @RunWith(CustomTestRunner.class)
       public class TestWordDealUtil {......}

JUnit 为单元测试提供了默认的测试运行器 
可以为每一个测试类指定使用某个具体的运行器 
8    @RunWith(Suite.class)
      @Suite.SuiteClasses({TestWordDealUtil.class})

       public class RunAllUtilTestsSuite {}

创建一个空类作为测试套件的入口。 
使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。 
将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。 
将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。 
保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。

 

9   参数化测试

为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。 
为测试类声明几个变量,分别用于存放期望值和测试所用数据。 
为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。 
为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。 
编写测试方法,使用定义的变量作为参数进行测试。 
      view plaincopy to clipboardprint?
@RunWith(Parameterized.class)   
public class TestWordDealUtilWithParam {   

        private String expected;   
       
        private String target;   
       
        @Parameters 
        public static Collection words(){   
                return Arrays.asList(new Object[][]{   
                {"employee_info", "employeeInfo"},      //测试一般的处理情况   
                {null, null},                           //测试 null 时的处理情况   
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|   
|-------- XML error: The previous line is longer than the max of 90 characters ---------|   
                {"", ""},                               //测试空字符串时的处理情况   
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|   
|-------- XML error: The previous line is longer than the max of 90 characters ---------|   
                {"employee_info", "EmployeeInfo"},      //测试当首字母大写时的情况   
                {"employee_info_a", "employeeInfoA"},   //测试当尾字母为大写时的情况   
                {"employee_a_info", "employeeAInfo"}    //测试多个相连字母大写时的情况   
                });   
        }   
       
        /** 
        * 参数化测试必须的构造函数 
        * @param expected   期望的测试结果,对应参数集中的第一个参数 
        * @param target 测试数据,对应参数集中的第二个参数 
        */ 
        public TestWordDealUtilWithParam(String expected , String target){   
            this.expected = expected;   
            this.target = target;   
        }   
       
        /** 
        * 测试将 Java 对象名称到数据库名称的转换 
        */ 
        @Test public void wordFormat4DB(){   
            assertEquals(expected, WordDealUtil.wordFormat4DB(target));   
        }   

@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {

   private String expected;

   private String target;

   @Parameters
   public static Collection words(){
        return Arrays.asList(new Object[][]{
           {"employee_info", "employeeInfo"},   //测试一般的处理情况
           {null, null},        //测试 null 时的处理情况
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
           {"", ""},         //测试空字符串时的处理情况
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
           {"employee_info", "EmployeeInfo"},   //测试当首字母大写时的情况
           {"employee_info_a", "employeeInfoA"}, //测试当尾字母为大写时的情况
           {"employee_a_info", "employeeAInfo"} //测试多个相连字母大写时的情况
        });
   }

/**
* 参数化测试必须的构造函数
* @param expected 期望的测试结果,对应参数集中的第一个参数
* @param target 测试数据,对应参数集中的第二个参数
*/
   public TestWordDealUtilWithParam(String expected , String target){
    this.expected = expected;
    this.target = target;
   }

/**
* 测试将 Java 对象名称到数据库名称的转换
*/
   @Test public void wordFormat4DB(){
    assertEquals(expected, WordDealUtil.wordFormat4DB(target));
   }
}

 

2     @Before              @After                   (针对实例)

使用注解 org,junit.Before 修饰用于初始化 Fixture 的方法。 
使用注解 org.junit.After 修饰用于注销 Fixture 的方法。 
保证这两种方法都使用 public void 修饰,而且不能带有任何参数。 

1    @BeforeClass      @AfterClass          (针对类)

使用注解 org,junit.BeforeClass 修饰用于初始化 Fixture 的方法。 
使用注解 org.junit.AfterClass 修饰用于注销 Fixture 的方法。 
保证这两种方法都使用 public static void 修饰,而且不能带有任何参数。 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值