junit4单元測试总结

本文开发环境为myeclipse10.7

1.  准备工作

1.1. 选择须要单元測试的文件

创建mavenproject。右击须要单元測试的文件,选择New->other,选择Junit Test Case;

1.2. 选择Junit 4

代码放到src/test/java

1.3. 选择单元測试函数

加入Junit 4 引用

1.4. 生成test文件

2.  開始測试

2.1. 測试单个函数

方法1:鼠标选到带測试函数名上。右击,Run As Junit Test;

方法2:在Junit View里选择要測试的函数。右击Run;

2.2. 測试整个类

方法1:鼠标选到类上,右击。Run As Junit Test;

方法2:在Junit View里选择要測试的类。右击Run;

3.  经常使用技巧

3.1. 经常使用注解

在junit中经常使用的注解有@Test、@Ignore、@BeforeClass、@AfterClass、@Before、@After、@Runwith、@Parameters

JUnit4的測试类不用再继承TestCase类了。使用注解会方便非常多。

@Before

初始化方法

@After

释放资源

@Test

測试方法。在这里能够測试期望异常和超时时间

@Ignore

忽略的測试方法

@BeforeClass

针对全部測试,仅仅运行一次。且必须为static void

@AfterClass

针对全部測试。仅仅运行一次。且必须为static void

@RunWith

指定測试类使用某个执行器

@Parameters

指定測试类的測试数据集合

@Rule

同意灵活加入或又一次定义測试类中的每一个測试方法的行为

@FixMethodOrder

指定測试方法的运行顺序

一个JUnit 4 的单元測试用例运行顺序为:

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

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

@Before –> @Test –> @After

3.1.1.  @Test

@Test注解的publicvoid方法将会被当做測试用例

JUnit每次都会创建一个新的測试实例。然后调用@Test注解方法

不论什么异常的抛出都会觉得測试失败

@Test注解提供2个參数:

1。“expected”,定义測试方法应该抛出的异常,假设測试方法没有抛出异常或者抛出了一个不同的异常,測试失败

2,“timeout”。假设測试执行时间长于该定义时间,測试失败(单位为毫秒)

[java] view
plain
copy

1.  public class MathTest {

2. 
    @Test(expected=Exception.class)

3.      public void testAdd() throws Exception{

4. 
        throw new Exception();

5.      }

6. 
}

[java] view
plain
copy

1.  public class MathTest {

2. 
    )

3.      public void testAdd() {

4. 
        for(;;){

5.

6. 
        }

7.      }

8. 
}

3.1.2.  @Before

当编写測试方法时。常常会发现一些方法在运行前须要创建同样的对象

使用@Before注解一个publicvoid 方法会使该方法在@Test注解方法被运行前运行(那么就能够在该方法中创建同样的对象)

父类的@Before注解方法会在子类的@Before注解方法运行前运行

3.1.3.  @After

假设在@Before注解方法中分配了额外的资源,那么在測试运行完后。须要释放分配的资源。

使用@After注解一个publicvoid方法会使该方法在@Test注解方法运行后被运行

即使在@Before注解方法、@Test注解方法中抛出了异常,全部的@After注解方法依旧会被运行,见演示样例

父类中的@After注解方法会在子类@After注解方法运行后被运行

3.1.4.  @BeforeClass

有些时候,一些測试须要共享代价高昂的步骤(如数据库登录),这会破坏測试独立性,一般是须要优化的

使用@BeforeClass注解一个publicstatic void 方法,而且该方法不带不论什么參数,会使该方法在全部測试方法被运行前运行一次。而且仅仅运行一次

父类的@BeforeClass注解方法会在子类的@BeforeClass注解方法运行前运行

3.1.5.  @AfterClass

假设在@BeforeClass注解方法中分配了代价高昂的额外的资源。那么在測试类中的全部測试方法运行完后,须要释放分配的资源。

使用@AfterClass注解一个publicstatic void方法会使该方法在測试类中的全部測试方法运行完后被运行

即使在@BeforeClass注解方法中抛出了异常。全部的@AfterClass注解方法依旧会被运行

父类中的@AfterClass注解方法会在子类@AfterClass注解方法运行后被运行

3.1.6.  @Ignore

对包括測试类的类或@Test注解方法使用@Ignore注解将使被注解的类或方法不会被当做測试运行

JUnit运行结果中会报告被忽略的測试数

[java] view
plain
copy

