2009年8月16號 天氣陰 週日
JUNIT4.X學習筆記
與JUNIT3.8比較
1、測試類不需要在繼承TestCase類
2、測試方法不需要用test開始,但必須是public void,且無參數的
3、注解 @Test(Junit3.8與Junit4系列的重大區別)
在測試方法前加上注解@Test表示此方法會被Junit認為是測試方法
4、重複的代碼等相似的對象代碼,在測試方法之前/之後運行,用注解完成(Junit3.8中為setUp方法和tearDown方法)
@Before和@After注解表示
5、有些測試可用一個測試對象如DB數據庫連接,釋放的代碼,只需要運行一次即可(全局運行一次,Junit3.8中沒有此功能)
注解@BeforeClass 和@AfterClass
方法必須是public static void的,比@Before更先運行比@AfterClass更遲運行
private Calculater cal;
/**
* 在Junit3系列中沒有辦法實現僅僅執行一次的初始化方法,<br>
* 但是在Junit4系列中,可以通過注解來完成此功能,<br>
* 注意:全局初始化的方法必須是public static void修飾的
*/
// 在所有測試方法之前運行,且只運行一次的全局初始化(對數據庫的鏈接尤其有效)
// 最早執行
@BeforeClass
public static void globalInit() {
System.out.println("GlobalInit全局執行,且只執行一次!");
}
// 在所有測試方法之後運行,且只運行一次的全局銷毀
// 最晚執行
@AfterClass
public static void globalDestroy() {
System.out.println("GlobaDestroy全局執行,且只執行一次!");
}
/**
* Junit3系列中在測試方法之前/之後運行需要用到的方法為setUp()方法和tearDown()方法【重寫于TestCase類中的方法】<br>
* 但是在Junit4系列中只需要注解來完成此功能即可,並且方法名可以任意
*/
// 在測試方法之前運行用到的注解:@Before
@Before
public void init() {
cal = new Calculater();
System.out.println("Junit4系列的注解方法首先運行方式@Before");
}
// 在測試方法之後運行的注解:@After
@After
public void destroy() {
System.out.println("Junit4系列中的釋放方法注解:@After");
}
/**
* Junit4系列與Junit3系列的區別:<br>
* 方法名可以任意,不需要在用test開頭
* <p>
* 最大的改動為:<br>
* 注解<br>
* 用來告訴Junit此方法為測試方法
*/
@Test
public void myAddTest() {
// 以下的所有相似代碼都可以放到以@Before注解的方法中,用來在運行此測試方法之前運行
// Calculater cal = new Calculater();
int result = cal.add(1, 2);
Assert.assertEquals(3, result);
}
6、異常測試
@Test后跟著屬性expected表示期望拋出什麽異常,
如:@Test(expected = Exception.class)
方法中如果有異常拋出必須用throws Exception的方式將異常拋出,如果用try{}catch(){}的方式則是將拋出的異常捕獲的,則沒有辦法測試是否有期望的異常拋出
/**
* Junit4系列中對異常的測試,用注解后跟著expected屬性<br>
* expected表示期望拋出什麽異常<br>
* 當程序真正拋出異常時,測試才會通過<br>
* 注意:與Junit3系列的不同:如果這裡用try{}catch(){}則測試不會通過,因為程序拋出了異常,但是卻被捕獲了<br>
* 必須用throws來拋出異常
*/
@Test(expected = Exception.class)
public void myDivTest2() throws Exception {
cal.div(1, 0);
}
/**
* 屬性timeout表示期望測試執行時間不超過100毫秒,如果超過則表示測試失敗
*/
@Test(timeout = 100)
public void myDivTest3() {
int result = 0;
try {
result = cal.div(4, 3);
// 測試時間超過100毫秒,測試將不通過
// Thread.sleep(101);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Assert.assertEquals(1, result);
}
7、有些測試方法還不夠完善,希望測試時不執行這些不完善的測試方法,(當然可以註釋掉或是乾脆刪掉)
注解:@Ignore(“該方法還未完善,暫不執行”)
/**
* 如果遇到還沒有完善的測試方法,不希望測試類執行未完善的測試方法,Junit4提供了此功能
* 注解@Ignore(當然你也可以刪掉該方法或是註釋掉該方法)
*/
@Test(expected = Exception.class)
// @Ignore(value = "此測試方法還沒有完善,暫時不執行")
@Ignore("此測試方法還沒有完善,暫時不執行")
// 不希望該方法被執行
public void testGetLargest3() throws Exception {
largest.getLargest(null);
}
8、Junit4系列中的“自動測試套件”
(1)首先創建一個空類
(2)用@RunWith(Suite.class)注解
(3)用@suiteClasses({測試類數組/測試套件數組})注解
注意,該自動測試套件類是一個空類,僅僅包含一個默認的無參數的構造方法即可
package com.test.junit4;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
* 在Junit4系列中,完成多個測試類的“自動化”測試的方法是通過注解完成,與Junit3系列的不同
* 注意:SuiteClasses中不僅僅可以是測試類,也可以是測試套件類(也就是另一個Suite類)
*/
@RunWith(Suite.class)
@SuiteClasses( { CalculaterTest.class, LargestTest.class })
public class TestAll {
// 注意,該類是空類,什麽工作都不需要做,只需有一個默認的無參數的構造方法就可以了
// public TestAll() {}
}
9、參數化測試:邏輯執行一樣,但是測試參數不同(Parameterized參數化運行器,Junit3.8中沒有此功能)
(1)測試類必須由Parameterized測試運行器修飾
@RunWith(Parameterized.class)
(2)準備數據:數據準備方法實現,且該方法必須滿足一定的規則
1)方法必須由Parameters注解
2)方法不需為public static 的
3)方法返回Collection類型
4)方法名可以任意
5)方法沒有參數
注意:此方法中的參數數組必須是Object的二維數組
6)構造方法中的參數個數及順序必須與數據準備方法中的參數數組的數據的個數及順序相一致
/**
* 參數化測試<br>
* 參數化測試類必須用Parameterized類來注解
*/
@RunWith(Parameterized.class)
public class ParametersTest {
private int param1;
private int param2;
private int expeted;
/**
* 準備測試數據<br>
* 方法必須是public static的,必須返回Collection的 <br>
* 必須有@Parameters來注解 <br>
* 參數數組必須是Object類型的二維數組
*/
@Parameters
public static Collection preparedParameters() {
// ------------------參數1,參數2,期望值
Object[][] object = { { 1, 2, 3 }, { -1, -4, -5 }, { -5, 3, -2 } };
return Arrays.asList(object);
}
/**
* 構造方法的參數個數與順序必須與準備數據方法中的二維數組中的個數及順序相符合<br>
* 代表期望值和傳入參數,期望值和傳入參數的順序是可以任意的
*/
// --------------------參數1--------參數2---------期望值
public ParametersTest(int param1, int param2, int expeted) {
this.param1 = param1;
this.param2 = param2;
this.expeted = expeted;
}
@Test
public void testAdd() {
Calculater cal = new Calculater();
Assert.assertEquals(expeted, cal.add(param1, param2));
}
}
10、測試似有方法
應用到反射機制
@Test
public void testAdd() {
try {
CalculaterPrivate cal = new CalculaterPrivate();
Class<CalculaterPrivate> clazz = CalculaterPrivate.class;
Method method = clazz.getDeclaredMethod("add", new Class[] {
int.class, Integer.TYPE });
// 私有方法要進行調用則需要設定其訪問權限,true表示可以訪問
method.setAccessible(true);
Object result = method.invoke(cal, new Object[] { 1, 2 });
Assert.assertEquals(3, result);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
Assert.fail();
}
}
分享到:
相关推荐
总之,这个学习资源将带你深入理解JUnit的基本概念和高级特性,通过阅读`JUnit学习笔记.txt`并动手实践其中的示例,你将能熟练掌握如何利用JUnit3和JUnit4进行有效的单元测试,从而提升代码质量和项目稳定性。
这个“Junit学习.rar”压缩包显然包含了关于JUnit从3.8到4.9版本的学习资料,包括可能的操作手册、教程文档以及个人的学习笔记。以下是基于这些资源可能涵盖的一些关键知识点: 1. **JUnit基础知识**:了解JUnit的...
### Struts2学习笔记知识点梳理 #### 一、前言及背景 - **Struts2简介**:Struts2是一个基于MVC模式的开源Web应用框架,它继承了Struts1的一些特性,并在此基础上进行了很多改进,使得开发更加便捷高效。 - **学习...
### Maven 2 学习笔记 #### 一、Maven 项目的基本结构及创建 Maven使用特定的目录结构来组织项目文件,通过`mvn archetype:create`命令可以快速创建项目模板。例如: ```shell mvn archetype:create -DgroupId=...
在Spring MVC的学习过程中,了解和掌握其核心概念与机制至关重要。Spring MVC是Spring框架的一个模块,主要用于构建Web应用程序。在Spring 3.0.x版本中,Spring MVC进行了大量的改进,引入了许多新特性和优化,使其...
【Android学习笔记】是针对Android开发者的详尽学习资源,涵盖了Android开发的基础到高级概念,旨在帮助初学者和有经验的开发者深入理解Android操作系统的工作原理和应用开发技术。以下是一些核心知识点的概述: 1....
### WebWork学习笔记知识点 #### 一、WebWork框架简介 - **定义**: WebWork是一个由OpenSymphony组织开发的MVC(Model-View-Controller)框架,专注于组件化和代码重用,适用于J2EE应用程序开发。 - **最新版本**:...
Android学习笔记是初学者步入Android开发世界的宝贵资源。这篇笔记主要涵盖了Android开发的基础知识,旨在帮助初学者系统地理解和掌握Android应用开发的核心概念和技术。以下将详细解析笔记中可能涉及的关键知识点。...
### UiAutomator学习笔记 #### 一、UiAutomator环境配置与编译运行 ##### 1-1 配置编写环境 在开始使用UiAutomator进行自动化测试之前,需要先配置好开发环境。通常,这涉及到IDE的选择以及必要的库文件添加。 1...
4. **JSP 2.0 和 J2EE 1.4**:利用最新技术提升开发效率。 5. **JPA 支持**:提供了标准的持久化机制。 6. **生成 CRUD 终端**:快速创建基本的增删改查功能。 7. **全面支持 Eclipse、IDEA、NetBeans**:提供良好的...
Java Web学习笔记详细知识点总结: 1. 开发工具快捷键使用: - Eclipse和MyEclipse等集成开发环境(IDE)的快捷键对于提升开发效率至关重要。 - Alt+/快捷键用于代码提示,能够提高编码速度。 - Ctrl+1用于快速...
1. **EJB概述**:介绍EJB的历史、版本和基本概念,包括EJB 2.x和EJB 3.x的主要区别,以及EJB 3.x引入的简化和面向POJO的改进。 2. **EJB类型**:讲解三种主要的EJB组件——Session Beans(会话bean)、Message ...
这个类需要继承`androidx.test.ext.junit.runners.AndroidJUnit4`,并使用Robotium提供的Solo类进行测试操作。例如: ```java import androidx.test.ext.junit.runners.AndroidJUnit4; import ...
【Android项目源码详解...通过分析这个"Android项目源码本站第N个记事本简易笔记",开发者不仅能学习到Android应用的基础开发,还能深入了解数据存储、UI设计、组件通信等关键概念,为后续的Android开发打下坚实基础。
### 0基础Java笔记知识点详解 #### 一、软件初始设置 在开始学习Java之前,首先需要对开发环境进行一些基本的配置,确保能够高效地编写代码。 **1. Java字体设置** - **路径**: 首选项 > font 的 basic > font ...
4. **JUnit测试框架** - `JUnit Test`:在Outline窗口中,对方法或类右键选择`Run As / JUnit Test`进行测试。 - `@Test`:标记为测试方法,Eclipse或MyEclipse会自动导入JUnit库。 - `@Before`:在每个测试方法...
综上所述,通过本篇笔记的学习,读者可以全面掌握RabbitMQ的基本使用方法以及一些高级特性,这对于实际项目中的消息处理需求提供了强有力的支持。无论是简单的消息传输还是复杂的分布式系统架构设计,RabbitMQ都能...