单元测试第三弹——使用JUnit进行单元测试

开发 开发工具
JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。

上一弹中介绍了单元测试以及单元测试框架,这一弹主要来介绍一下JUnit这个目前比较流行的单测框架。

JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。

现在很多IDE中都已经集成了JUnit,当我们在创建maven项目的时候,一般在pom文件中也会自动增加junit的依赖。

  1. <dependency> 
  2.     <groupId>junit</groupId> 
  3.     <artifactId>junit</artifactId> 
  4.     <scope>test</scope> 
  5.     <version>4.4</version> 
  6. </dependency> 

注意上面的maven的依赖中的scope,因为junit只在测试代码中会被用到,这里scope指定未test即可。我们直接使用和介绍JUnit4。

上手JUnit

要测试,要先有被测代码(当然,基于测试编程可以先有测试代码)。先来看我们想要测试的代码:

  1. public class CaculateService { 
  2.     public float divide(float divisor, float dividend) { 
  3.         return divisor / dividend; 
  4.     } 

我们想要测试这个类,那么如何使用Junit进行测试呢?先来写一个测试类。如果你使用的是IntelliJ+Mac,那么可以在类名上使用快捷键option+enter直接生成测试类,这样IDE会帮忙生成一个对应的测试类。(其他操作系统和IDE也有同样的功能)

生成后的测试代码和被测代码所处路径如下:

可以看到,一般的maven项目中,会在src/main下面有两个目录,java和test,java目录中放的是源码,test目录中放的是测试代码。测试代码和测试代码的包名保持一致即可。

测试代码如下:

  1. public class CaculateServiceTest { 
  2.     CaculateService caculateService = new CaculateService(); 
  3.     @Test 
  4.     public void testDivide() throws Exception { 
  5.        Assert.assertEquals(caculateService.divide(2, 1), 2.0); 
  6.     } 
  7.  

然后执行该方法就可以了,先不管Assert.assertEquals的用法及结果,这里总结下使用JUnit写测试代码的简单步骤:

  • 创建一个名为 CaculateServiceTest.java 的测试类。
  • 向测试类中添加名为 testDivide() 的方法。
  • 向方法中添加 Annotaion @Test。
  • 执行测试条件并且应用 Junit 的 assertEquals API 来检查。

JUnit中的Assert

  1. public class Assert extends java.lang.Object 
  • 这个类提供了一系列的编写测试的有用的声明方法。只有失败的声明方法才会被记录。
  1. void assertEquals(boolean expected, boolean actual) 
  • 检查两个变量或者等式是否平衡
  1. void assertFalse(boolean condition) 
  • 检查条件是假的
  1. void assertNotNull(Object object) 
  • 检查对象不是空的
  1. void assertNull(Object object) 
  • 检查对象是空的
  1. void assertTrue(boolean condition) 
  • 检查条件为真
  1. void fail() 
  • 在没有报告的情况下使测试不通过

这些方法我就不一一介绍了,相信我的读者们都能看懂并在平时开发中用的到,还是比较容易理解的。

Assert可以用来判断方法的真是结果和预期结果是否一样。是我们在写单元测试中用到最多的一个api。

JUnit中的注解

  • @BeforeClass:针对所有测试,只执行一次,且必须为static void
  • @Before:初始化方法
  • @Test:测试方法,在这里可以测试期望异常和超时时间
  • @After:释放资源
  • @AfterClass:针对所有测试,只执行一次,且必须为static void
  • @Ignore:忽略的测试方法

一个单元测试类执行顺序为:

@BeforeClass –> @Before –> @Test –> @After –> @AfterClass

每一个测试方法的调用顺序为:

@Before –> @Test –> @After

时间测试

如果一个测试用例比起指定的毫秒数花费了更多的时间,那么 Junit 将自动将它标记为失败。timeout 参数和 @Test 注释一起使用。现在让我们看看活动中的 @test(timeout)。

  1. @Test(timeout = 1000)  
  2. public void testTimeoutSuccess() {  
  3. // do nothing  

异常测试

你可以测试代码是否它抛出了想要得到的异常。expected 参数和 @Test 注释一起使用。现在让我们看看活动中的 @Test(expected)。

  1. @Test(expected = NullPointerException.class)  
  2. public void testException() {  
  3. throw new NullPointerException();  

所有测试代码

  1. package com.hollischuang.effective.unitest.service; 
  2.  
  3. import org.junit.*; 
  4.  
  5. /** 
  6.  * @author Hollis 17/1/7. 
  7.  */ 
  8. public class JUnitTest { 
  9.  
  10.     /** 
  11.      * 只执行一次,在整个类执行之前执行 
  12.      */ 
  13.     @BeforeClass 
  14.     public static void beforeClass() { 
  15.         System.out.println("in before class"); 
  16.     } 
  17.  
  18.     /** 
  19.      * 只执行一次,在整个类执行之后执行 
  20.      */ 
  21.     @AfterClass 
  22.     public static void afterClass() { 
  23.         System.out.println("in after class"); 
  24.     } 
  25.  
  26.     /** 
  27.      * 每个测试方法被执行前都被执行一次 
  28.      */ 
  29.     @Before 
  30.     public void before() { 
  31.         System.out.println("in before"); 
  32.     } 
  33.  
  34.     /** 
  35.      * 每个测试方法被执行后都被执行一次 
  36.      */ 
  37.     @After 
  38.     public void after() { 
  39.         System.out.println("in after"); 
  40.     } 
  41.  
  42.     // test case 1 
  43.     @Test 
  44.     public void testCase1() { 
  45.         System.out.println("in test case 1"); 
  46.     } 
  47.  
  48.     // test case 2 
  49.     @Test 
  50.     public void testCase2() { 
  51.         System.out.println("in test case 2"); 
  52.     } 
  53.  
  54.     /** 
  55.      * 测试assertEquals 
  56.      */ 
  57.     @Test 
  58.     public void testEquals() { 
  59.         Assert.assertEquals(1 + 2, 3); 
  60.     } 
  61.  
  62.     /** 
  63.      * 测试assertTrue 
  64.      */ 
  65.     @Test 
  66.     public void testTrue() { 
  67.         Assert.assertTrue(1 + 2 == 3); 
  68.     } 
  69.  
  70.     /** 
  71.      * 测试assertFalse 
  72.      */ 
  73.     @Test 
  74.     public void testFals() { 
  75.         Assert.assertFalse(1 + 2 == 4); 
  76.     } 
  77.  
  78.     /** 
  79.      * 测试assertNotNull 
  80.      */ 
  81.     @Test 
  82.     public void assertNotNull() { 
  83.         Assert.assertNotNull("not null"); 
  84.     } 
  85.  
  86.     /** 
  87.      * 测试assertNull 
  88.      */ 
  89.     @Test 
  90.     public void assertNull() { 
  91.         Assert.assertNull(null); 
  92.     } 
  93.  
  94.     /** 
  95.      * 测试fail和Ignore 
  96.      */ 
  97.     @Test 
  98.     @Ignore 
  99.     public void assertFail() { 
  100.         Assert.fail(); 
  101.     } 
  102.  
  103.     /** 
  104.      * 测试异常 
  105.      */ 
  106.     @Test(expected = NullPointerException.class) 
  107.     public void testException() { 
  108.         throw new NullPointerException(); 
  109.     } 
  110.  
  111.     /** 
  112.      * 测试时间 
  113.      */ 
  114.     @Test(timeout = 1000) 
  115.     public void testTimeoutSuccess() { 
  116.         // do nothing 
  117.     } 
  118.  
  119.     /** 
  120.      * 测试时间 
  121.      */ 
  122.     @Test(timeout = 1000) 
  123.     public void testTimeoutFailed() { 
  124.         while (true) { 
  125.  
  126.         } 
  127.     } 

总结

本文主要介绍了JUnit的常见用法,后面会专门写一篇文章介绍如何将JUnit和Spring集合到一起。

【本文是51CTO专栏作者Hollis的原创文章,作者微信公众号Hollis(ID:hollischuang)】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: Hollis
相关推荐

2017-01-14 23:26:17

单元测试JUnit测试

2017-03-23 16:02:10

Mock技术单元测试

2017-01-14 23:42:49

单元测试框架软件测试

2013-06-04 09:49:04

Spring单元测试软件测试

2011-08-11 13:02:43

Struts2Junit

2021-03-28 23:03:50

Python程序员编码

2023-07-26 08:58:45

Golang单元测试

2009-06-08 20:04:06

EclipseJUnit4单元测试

2023-08-02 13:59:00

GoogleTestCTest单元测试

2009-06-08 19:59:09

EclipseJUnit单元测试

2009-06-08 19:57:29

EclipseJUnit4单元测试

2012-05-17 09:09:05

Titanium单元测试

2020-08-18 08:10:02

单元测试Java

2009-08-19 09:00:48

单元测试框架自动化测试

2011-11-18 15:18:41

Junit单元测试Java

2015-09-28 15:03:38

网络架构测试

2021-05-05 11:38:40

TestNGPowerMock单元测试

2020-05-07 17:30:49

开发iOS技术

2011-07-04 18:16:42

单元测试

2010-03-04 15:40:14

Python单元测试
点赞
收藏

51CTO技术栈公众号