在编码的过程当中,须要单元测试,写测试用例,junit就能派上用场。我如今把一个测试方法看成一个测试用例。
java
在早期junit3中,须要继承junit.framework.TestCase,这里有诸多限制:好比测试的方法名必须以test开头,setUp、tearDown方法名也是固定的。setUp、tearDown的用途就是统一给多个测试方法准备数据、清理现场,减小了重复工做,在测试术语中他们叫测试夹具。一个完整的测试用例:先执行setUp,再执行测试方法,最后执行tearDown。各个测试用例之间是没有顺序的。
spring
在如今的junit4中,扩展了几个注解,不须要继承junit.framework.TestCase:单元测试
一、@BeforeClass:放在一个public static void方法上,这个方法最早执行,并且只执行一次。能够用于加载一些静态配置文件,环境设置等。测试
二、@AfterClass:放在一个public static void方法上,这个方法最后执行,并且只执行一次。可用于清理数据、环境等。在某些状况下,环境的设置与清理只须要执行一次,能够考虑使用@BeforeClass、@AfterClass,相对与@Before、@After来讲,效率有所提升。ui
三、@Before:放在一个public void方法上,在每一个测试方法执行以前执行。通常的用途为测试方法准备测试数据。编码
四、@After:放在一个public void方法上,在每一个测试方法执行以后执行。通常的用途为清理现场,不干扰下一个测试方法的执行。spa
五、@Test:放在一个public void方法上,这是执行测试的方法,是测试主体。
.net
六、@Ignore:能够放在测试方法上,忽略该测试方法不执行;也能够放在测试类上,整个测试类的全部测试方法将会忽略掉,不执行。code
七、@FixMethodOrder:放在测试类上。某些状况下,若是须要测试方法按照必定的顺序执行,能够加上他。通常来讲,测试方法之间是相互独立的,没有执行顺序的要求。blog
八、@Parameters:放在一个public static方法上,并返回测试数据集合。在参数化测试中用到这个注解,配合@RunWith(Parameterized.class)一块儿使用。详细介绍见 junit4 测试参数化
九、@SuiteClasses:放在测试类上。这里的测试类用于组合其余多个测试类一块儿执行,好比如今有10个测试类,咱们想执行其中的3个测试类,这个注解就能够知足咱们的要求。配合@RunWith(Suite.class)一块儿使用。
十、@Category:放在测试方法或测试测试类上,配合@RunWith(Categories.class)、@SuiteClasses一块儿使用;Categories也是一个Suite。和注解@SuiteClasses相似,不过@Category能够更细粒度的控制组合,能够按测试方法组合在一块儿:好比A测试类有5个测试方法,B测试类有3个测试方法,@Category能够组合A中的两个方法、B中的一个方法。
十一、@RunWith:放在测试类上。通常咱们要用到junit的一些增强功能,须要用到他:好比组合测试@RunWith(Suite.class)、参数化测试@RunWith(Parameterized.class)、集成spring测试@RunWith(SpringJUnit4ClassRunner.class)等等。
十二、@Rule:规则注解,放在public属性上,而且直接或者间接实现了org.junit.rules.TestRule,能够灵活的定义一些规则:好比:org.junit.rules.ExpectedException可用于异常测试。详细介绍见 junit4 测试异常
虽然加注解的方法名能够任意写其余合法的方法名,但最好仍是表意,便于阅读理解。
package cn.wonhigh.o2o.test; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.FixMethodOrder; import org.junit.Ignore; import org.junit.Test; import org.junit.runners.MethodSorters; // 指定测试方法的执行顺序 @FixMethodOrder(MethodSorters.NAME_ASCENDING) public class Junit4Test { // 方法名任意 @BeforeClass public static void setUpBeforeClass() throws Exception { System.out.println("最早执行"); } // 方法名任意 @AfterClass public static void tearDownAfterClass() throws Exception { System.out.println("最后执行"); } // 方法名任意 @Before public void setUp() throws Exception { System.out.println("在测试方法以前执行"); } // 方法名任意 @After public void tearDown() throws Exception { System.out.println("在测试方法以后执行"); } // 方法名任意 @Test public void method1() { System.out.println("测试方法1"); } // 方法名任意 @Test public void method2() { System.out.println("测试方法2"); } // 该方法将被忽略调,不会执行 @Ignore @Test public void method3() { System.out.println("测试方法3"); } }
输出:
最早执行 在测试方法以前执行 测试方法1 在测试方法以后执行 在测试方法以前执行 测试方法2 在测试方法以后执行 最后执行