相对JUnit3.8,JUnit4采用了大量Annotation来实现的。
一 基本使用方法
包命名从junit.framework.xxx变更到org.junit.xxx.
在JUnit3.8中测试类必须继承TestCase父类,JUnit4中测试类不用继承TestCase
在JUnit3.8中 测试方法满足如下原则1)public 2)void 3)无方法参数4)方法名称必须以test开头,JUnit测试方法不用满足4)即命名不用test +methodName ,用Annotation来标注是测试方法@Test
@Before相当于setUp会在每个测试方法调用前执行一次。
@After相当于tearDown会在每个测试方法调用前执行一次。
@BeforeClass,JUnit3.8没有对应功能,在每个类加载只被执行一次,必须定义static方法一般用于初始化一些代价昂贵的计算,如数据库连接获得。
@AfterClass,JUnit3.8没有对应功能,在所有测试结束后只被执行一次,必须定义static方法一般用于回收一些代价昂贵的计算,如数据库连接释放。
@Test 可以有timeout参数
@Test 可以有expected参数, public abstract java.lang.Class<? extends java.lang.Throwable> expected Default:org.junit.Test.None.class
二 组合测试
JUnit3.8中的TestSuite功能在JUnit4中通过新曾的测试运行器来实现JUni4所有的测试都是有测试运行器运行的。JUnit为单元测试提供了默认的运行器。用户可以定制自己的运行器(继承于org.junit.runner.Runner),并且可以为每一个测试类指定具体的运行器。@RunWith(Suite.class)来实现。
1)创建一个空类,用注解org.junit.runner.RunWitch和org.junit.runners.Suite.SuiteClass修饰该空类。2)将org.junit.runners.Suite作为参数传入注解RunWitch以提示JUnit为此类使用套件运行器运行。 3)将需要放入该测试套件的测试类组成数组作为注解SuiteClasses的参数。4)这个空类必须是public修饰,而且存在无参公开的够造函数。
@RunWith(Suite.class)@Suite.SuiteClasses({CalculatorTest2.class,LargestTest2.class})
public class TestAll2 {
}
三 参数化测试
********************************************************************************
//被测试类
package com.test.junit;
/**
* 数学计算
* @author Administrator
*
*/
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int minus(int a, int b) {
return a - b;
}
public int multiply(int a, int b) {
return a * b;
}
public int divide(int a, int b)throws Exception
{
if(0 == b)
{
throw new Exception("除数不能为零!");
}
return a / b;
}
}
********************************************************************************
//Junit3.8
package com.test.junit;
import com.test.junit.Calculator;
import junit.framework.Assert;
import junit.framework.TestCase;
/**
* 在junit3.8中测试类必须继承TestCase父类
* @author Administrator
* keep the bar green to keep the code clean
* 单元测试不是证明您是对的,而是证明您没有错误
*/
public class CalculatorTest extends TestCase
{
/**
* 在junit3.8中 测试方法满足如下原则
* 1)public
* 2)void
* 3)无方法参数
* 4)方法名称必须以test开头
*
* Dont't Repeat yourself//不要重复你自己
*/
private Calculator cal;
public void testAdd()
{
int result = cal.add(1, 2);
//断言:assert
Assert.assertEquals(3,result);
}
public void testMinus()
{
int result = cal.minus(1, 2);
//断言
Assert.assertEquals(-1, result);
}
public void testMultiply()
{
int result =cal.multiply(2, 3);
//断言
Assert.assertEquals(6, result);
}
public void testDivide()
{
int result = 0;
try {
result = cal.divide(6, 4);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//断言
Assert.assertEquals(1, result);
}
public void testDivide2()
{
Throwable tx =null;
try
{
cal.divide(4, 0);
Assert.fail();
}catch(Exception ex)
{
tx = ex;
}
Assert.assertNotNull(tx);
Assert.assertEquals(Exception.class, tx.getClass());
Assert.assertEquals("除数不能为零!",tx.getMessage());
}
@Override
protected void setUp() throws Exception {
cal = new Calculator();
}
@Override
protected void tearDown() throws Exception {
}
}
********************************************************************************
//Junit4
package com.test.junit;
import static org.junit.Assert.assertEquals;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
public class CalculatorTest2 {
private Calculator cal;
/**
* @Before相当于setUp会在每个测试方法调用前执行一次
*/
@Before
public void init(){
cal = new Calculator();
System.out.println("init invoked!");
}
/**
* @After相当于tearDown会在每个测试方法调用前执行一次
*/
@After
public void destory(){
System.out.println("destory invoked!");
}
/**
*@BeforeClass,Junit3.8没有对应功能,在每个类加载只被执行一次,必须定义static方法
*一般用于初始化一些代价昂贵的计算,如数据库连接获得
*/
@BeforeClass
public static void globalInit(){
System.out.println("globalInit Invoked!");
}
/**
*@AfterClass,Junit3.8没有对应功能,在所有测试结束后只被执行一次,必须定义static方法
*一般用于回收一些代价昂贵的计算,如数据库连接释放
*/
@AfterClass
public static void globalDestory(){
System.out.println("globalDestory Invoked!");
}
/**
* 测试方法命名不用test +methodName
* 用Annotation来标注是测试方法@Test
*/
@Test
public void myAdd() {
int result = cal.add(1, 2);
assertEquals(3,result);
}
@Test
public void myMinus(){
int result =cal.minus(1, 2);
assertEquals(-1,result);
}
@Test
public void myMultiply(){
int result = cal.multiply(2, 3);
assertEquals(6,result);
}
@Test
public void myDivide(){
int result=0;
try {
result = cal.divide(6, 4);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
assertEquals(1,result);
}
/**
* @Test 可以有expected参数
* public abstract java.lang.Class<? extends java.lang.Throwable> expected
* Default:org.junit.Test.None.class
* @throws Exception
*/
@Test (expected = Exception.class)
public void myDivide2() throws Exception{
cal.divide(6, 0);
}
/**
* @Test 可以有timeout参数
*/
@Test (timeout =100)
public void myDivide3(){
try {
cal.divide(6, 4);
Thread.sleep(100);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
分享到:
相关推荐
尽管现在有了更新的版本,如JUnit4和JUnit5,但理解JUnit3.8的基本概念和用法对于了解单元测试的原理以及历史发展仍然至关重要。通过学习和实践,你将能够熟练地运用单元测试来提升代码质量,确保软件的可靠性和稳定...
本资源包含`junit3.8.jar`库文件、源代码及测试案例,旨在帮助开发者全面了解并熟练掌握Junit 3.8的使用方法和精髓。 首先,`junit3.8.jar`是Junit 3.8的核心库文件,包含了运行和编写单元测试所需的所有类和方法。...
JUnit3.8可以很好地与各种Java开发环境和构建工具(如Eclipse、IntelliJ IDEA、Maven、Ant等)集成,提供无缝的测试体验。开发者可以通过IDE的内建功能轻松地创建、运行和管理测试。 总结,JUnit3.8是Java开发中的...
这里我们将深入探讨JUnit 3.8和JUnit 4两个版本的主要API及其差异。 **JUnit 3.8 API** JUnit 3.8是JUnit的一个早期版本,它的API设计相对简单,主要包含以下关键组件: 1. **测试类和测试方法**:在JUnit 3中,...
Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM Junit3.8 API CHM
4. **测试套件(Test Suites)**:通过`@Suite`注解(Junit 4引入),可以将多个测试类组合成一个测试套件,但在Junit 3.8中,我们需要手动创建一个测试类来包含其他测试类。 5. **异常测试**:可以使用`try-catch-...
尽管JUnit 3.8的功能相对有限,但它奠定了后续版本的基础,例如JUnit 4引入了更强大的注解系统和参数化测试等特性。对于初学者来说,理解JUnit 3.8的基本概念和用法,可以帮助他们更好地过渡到更新的版本。 在提供...
在JUnit4及以后的版本中,这些方法被 `@Before` 和 `@After` 替代。 9. **参数化测试**: 虽然JUnit3.8不直接支持参数化测试,但可以通过自定义测试运行器或第三方库实现类似的功能。 10. **测试工具**: 与...
9. **用户自定义扩展**:虽然不如Junit 4或5那样灵活,但开发者仍可以扩展Junit 3.8的功能,比如通过继承TestCase类并覆盖runTest()方法。 通过这个“浪曦][原创]Junit.3.8.详解续一.rar”的资料,读者可以期待深入...
9. **局限性**:与较新的JUnit版本相比,3.8.1缺少一些高级特性,如参数化测试、分类测试、测试规则、注解驱动的测试结构等。 10. **升级路径**:对于还在使用JUnit 3的项目,考虑迁移到更现代的JUnit 4或JUnit 5...
然而,需要注意的是,JUnit 3.8.2相对较老,现代项目通常会使用更新的版本,如JUnit 4或JUnit 5,它们引入了更多的特性,如参数化测试、更灵活的注解和更好的错误报告。 总的来说,JUnit 3.8.2是Java开发中单元测试...
4. 固定的测试顺序:与JUnit 4不同,JUnit 3.8.1中的测试默认按照它们在类中声明的顺序执行,不支持根据注解或其他方式自定义顺序。 5. 测试监听器(Test Listeners):允许开发者创建自定义的监听器来记录测试事件...
5. **测试运行器(Test Runners)**:除了默认的`BlockJUnit4ClassRunner`,JUnit 4还支持自定义运行器,以适应不同的测试需求。 6. **分类(Categories)**:通过`@Category`注解,可以将测试划分为不同的类别,...
9. **持续集成**:在大型项目中,JUnit测试经常与持续集成工具(如Jenkins, Travis CI)结合,确保每次代码提交后都能自动运行测试,及时发现潜在问题。 10. **测试驱动开发(TDD)**:JUnit是TDD实践的重要组成...
JAVA测试-----Junit.3.8.part3
JAVA测试------Junit.3.8.part1
JAVA测试----------Junit.3.8.part2
JUnit的第一个版本是JUnit 1.0,后来陆续发布了多个版本,如JUnit 3.8、JUnit 4.0、JUnit 4.11等。2015年,JUnit 5发布,带来了许多新的特性和改进。 JUnit的架构 JUnit的架构主要由三个部分组成:Test Runner、...
2. **JUnit注解(Annotations)**:从JUnit 3.8过渡到4.x,注解成为了一个重要的特性。@Test用于标记测试方法,@Before和@After用于定义在每个测试方法之前和之后执行的代码,@BeforeClass和@AfterClass则分别用于在...