标签:
使用jUnit4的操作步骤及注意事项:
1.为项目导入Junit的jar包(Build path -> Add Library ->Junit)。
2.新建一个名为Test的Source Folder,用于存放测试类源代码。
3.目标类与测试类应该位于同一个报下面,这样测试类中就不必导入源代码所在的包,因为他们位于用一个包下面。
4.Junit4并不需要测试类继承TestCase父类。
5.在一个测试类中,所有被@Test注解所修饰的public void方法都是testCase(测试用例),可以被Junit所执行。
6.规范:虽然Junit4并不要求测试方法名以test开头,但最好还是按照Junit3的要求那样,以test作为测试方法名的开头。
7.在Junit4中,通过@Before注解实现与Junit3中的setUp方法同样的功能。
8.在Junit4中,可以使用@BeforeClass与@AfterClass注解修饰一个public static void no—arg的方法,这样被@beforeClass注解所修饰的方法会在所有测试方法执行前执行。
9.注解@lgnore可用于修饰测试类与测试方法,当修饰测试类时,表示忽略掉类中的所有测试方法;当修饰测试方法时,表示忽略掉该测试方法。
10.参数化测试(Parameters):当一个测试类使用参数化运行器运行时,
需要在类的声明处加上 @RunWith(Parameterized.class)注解,表示该类将不使用JUnit内建的运行器运行,
而使用参数化运行器运行;在参数化运行类中提供参数的方法上要使用 @Parameters注解来修饰,
同时在测试类的构造方法中为各个参数赋值(构造方法是由JUnit 调用的),
最后编写测试类,它会根据参数的组数来运行测试多次。
11.在JUnit4中,如果想要同时运行多个测试,需要使用两个注解:
@RunWith(Suite.class)以及 @Suite.SuiteClasses(),通过这两个注解分别指定使用Suite运行器来运行测试,
以及指定了运行哪些测试类,其中的 @SuiteClasses中可以继续指定Suite,这样JUnit会再去寻找里面的测试类,
一直找到能够执行的TestCase并执行之。
12.JUnit4中可以使用JUnit3的方法进行测试,而不使用注解机制,即JUnit3可以完美升级至JUnit4,但4更灵活、方便。
Eg:
//在所有测试方法前执行一次
@BeforeClass
//在所有测试方法后执行一次
@AfterClass
//在每个测试方法前执行
@Before
//在每个测试方法后执行
@After
// 测试方法执行超过1000毫秒后算超时,测试将失败
@Test(timeout = 1000)
// 测试方法期望得到的异常类
@Test(expected = Exception.class)
// 执行测试时将忽略掉此方法,如果用于修饰类,则忽略整个类
@Ignore("not ready yet")
@Test
Eg:简单Junit4测试类。
public class BuyerTest {
private static BuyerService buyerService;
@BeforeClass
public static void setUpBeforeClass() throws Exception {
try {
ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
buyerService = (BuyerService) act.getBean("buyerServiceBean");
} catch (RuntimeException e) {
System.out.println(e.getMessage());
e.printStackTrace();
}
}
@Test
public void save() {
System.out.println("测试Spring3.05+JPA(Hibernate3.6)环境");
for (int i = 0; i < 26; i++) {
buyerService.save(new Buyer("S7HF" + i, MD5.MD5Encode("123456"),
"xiangyunzk.net163@.com"));
}
}
}
基于Spring注解的方式测试:
首先需要增加org.springframework.test-3.0.5.RELEASE.jar当然junit4.jar必不可少。
首先来一个能够自动回滚的用于测试的父类——AbstractTestCase
package cn.itcast.junit.test;
import org.junit.runner.RunWith;
import org.springframework.test.AbstractTransactionalDataSourceSpringContextTests;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
/**
* @Title: AbstractTestCase.java
* @Package: cn.itcast.junit.test
* @Description: TODO(用一句话描述该文件做什么)
* @author: 何枫
* @date: 2012-6-28 下午09:59:36
* @version: V1.0
*/
@SuppressWarnings("deprecation")
@ContextConfiguration({"classpath:applicationContext.xml","classpath:spring/buyer/applicationContext-service.xml"
})
@RunWith(SpringJUnit4ClassRunner.class) //SpringJUnit支持,由此引入Spring—Test框架支持。
@Transactional //这个非常关键,如果不加入这个注解配置,事务控制就会完全失效
//这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true).
//这样做操作的数据库才不会污染数据库!
@TransactionConfiguration(transactionManager = "transactionManager",defaultRollback = true)
//AbstractTransactionalDataSourceSpringContextTests要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类!
public abstract class AbstractTestCase extends
AbstractTransactionalDataSourceSpringContextTests {
}
package cn.itcast.junit.test;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import cn.itcast.bean.QueryResult;
import cn.itcast.bean.user.Buyer;
import cn.itcast.service.buyer.BuyerService;
/**
* @Title: BuyerSpringtest.java
* @Package: cn.itcast.junit.test
* @Description: TODO(用一句话描述该文件做什么)
* @author: 何枫
* @date: 2012-6-28 下午10:19:21
* @version: V1.0
*/
public class BuyerSpringTest extends AbstractTestCase {
@Autowired
private BuyerService buyerServiceBean;
@Test
public void listTest(){
System.out.println(buyerServiceBean.find(Buyer.class, 19L).toString());
}
@Test
public void getScrollDataTotal() {
QueryResult<Buyer> qr = buyerServiceBean.getScrollData(0, 5);
System.out.println("总记录数:"+ qr.getTotalRecord());
for ( Buyer buyer : qr.getResultList()) {
System.out.println(buyer.getPassword());
}
}
}
让每个测试类都写第一种方式那样写一堆配置很麻烦而且足够重复,索性来个基类来完成基础工作!
逐行解析:
@ContextConfiguration({"classpath:applicationContext.xml","classpath:spring/buyer/applicationContext-service.xml"})
导入配置文件,这里我的applicationContext配置文件是根据模块来分类的。如果有多个模块就引入多个“applicationContext-service.xml”文件。如果所有的都是写在“applicationContext。xml”中则这样导入:
@ContextConfiguration(locations = "classpath:applicationContext.xml")
@RunWith(SpringJUnit4ClassRunner.class)SpringJUnit支持,由此引入Spring-Test框架支持!
@Transactional这个非常关键,如果不加入这个注解配置,事务控制就会完全失效!
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)这里的事务关联到配置文件中的事务控制器(transactionManager = "transactionManager"),同时指定自动回滚(defaultRollback = true)。这样做操作的数据才不会污染数据库!
AbstractTransactionalDataSourceSpringContextTests要想构建这一系列的无污染纯绿色事务测试框架就必须找到这个基类!
==========================================================================
实际中一个配置如下:
/** * @Title: MeetingForSopControllerTest.java * @Package com.wafersystems.controller * @Description: TODO(用一句话描述该文件做什么) * @author Administrator * @date 2015年4月22日 下午4:16:14 */ package com.wafersystems.controller; import java.util.List; import javax.annotation.Resource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; import org.springframework.test.context.transaction.TransactionConfiguration; import com.wafersystems.dto.sop.DeviceBack; import com.wafersystems.dto.sop.MeetingRoomBackWithMap; import com.wafersystems.dto.sop.RoomBackWithMap; import com.wafersystems.dto.sop.ZoneAndRoomBackWithMap; /** * @ClassName: MeetingForSopControllerTest * @Description: TODO(这里用一句话描述这个类的作用) * @author Administrator */ @RunWith(SpringJUnit4ClassRunner.class) @TestExecutionListeners({ DependencyInjectionTestExecutionListener.class }) @ContextConfiguration("classpath:applicationContext.xml") @TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true) public class MeetingForSopControllerTest { @Resource(name = "meetingForSopController") private MeetingForSopController sop; /** * Test method for {@link com.wafersystems.controller.MeetingForSopController#overridelistAllRoomsWithMap(java.lang.String, java.lang.String, java.lang.String)}. */ @Test public void testOverridelistAllRoomsWithMap() { sop.overridelistAllRoomsWithMap("", "wafersystems.com", "xuqiang"); } @Test public void testListAllRoomsWithMap() { MeetingRoomBackWithMap meetingRoomBack = (MeetingRoomBackWithMap) sop.listAllRoomsWithMap("", "wafersystems.com", "xuqiang"); if (meetingRoomBack == null) { System.out.println("null 。。。"); System.exit(0); } int result = meetingRoomBack.getResult(); System.out.println("result: " + result); List<ZoneAndRoomBackWithMap> zones = meetingRoomBack.getZones(); for (ZoneAndRoomBackWithMap zone : zones) { System.out.println("zoneId: " + zone.getId()); System.out.println("zoneName :" + zone.getName()); List<RoomBackWithMap> rooms = zone.getRooms(); for (RoomBackWithMap room : rooms) { System.out.println(" roomName: " + room.getName()); System.out.println(" id: " + room.getRoomId()); System.out.println(" roomManager: " + room.getRoomManager()); System.out.println(" roomRemark: " + room.getRemark()); List<DeviceBack> devs = room.getDevices(); for (DeviceBack dev : devs) { System.out.println(" devId:" + dev.getDeviceId()); System.out.println(" devDevName:" + dev.getDeviceName()); } } } } }
标签:
原文地址:http://my.oschina.net/xuqiang/blog/405124