JUnit学习

很早以前就知道JUnit也知道它用来做单元测试。今天突然又想到还是要学一下这个JUnit,不然说出去不知道怎么用JUnit做单元测试……作为一个程序员怪丢人的。第一篇JUnit不算是一个总结性的文章,只算是第一次摸索着学习JUint怎么来用。到目前来看,确实可能和网上说的一样,不过是多了几个main方法而已,不过,我相信随着学习的深入,JUnit不仅仅是作为几个main方法来调用这么简单。

使用JUnit官方提供了几种方法,一是手动导入jar包,但在手动导入jar包的时候一定要记得导入两个包:

我们这里使用junit-4.12.jar和hamcrest-core-1.3.jar。JUnit的GitHub地址:https://github.com/junit-team/junit4/wiki/Download-and-Install

我们首先来写一个计算器类(之前在简单工厂里同样实现过计算器,这里为演示JUnit的demo,所以就不要在意是否面向对象等等问题了)。

 1 package day_13_junit;
 2 
 3 /**
 4  * @author turbo
 5  *
 6  * 2016年9月18日
 7  */
 8 public class Calc {
 9     public double add(double numberA, double numberB){
10         return numberA + numberB;
11     }
12     
13     public double div(double numberA, double numberB){
14         return numberA - numberB;
15     }
16     
17     public double mul(double numberA, double numberB){
18         return numberA * numberB;
19     }
20     
21     public double sub(double numberA, double numberB){
22         return numberA / numberB;
23     }
24 }

好了,我们现在要来测试这个计算器的一般做法是写一个main方法吧,这确实也没问题,这次我们用JUnit来做测试。

 1 package day_13_junit;
 2 
 3 import static org.junit.Assert.assertEquals;
 4 
 5 import org.junit.Before;
 6 import org.junit.Test;
 7 
 8 /**
 9  * 单元测试
10  * @author turbo
11  *
12  * 2016年9月18日
13  */
14 public class TestCalc {
15     Calc calc;
16     
17     @Before
18     public void setUp(){
19         calc = new Calc();
20     }
21     
22     @Test
23     public void testAdd(){
24         double result = calc.add(1, 1);
25         System.out.println(result);
26         assertEquals(1.0, result, 1.0);
27         
28     }
29     
30     @Test
31     public void testDiv(){
32         double result = calc.div(1, 2);
33         System.out.println(result);
34     }
35 }

@Before注解从字面上来很好理解,在执行具体某个测试方法前执行这个方法。

@Test就是具体的测试方法。

我们看到一个assertEqueals静态方法第一个参数表示期望值,第二个参数表示实际值,第三个参数表示误差值。在Assert类中对该方法有大量的重载,由于double类型方法在以前的JUnit的assertEqueals只有两个参数,当我只写两个参数时发现已经被弃用。

我们可以通过源码发现:

1 /**
2      * @deprecated Use
3      *             <code>assertEquals(double expected, double actual, double delta)</code>
4      *             instead
5      */
6     @Deprecated
7     static public void assertEquals(double expected, double actual) {
8         assertEquals(null, expected, actual);
9     }

原来两个参数的assertEquals方法已经被替换,新增加了一个误差值参数。我们看看替换的方法。

 1  /**
 2      * Asserts that two doubles are equal to within a positive delta.
 3      * If they are not, an {@link AssertionError} is thrown. If the expected
 4      * value is infinity then the delta value is ignored.NaNs are considered
 5      * equal: <code>assertEquals(Double.NaN, Double.NaN, *)</code> passes
 6      *
 7      * @param expected expected value
 8      * @param actual the value to check against <code>expected</code>
 9      * @param delta the maximum delta between <code>expected</code> and
10      * <code>actual</code> for which both numbers are still
11      * considered equal.
12      */
13     static public void assertEquals(double expected, double actual, double delta) {
14         assertEquals(null, expected, actual, delta);
15     }

对该方法的参数解释前两个参数很好懂,为什么会新增一个误差值呢?因为double类型浮点数运算并不一定是“绝对准确”的,所以新增一个误差值,这个误差值的范围在期望值和实际值之间。什么意思呢?比如1.0+1.0应该等于2.0,所以我们期望它等于2.0,但实际情况可能某种原因并非如此,所以我们给它一个误差值1.0,这样在范围1.0~3.0都可以认为是“正确”的。

这两个@Test方法,在空白处选择JUnit Test运行时可以同时运行。当我们只想运行一个@Test方法时,只需选择方法名右键选择JUnit Test运行即可运行单个方法。

第一次的JUnit学习就到这里了,一点点小东西,没什么干货,重在积累,重在坚持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Core Net

一个插排引发的设计思想 (三) 委托与事件

28180
来自专栏陈本布衣

JAXB应用实例

过往的项目中数据存储都离不开数据库,不过最近做的一个项目的某些数据(比如人员信息、菜单、权限等等)却完全没有涉及任何数据库操作,直接XML搞定。这里无意比较优...

42690
来自专栏函数式编程语言及工具

泛函编程(35)-泛函Stream IO:IO处理过程-IO Process

    IO处理可以说是计算机技术的核心。不是吗?使用计算机的目的就是希望它对输入数据进行运算后向我们输出计算结果。所谓Stream IO简单来说就是对一串按序...

212100
来自专栏Flutter入门到实战

推特开源的Serial,轻量级,快速的json解析框架

你还在用Gson,fastjson吗?最近几个月推特开源了她们的json解析和序列化框架 Serial,这是一个轻量级框架,操作起来也很简单。下面简单的介绍一下...

19710
来自专栏张善友的专栏

怎么解决web service circular reference 问题

下面是一个非常简单的例子: using System; using System.Data; using System.Configuration; using...

22150
来自专栏公众号_薛勤的博客

使用Filter过滤器+重写Request完美解决乱码问题

14030
来自专栏Android Note

Kotlin中run, with, let, also and apply使用方法

11520
来自专栏函数式编程语言及工具

泛函编程(38)-泛函Stream IO:IO Process in action

  在前面的几节讨论里我们终于得出了一个概括又通用的IO Process类型Process[F[_],O]。这个类型同时可以代表数据源(Source)和数据终端...

21170
来自专栏牛肉圆粉不加葱

Spark的位置优先: TaskSetManager 的有效 Locality Levels

在Spark Application Web UI的 Stages tag 上,我们可以看到这个的表格,描述的是某个 stage 的 tasks 的一些信息,其...

15030
来自专栏Hongten

spring开发_注入其他Bean的方法返回值_MethodInvokingFactoryBean

http://www.cnblogs.com/hongten/gallery/image/112562.html

12620

扫码关注云+社区

领取腾讯云代金券