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

开发 开发工具
本文主要介绍了JUnit的常见用法

上一弹中介绍了单元测试以及单元测试框架(《单元测试第二弹——单元测试与单元测试框架》),这一弹主要来介绍一下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也有同样的功能)

使用Junit进行测试

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

使用Junit进行测试

可以看到,一般的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

public class Assert extends java.lang.Object

这个类提供了一系列的编写测试的有用的声明方法。只有失败的声明方法才会被记录。

(1)void assertEquals(boolean expected, boolean actual)

         检查两个变量或者等式是否平衡

(2)void assertFalse(boolean condition)

        检查条件是假的

(3)void assertNotNull(Object object)

        检查对象不是空的

(4)void assertNull(Object object)

        检查对象是空的

(5)void assertTrue(boolean condition)

        检查条件为真

(6)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的原创文章,转载联系作者本人获取授权】

 

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

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2017-01-16 12:12:29

单元测试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

2024-10-16 16:09:32

2011-11-18 15:18:41

Junit单元测试Java

2009-08-19 09:00:48

单元测试框架自动化测试

2015-09-28 15:03:38

网络架构测试

2011-07-04 18:16:42

单元测试

2020-05-07 17:30:49

开发iOS技术

2021-05-05 11:38:40

TestNGPowerMock单元测试
点赞
收藏

51CTO技术栈公众号