1.  public class MathTest {

2. 
    @Ignore("do not test")

3.      @Test

4. 
    public void testAdd() {

5.          Math m = new Math();

6. 
        assertTrue(m.add(, ) == );

7.      }

8. 
}

[java] view
plain
copy

1.  @Ignore

2. 
public class MathTest {

3.      @Test

4. 
    public void testAdd() {

5.          Math m = new Math();

6. 
        assertTrue(m.add(, ) == );

7.      }

8. 
}

运行结果同样:

 

3.2. 制定运行顺序

JUnit4.11之后提供了MethodSorters,能够有三种方式对test运行顺序进行指定,例如以下:

/**

* Sorts the test methods by the methodname, in lexicographic order, with {@link Method#toString()} used as a
tiebreaker

*/

NAME_ASCENDING(MethodSorter.NAME_ASCENDING),

/**

* Leaves the test methods in the orderreturned by the JVM. Note that the order from the JVM may vary from run to run

*/

JVM(null),

/**

* Sorts the test methods in adeterministic, but not predictable, order

*/

DEFAULT(MethodSorter.DEFAULT);

能够小试牛刀一下:

3.2.1.  使用DEFAULT方式

默认使用一个确定的,但不可预測的顺序

package com.netease.test.junit;

import org.apache.log4j.Logger;

import org.junit.FixMethodOrder;

import org.junit.Test;

import org.junit.runners.MethodSorters;

/**

* User: hzwangxx

* Date: 14-3-31

* Time: 15:35

*/

@FixMethodOrder(MethodSorters.DEFAULT)

public
class TestOrder {

private static final Logger LOG = Logger.getLogger(TestOrder.class);

@Test

public void testFirst()
throws Exception{

LOG.info("------1--------");

}

@Test

public void testSecond()
throwsException {

LOG.info("------2--------");

}

@Test

public void testThird()
throwsException {

LOG.info("------3--------");

}

}

/*

output:

2014-03-3116:04:15,984 0    [main] INFO  - ------1--------

2014-03-3116:04:15,986 2    [main] INFO  - ------3--------

2014-03-3116:04:15,987 3    [main] INFO  - ------2--------

*/

3.2.2.  按字母排序

依据測试方法的方法名排序,依照词典排序规则(ASC,从小到大,递增)。

package com.netease.test.junit;

import org.apache.log4j.Logger;

import org.junit.FixMethodOrder;

import org.junit.Test;

import org.junit.runners.MethodSorters;

/**

* User: hzwangxx

* Date: 14-3-31

* Time: 15:35

*/

@FixMethodOrder(MethodSorters.NAME_ASCENDING)

public
class TestOrder {

private static final Logger LOG = Logger.getLogger(TestOrder.class);

@Test

public void testFirst()
throwsException {

LOG.info("------1--------");

}

@Test

public void testSecond()
throwsException {

LOG.info("------2--------");

}

@Test

public void testThird()
throws Exception{

LOG.info("------3--------");

}

}

/*

2014-03-3116:10:25,360 0    [main] INFO  - ------1--------

2014-03-3116:10:25,361 1    [main] INFO  - ------2--------

2014-03-3116:10:25,362 2    [main] INFO  - ------3--------

*/

3.3. 经常使用断言

断言是编写測试用例的核心实现方式,即期望值是多少,測试的结果是多少,以此来推断測试是否通过。

assertArrayEquals(expecteds, actuals)

查看两个数组是否相等。

assertEquals(expected, actual)

查看两个对象是否相等。类似于字符串比較使用的equals()方法

assertNotEquals(first, second)

查看两个对象是否不相等。

assertNull(object)

查看对象是否为空。

assertNotNull(object)

查看对象是否不为空。

assertSame(expected, actual)

查看两个对象的引用是否相等。类似于使用“==”比較两个对象

assertNotSame(unexpected, actual)

查看两个对象的引用是否不相等。类似于使用“!=”比較两个对象

assertTrue(condition)

查看执行结果是否为true。

assertFalse(condition)

查看执行结果是否为false。

assertThat(actual, matcher)

查看实际值是否满足指定的条件

fail()

让測试失败

 

4.  常见问题

4.1. java.lang.ClassNotFoundException

右击项目,Run As Maven Test。等待test完毕就不报该错误了。

