最近在做单元测试,于是,从网上找到一些资料并整理如下:
JUnit4 基本上是一个新框架,而不是旧框架的升级版本。其主要目标便是利用Java 5的Annotation特性简化测试用例的编写。
要求:JDK 5.0或以上版本。
Java注解((Annotation)的使用方法是@注解名 ,能通过简单的词语来实现一些功能。在junit中常用的注解有@Test、@Ignore、@BeforeClass、@AfterClass、@Before、@After、@Runwith、@Parameters
以下是相关的介绍和使用说明:
在junit3中,是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类。在junit4中,定义一个 测试方法变得简单很多,只需要在方法前加上@Test就行了。
注意:测试方法必须是public void,即公共、无返回数据。可以抛出异常。
有时候我们想暂时不运行某些测试方法\测试类,可以在方法前加上这个注解。在运行结果中,junit会统计忽略的用例数,来提醒你。但是不建议经常这么做,因为这样的坏处时,容易忘记去更新这些测试方法,导致代码不够干净,用例遗漏。
当我们运行几个有关联的用例时,可能会在数据准备或其它前期准备中执行一些相同的命令,这个时候为了让代码更清晰,更少冗余,可以将公用的部分提取出来,放在一个方法里,并为这个方法注解@BeforeClass。意思是在测试类里所有用例运行之前,运行一次这个方法。例如创建数据库连接、读取文件等。
注意:方法名可以任意,但必须是public static void,即公开、静态、无返回。这个方法只会运行一次。
跟@BeforeClass对应,在测试类里所有用例运行之后,运行一次。用于处理一些测试后续工作,例如清理数据,恢复现场。
注意:同样必须是public static void,即公开、静态、无返回。这个方法只会运行一次。
与@BeforeClass的区别在于,@Before不止运行一次,它会在每个用例运行之前都运行一次。主要用于一些独立于用例之间的准备工作。比如两个用例都需要读取数据库里的用户A信息,但第一个用例会删除这个用户A,而第二个用例需要修改用户A。那么可以用@BeforeClass创建数据库连接。用@Before来插入一条用户A信息。
注意:必须是public void,不能为static。不止运行一次,根据用例数而定。
与@Before对应。
首先要分清几个概念:测试方法、测试类、测试集、测试运行器。
其中测试方法就是用@Test注解的一些函数。测试类是包含一个或多个测试方法的一个**Test.java文件,测试集是一个suite,可能包含多个测试类。测试运行器则决定了用什么方式偏好去运行这些测试集/类/方法。
而@Runwith就是放在测试类名之前,用来确定这个类怎么运行的。也可以不标注,会使用默认运行器。
常见的运行器有:
1. @RunWith(Parameterized.class) 参数化运行器,配合@Parameters使用junit的参数化功能
2.@RunWith(Suite.class)
@SuiteClasses({ATest.class,BTest.class,CTest.class})
测试集运行器配合使用测试集功能
junit4的默认运行器
4.@RunWith(JUnit38ClassRunner.class)
用于兼容junit3.8的运行器
5.一些其它运行器具备更多功能。例如@RunWith(SpringJUnit4ClassRunner.class)集成了spring的一些功能
用于使用参数化功能。
其他:
1)对测试异常,JUnit 4可以用expected=Exception.class来期待一个预期的异常,而不必手动编写。参数 expected 代表测试方
法期望抛出指定的异常,如果运行测试并没有抛出这个异常,则 JUnit4 会认为这个测试没有通过。如:
publicint div(inta,int b){
return a / b;
}
可能会抛出除数为0的异常,可以这样来编写:
@Test(expected=ArithmeticException.class)
public void testDiv(){
cal.div(5, 0);
}
@Test(expected = NullPointerException.class)
public void unsupportedDBCheck() {
throw new NullPointerException();
}
2)设置最长执行时间
参数timeout,指定被测试方法被允许运行的最长时间应该是多少,如果测试方法运行时间超过了指定的毫秒数,则JUnit认为
测试失败。
@Test(timeout=1)
public void testMinus(){
assertEquals(cal.minus(2, 1), 1);
}
3)Ignore 用于暂时忽略某个测试方法,因为有时候由于测试环境受限,并不能保证每一个测试方法都能正确运行。
@Ignore("db is down")
@Test(expected=UnsupportedDBVersionException.class)
public void unsupportedDBCheck(){
}
3)类级别的Fixture设置方法
注解@BeforeClass修饰用于初始化Fixture的方法。注解@AfterClass 修饰用于注销Fixture的方法。由于这二个方法在运行其间仅执行一次,因此它们只能标记为静态方法(使用 public static void 修饰,而且不能带有任何参数),其实在所有的测试方法中
共享的资源也必须是静态引用。如:
@BeforeClass
public static void dbInit(){//类级别Fixture初始化方法
}
@AfterClass
public static void dbClose(){//类级别Fixture注销方法
}
类级别的Fixture方法,仅会在测试类中所有测试方法执行之前执行初始化,并在全部测试方法测试完毕之后执行注销方法。
4)测试运行机
JUnit 中所有的测试方法都是由它负责执行的。JUnit 为单元测试提供了默认的测试运行器,但 JUnit 并没有限制您必须使用默认的2
运行器。相反,您不仅可以定制自己的运行器(所有的运行器都继承自 org.junit.runner.Runner),而且还可以为每一个测试类指
定使用某个具体的运行器。指定方法也很简单,使用注解 org.junit.runner.RunWith 在测试类上显式的声明要使用的运行器即可:
@RunWith(CustomTestRunner.class)
public class TestWordDealUtil{
}
5)测试套件
JUnit 提供了一种批量运行测试类的方法,叫做测试套件。这样,每次需要验证系统功能正确性时,只执行一个或几个测试套件便可
以了。测试套件的写法非常简单,需要遵循以下规则:
(1)创建一个空类作为测试套件的入口。
(2)使用注解 org.junit.runner.RunWith 和 org.junit.runners.Suite.SuiteClasses 修饰这个空类。
(3)将 org.junit.runners.Suite 作为参数传入注解 RunWith,以提示 JUnit 为此类使用套件运行器执行。
(4)将需要放入此测试套件的测试类组成数组作为注解 SuiteClasses 的参数。
(5)保证这个空类使用 public 修饰,而且存在公开的不带有任何参数的构造函数。
importorg.junit.runner.RunWith;
importorg.junit.runners.Suite;
@RunWith(Suite.class)
@Suite.SuiteClasses({TestWordDealUtil.class,xxx.class})
public class RunAllUtilTestsSuite {
}
测试套件中不仅可以包含基本的测试类,而且可以包含其它的测试套件,这样可以很方便的分层管理不同模块的单元测试代码。但
是,您一定要保证 测试套件之间没有循环包含关系。
6)参数化测试
(1)为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
(2)为测试类声明几个变量,分别用于存放期望值和测试所用数据。
(3)为测试类声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为 java.util.Collection 的公共静
态方法,并在此方法中初始化所有需要测试的参数对。
(4)为测试类声明一个带有参数的公共构造函数,并在其中为第二个环节中声明的几个变量赋值。
(5)编写测试方法,使用定义的变量作为参数进行测试。
@RunWith(Parameterized.class)
public class TestWordDealUtilWithParam {
private String expected;
private String target;
@Parameters
public static Collection words(){
returnArrays.asList(new Object[][]{
{"employee_info", "employeeInfo"}, //测试一般的处理情况
{null, null}, //测试 null 时的处理情况
{"", ""}, //测试空字符串时的处理情况
{"employee_info", "EmployeeInfo"}, //测试当首字母大写时的情况
{"employee_info_a", "employeeInfoA"}, //测试当尾字母为大写时的情况
{"employee_a_info", "employeeAInfo"} //测试多个相连字母大写时的情况
});
}
publicTestWordDealUtilWithParam(String expected , String target){
this.expected = expected;
this.target = target;
}
//测试将 Java 对象名称到数据库名称的转换
@Test
public void wordFormat4DB(){
assertEquals(expected, WordDealUtil.wordFormat4DB(target));
}
相关推荐
JUnit单元测试的重要性 ------------------- 单元测试是java开发必备技能,它可以确保代码的正确性和可靠性。JUnit是一个流行的单元测试框架,它可以帮助开发者快速地编写和执行单元测试。 JUnit4的改进 ---------...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了一种方便、高效的方式来验证代码的正确性。这个压缩包文件包含了JUnit4的相关库,使得开发人员能够轻松地在他们的项目中引入单元测试功能。...
**Junit4单元测试详解** 单元测试是一种软件开发中的重要实践,它允许开发者对程序的各个独立组件进行验证,确保它们在孤立环境中按照预期工作。JUnit是Java编程语言中最广泛使用的单元测试框架,而Junit4是其一个...
【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具JUnit4的使用,这是对代码进行验证和调试的关键部分。JUnit4是JUnit框架的一个版本,它提供了更灵活的注解、测试套件管理和断言方式,使得编写...
多数Java的开发环境都已经集成了JUnit作为单元测试的工具。 [1] JUnit是由 Erich Gamma 和 Kent Beck 编写的一个回归测试框架(regression testing framework)。Junit测试是程序员测试,即所谓白盒测试,因为...
在Eclipse中使用JUnit4进行单元测试是一种常见的Java开发实践,它可以帮助开发者确保代码的正确性和稳定性。单元测试是软件开发中的重要环节,通过编写针对代码各个独立模块的测试用例,可以验证代码功能是否按预期...
本篇文章将深入探讨JUnit4的单元测试实例,帮助你更好地理解和应用这个工具。 一、JUnit4简介 JUnit4相较于之前的版本,引入了注解(Annotation)机制,极大地简化了测试用例的编写。例如,`@Test`注解用于标记测试...
《Junit4单元测试个人笔记》 单元测试是软件开发过程中的重要环节,它能确保代码的正确性和稳定性。本文主要介绍了使用Junit4进行单元测试的一些规范和Eclipse中的应用。 首先,遵循一定的测试规范至关重要。测试...
JUnit4是Java编程语言中最广泛使用的单元测试框架之一,它为开发者提供了强大的工具来编写和运行可重复的、可靠的测试代码。JUnit4引入了许多新特性,显著提升了测试的灵活性和可维护性。以下是对JUnit4核心知识点的...
Junit4作为Java领域最常用的单元测试框架,为开发者提供了方便、高效的测试工具。本文将深入探讨如何使用Junit4对名为Calculate的类进行单元测试,包括其加减乘除四个方法。 首先,我们需要了解Junit4的基本结构和...
介绍如何利用反射和注解去简单的模拟JUnit4单元测试的使用,之所以选择JUnit4是因为4.0以后最大的改进就是使用了注解。需要注意的是这里并不是完全的模拟,只是简单实现了一下Runner类和JUnit注解相关的工作流程。...
单元测试之道(Java):使用JUnit进行单元测试。单元测试是提高代码质量的有效手段,但大部分开发人员由于种种原因都不乐意进行单元测试。
改代码是我的我的一个项目自己写完后自测所以就写了这个junit的单元测试类,以及可能会遇到的一些问题,以及其中的一些经验,项目用的是spring + mybatis。我写的这个测试类基本概括了单元测试的基本用法,只要按照...
总之,JUnit 4作为Java单元测试的重要工具,通过引入注解等特性简化了测试用例的编写,并且在实际开发和测试中带来了极大的便利。对于Java开发者而言,掌握JUnit 4的使用是提高代码质量和开发效率的重要技能之一。
JUnit4作为Java平台上最流行的单元测试框架,极大地简化了测试代码的编写和执行。本篇将深入探讨JUnit4的相关知识点,帮助你更好地掌握这个强大的工具。 1. JUnit4简介: JUnit4是由Ernst Kuhr和Kent Beck开发的...
junit4单元测试报错:method initializationerror not found 缺少jar包导致,总共需要三个jar包:junit-4.11.jar,hamcrest-core-1.3.rc2.jar,hamcrest-library-1.3.rc2.jar,都在压缩包里了。