上一弹中介绍了单元测试以及单元测试框架,这一弹主要来介绍一下JUnit这个目前比较流行的单测框架。java
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,由于程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就能够用Junit进行自动测试了。程序员
如今不少IDE中都已经集成了JUnit,当咱们在建立maven项目的时候,通常在pom文件中也会自动增长junit的依赖。编程
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> <version>4.4</version> </dependency>
注意上面的maven的依赖中的scope,由于junit只在测试代码中会被用到,这里scope指定未test便可。咱们直接使用和介绍JUnit4。api
上手JUnit
要测试,要先有被测代码(固然,基于测试编程能够先有测试代码)。先来看咱们想要测试的代码:markdown
public class CaculateService { public float divide(float divisor, float dividend) { return divisor / dividend; } }
咱们想要测试这个类,那么如何使用Junit进行测试呢?先来写一个测试类。若是你使用的是IntelliJ+Mac,那么能够在类名上使用快捷键option+enter直接生成测试类,这样IDE会帮忙生成一个对应的测试类。(其余操做系统和IDE也有一样的功能)框架
生成后的测试代码和被测代码所处路径以下:maven
能够看到,通常的maven项目中,会在src/main下面有两个目录,java和test,java目录中放的是源码,test目录中放的是测试代码。测试代码和测试代码的包名保持一致便可。ide
测试代码以下:单元测试
public class CaculateServiceTest { CaculateService caculateService = new CaculateService(); @Test public void testDivide() throws Exception { Assert.assertEquals(caculateService.divide(2, 1), 2.0); } }
而后执行该方法就能够了,先无论Assert.assertEquals的用法及结果,这里总结下使用JUnit写测试代码的简单步骤:测试
建立一个名为 CaculateServiceTest.java 的测试类。
向测试类中添加名为 testDivide() 的方法。
向方法中添加 Annotaion @Test。
执行测试条件而且应用 Junit 的 assertEquals API 来检查。
JUnit中的Assert
public class Assert extends java.lang.Object
这个类提供了一系列的编写测试的有用的声明方法。只有失败的声明方法才会被记录。
Assert能够用来判断方法的真是结果和预期结果是否同样。是咱们在写单元测试中用到最多的一个api。
@BeforeClass:针对全部测试,只执行一次,且必须为static void
@Before:初始化方法
@Test:测试方法,在这里能够测试指望异常和超时时间
@After:释放资源
@Ignore:忽略的测试方法
一个单元测试类执行顺序为:
@BeforeClass –> @Before –> @Test –> @After –> @AfterClass
每个测试方法的调用顺序为:
@Before –> @Test –> @After
时间测试
若是一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout 参数和 @Test 注释一块儿使用。如今让咱们看看活动中的 @test(timeout)。
@Test(timeout = 1000) public void testTimeoutSuccess() { // do nothing }
异常测试
你能够测试代码是否它抛出了想要获得的异常。expected 参数和 @Test 注释一块儿使用。如今让咱们看看活动中的 @Test(expected)。
@Test(expected = NullPointerException.class) public void testException() { throw new NullPointerException(); }
全部测试代码
代码地址
package com.hollischuang.effective.unitest.service; import org.junit.*; /** * @author Hollis 17/1/7. */ public class JUnitTest { /** * 只执行一次,在整个类执行以前执行 */ @BeforeClass public static void beforeClass() { System.out.println("in before class"); } /** * 只执行一次,在整个类执行以后执行 */ @AfterClass public static void afterClass() { System.out.println("in after class"); } /** * 每一个测试方法被执行前都被执行一次 */ @Before public void before() { System.out.println("in before"); } /** * 每一个测试方法被执行后都被执行一次 */ @After public void after() { System.out.println("in after"); } // test case 1 @Test public void testCase1() { System.out.println("in test case 1"); } // test case 2 @Test public void testCase2() { System.out.println("in test case 2"); } /** * 测试assertEquals */ @Test public void testEquals() { Assert.assertEquals(1 + 2, 3); } /** * 测试assertTrue */ @Test public void testTrue() { Assert.assertTrue(1 + 2 == 3); } /** * 测试assertFalse */ @Test public void testFals() { Assert.assertFalse(1 + 2 == 4); } /** * 测试assertNotNull */ @Test public void assertNotNull() { Assert.assertNotNull("not null"); } /** * 测试assertNull */ @Test public void assertNull() { Assert.assertNull(null); } /** * 测试fail和Ignore */ @Test @Ignore public void assertFail() { Assert.fail(); } /** * 测试异常 */ @Test(expected = NullPointerException.class) public void testException() { throw new NullPointerException(); } /** * 测试时间 */ @Test(timeout = 1000) public void testTimeoutSuccess() { // do nothing } /** * 测试时间 */ @Test(timeout = 1000) public void testTimeoutFailed() { while (true) { } } }
本文主要介绍了JUnit的常见用法,后面会专门写一篇文章介绍如何将JUnit和Spring集合到一块儿。
相关推荐
无单测、不编码——写单元测试的重要性
单元测试第一弹——从软件开发生命周期谈单元测试
单元测试第二弹——单元测试与单元测试框架