1.概述
什么是单元测试:
单元测试,是针对最小的功能单元编写测试代码,在JAVA中最小的功能单元是方法,单元测试针对JAVA就是单个方法的测试。目的就是保证单个方法的正常运行。
JUnit是什么:
专门针对java语言设计,使用广泛的一个标准单元测试框架。使用断言+注解的方式对单个方法进行测试。注解用来控制行为,断言用来进行判断。
2.断言
名称 | 说明 | 示例 |
assertEquals | 相等 | assertEquals(100,x) |
assertArrayEquals | 数组相等 | assertArrayEquals({1,2,3},x) |
assertEquals | 浮点数相等 | assertEquals(3.1415926,x) |
assertNull | null | assertNull(x) |
assertTrue | true | assertTrue(x>0) |
assertFalse | false | assertFalse(x<0) |
assertNotEquals | 不相等 | assertNotEquals(100,x) |
assertNotNull | 不为空 | assertNotNull(x) |
3.常用注解
3.1.@Test
@Test,用来注解单个测试用例,每个@Test就是个独立的单元,单个@Test的生命周期是相互独立的。
代码示例:
public class Demo1Test { Demo1 demo1; public Demo1Test(){ System.out.println("建立测试用例!"); } @Before public void before(){ System.out.println("测试开始!"); demo1=new Demo1(); } @Test public void testSum1(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @Test public void testSum2(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @After public void after(){ System.out.println("测试结束!"); } }
测试结果:
3.2.@Before
@Before,@Test之前执行,一般用于准备一些资源。
代码示例:
public class Demo1Test { Demo1 demo1; @Before public void before(){ demo1=new Demo1(); } @Test public void testSum(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } }
3.3.@After
@After,@Test之后执行,一般用于释放一些资源。
代码示例:
public class Demo1Test { Demo1 demo1; @Before public void before(){ demo1=new Demo1(); } @Test public void testSum(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @After public void after(){ System.out.println("测试结束!"); } }
3.4.@BeforeClass
@BeforeClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期开始的时候执行一次。
一般用于准备一些所有用例共享的资源。
代码示例:
public class Demo1Test { Demo1 demo1; @BeforeClass public static void beforeClass(){ System.out.println("beforeClass......"); } public Demo1Test(){ System.out.println("建立测试用例!"); } @Before public void before(){ System.out.println("测试开始!"); demo1=new Demo1(); } @Test public void testSum1(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @Test public void testSum2(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @After public void after(){ System.out.println("测试结束!"); } }
运行结果:
3.5.@AfterClass
@AfterClass,作用于类层面,修饰静态方法,整个类的生命周期中,只在类的生命周期结束的时候执行一次。
一般用于销毁一些所有用例共享的资源。
代码示例:
1.public class Demo1Test { Demo1 demo1; @BeforeClass public static void beforeClass(){ System.out.println("beforeClass......"); } public Demo1Test(){ System.out.println("建立测试用例!"); } @Before public void before(){ System.out.println("测试开始!"); demo1=new Demo1(); } @Test public void testSum1(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @Test public void testSum2(){ Assert.assertEquals("65",demo1.sum("5",2,4,6)); } @After public void after(){ System.out.println("测试结束!"); } @AfterClass public static void afterClass(){ System.out.println("afterClass......"); } }
运行结果:
4.异常测试
通过@Test注解的expected属性可以断定该TestCase抛出的异常,抛出不匹配的异常会报错。
代码示例:
@Test(expected = NumberFormatException.class) public void testNumberFormat(){ Integer.parseInt(null); }
5.超时测试
通过@Test注解的timeout属性可以设置每个TestCase执行耗时的时间阈值,超时会报错。
代码示例:
@Test(timeout = 3000) public void testNumberFormat(){ try { Thread.sleep(4000); } catch (InterruptedException e) { e.printStackTrace(); } }
6.参数化测试
Junit提供了输入一组参数进行测试的机制。
代码示例:
@RunWith(Parameterized.class) public class ParameterTest { //用于准备一组数据的方法 //方法严格约定为 public Collection<?> data() @Parameterized.Parameters public static Collection<?> data(){ return Arrays.asList(new Object[][]{ {0,0},{1,1},{-1,1} }); } int input; int expected; //准备好的数据会在构造方法中自动传递过来 public ParameterTest(int input,int expected){ this.input=input; this.expected=expected; } @Test public void testAbs(){ int r=Math.abs(this.input); Assert.assertEquals(this.expected,r); } }