junit4单元測试总结的更多相关文章

  1. method initializationerror not found:JUnit4单元測试报错问题

           今天使用JUnit 4进行单元測试时,測试程序一直执行不起来,报method initializationerror not found错误.例如以下:            网上说版本 ...

  2. Spring MVC Junit4 单元測试 JunitTest

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSmVyb21lX3M=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...

  3. 在Eclipse中使用JUnit4进行单元測试(0基础篇)

    本文绝大部分内容引自这篇文章: http://www.devx.com/Java/Article/31983/0/page/1 我们在编写大型程序的时候,须要写成千上万个方法或函数,这些函数的功能可能 ...

  4. 菜鸟学Java(二十一)——怎样更好的进行单元測试——JUnit

    測试在软件生命周期中的重要性,不用我多说想必大家也都很清楚.软件測试有许多分类,从測试的方法上可分为:黑盒測试.白盒測试.静态測试.动态測试等:从软件开发的过程分为:单元測试.集成測试.确认測试.验收 ...

  5. maven多module项目中千万不要引入其它模块的单元測试代码

    本文出处:http://blog.csdn.net/chaijunkun/article/details/35796335,转载请注明. 因为本人不定期会整理相关博文,会对对应内容作出完好. 因此强烈 ...

  6. (4.5.4)Android測试TestCase单元(Unit test)測试和instrumentationCase单元測试

    Android单元和instrumentation单元測试 Developing Android unit and instrumentation tests Android的单元測试是基于JUnit ...

  7. 使用maven运行单元測试总结

    maven本身没有单元測试框架,可是maven的default生命周期的test阶段绑定了maven-surefire-plugin插件,该插件能够调用Junit3.Junit4.TestNG等Jav ...

  8. 利用Continuous Testing实现Eclipse环境自己主动单元測试

    当你Eclipse环境中改动项目中的某个方法时,你可能因为各种原因没有执行单元測试,结果代码提交,悲剧就可能随之而来. 所幸infinitest(http://infinitest.github.io ...

  9. C语言单元測试

    C语言单元測试 对于敏捷开发来说,单元測试不可缺少,对于Java开发来说,JUnit非常好,对于C++开发,也有CPPUnit可供使用,而对于传统的C语言开发,就没有非常好的工具可供使用,能够找到的有 ...

随机推荐

  1. servlet+forward和direct区别

    Servlet:是用于 java 编写的服务器端程序,其使用 java servlet API,当客户机发送请求到服务器时,服务器可以将请求信息发送给 servlet,并让 servlet 建立起服务 ...

  2. eclipse中的project 和classpath文件的具体作用

    项目->右键 Properties-> java Build Path -> source: xxx/data xxx/src 体现在 .classpath文件中: .classpa ...

  3. c语言,warning: return type of 'main' is not `int'怎么解决?

    ////警告可以忽略,但如果严格点的话 #include<stdio.h> #include<math.h>   int main(int argc, char *arg[]) ...

  4. 可折叠的listview 之ExpandableListView基本使用

    先看效果 demo实现 其他的方法和ListView的方法一样,下面来看看具体demo的实现 首先布局文件很简单,就一个控件为: <?xml version="1.0" en ...

  5. Django中遇到的mysql问题

    最近在用Django写个网站,连接mysql的时候出现了几个问题,总结一下 写好setting.py和models.py后,syncdb都没什么问题,在测试后台发表文章的时候就出错了,本来是测试mar ...

  6. (11)python 模块和包

    一.导入模块和包 模块相当于一个.py文件,包相当于带有个__init__.py一个文件夹,既可按模块导入也可按包导入. 1.导入模块或包 import 包名或模块名 (as 别名),包名或模块名 ( ...

  7. 51nod 1183 编辑距离【线性dp+类似最长公共子序列】

    1183 编辑距离 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个 ...

  8. 【LeetCode刷题】SQL-Combine Two Tables

    Table: Person +-------------+---------+ | Column Name | Type | +-------------+---------+ | PersonId ...

  9. [JSOI2008]Star War

    星球之间互相直接或间接地连接帝国开始使用死星有计划地摧毁反抗军占领的星球给出星球间隧道的连通情况,已经帝国打击的顺序要求以尽量快的速度求出每一次打击之后反抗军占据的星球的联通快的个数(若两个星球,直接 ...

  10. Codeforces #428 Div2 D

    #428 Div2 D 题意 给出一些数,现在要求找出一些数满足 \(i_1 < i_2 < i_3 < ... < i_k\) 以及 \(gcd(a_{i_1}, a_{i_ ...