`
bulargy
  • 浏览: 66519 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

小白学Junit4测试

阅读更多
   近期写单元测试计划,公司准备把junit3.8升级到junit4以上的版本,所以研究了一下,写下学习过程和心得体会,为了巩固学习成果,所以把学习心得写下来加深印象,也供需要的朋友查阅,少走弯路。
   好了,废话不多说,直接开始:
   假设我们要写一个整数除法和乘法的类,并且给他写测试用例:

1) 建立Math类

工具是eclipse3.3
/**
 * @author bulargy.j.bai
 * @mail bulargy@gmail.com
 * @创建时间:Mar 10, 2008
 * @描述:一个整数除法和乘法的工具类
 */
public class Math {
    public static int divide(int x,int y) {
        return x/y;
    }

    public static int multiple(int x,int y) {
        return x*y;
    }
}



2) 建立测试用例
选中需要建立测试用例的包,选择new->other->JUnit Test Case。
有5个方法可以选择:
setUp()方法在测试方法前调用,一般用来做测试准备工作。
tearDown()方法在测试方法后调用,一般作测试的清理工作。
setUpBeforeClass()方法在整个类初始化之后调用,一般用来做测试准备工作。
tearDownAfterClass()方法在整个类结束之前调用,一般作测试的清理工作。
constructor()为是否包含构造方法。

自动生成的代码如下:
/**
 * @author bulargy.j.bai
 * @mail bulargy@gmail.com
 * @创建时间:Mar 11, 2008
 * @描述:
 */
public class MathTest {

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
    }
    
    @Test
    public void testDivide() {
        fail("Not yet implemented");
    }

    @Test
    public void testMultiple() {
        fail("Not yet implemented");
    }
}

说明:
@BeforeClass标签注释的方法用于在整个类测试过程的初始化后调用一次,@AfterClass标签注释的方法则是整个测试类结束之前调用一次。这2个标签的搭配可以避免使用@Before、@After标签组合在每个测试方法前后都调用的弊端,减少系统开销,提高系统测试速度。(不过对环境独立性要求较高的测试还是应当使用@Before、@After来完成)
@Test标签用来标注待测试的方法,按照类中声明的顺序执行。


我们在testDivide方法加入测试代码,分别测试三种情况:
a. 完全正确也没有可能出错的数据,如:9除3  结果必须等于3
b. 可能有问题的边缘数据,如:10除3 结果也必须等于3
c. 错误的数据,如:10除0 必须抛出异常

忽略testMultiple方法

代码如下:
    @Test(expected=ArithmeticException.class)
    public void testDivide() {
        assertEquals(3,Math.divide(9,3));
        assertEquals(3,Math.divide(10,3));
        Math.divide(10,0); //除数不能为0,会抛出异常
    }
    
    @Ignore("忽略乘法测试")
    @Test
    public void testMultiple() {
    }

说明:
Junit4为测试方法增加了判断异常的方式,避免了以前还要通过try/catch块捕捉异常再抛出的复杂方式,简单的这样声明“@Test(expected=ArithmeticException.class)”Junit4就会检查此方法是否抛出ArithmeticException异常,如果抛出则测试通过,没抛出则测试不通过(@Test标签还有一些其他参数,例如超时测试@Test(timeout=1)这样,但是由于并不能准确反应实际时间,所以应用较少,经过我测试误差太大绝对不适合拿来做超时测试的)
@Ignore标签会告诉Junit4忽略它所标注的方法,例如数据库不可用时可以用此标注标注一些测试数据库连接的方法来避免测试失败。

3) 运行测试
系统会打开JUnit透视图,如果测试全部通过,则显示颜色条为绿色;我们将assertEquals(3,Math.divide(9,3));改成assertEquals(2,Math.divide(9,3));则显示颜色条为红色,我们可以对错误或者故障的地方进行追踪。

4) 创建测试套件
  测试套件可以将多个测试用例合在一起测试,将相关的测试用例合成一个测试套件,在做一个修改后,只需要运行测试套件就可以,不需要运行每一个测试用例。
  Junit4没有采用以前的套件测试方法,同样使用annotation的方式来进行。简单在你所要构建测试套件的包里创建一个文件,一般以包名+4Suite
下面我在上面的测试包中复制一下之前的测试类并且一个改名字叫做MathTestAnother,新建一个class类叫做Uitl4Suite,代码如下:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
 * @author bulargy.j.bai
 * @mail bulargy@gmail.com
 * @创建时间:Mar 11, 2008
 * @描述:util包的测试套件
 */
@RunWith(Suite.class)
@SuiteClasses({MathTest.class,
           MathTestAnother.class})
public class Util4Suite {
}

说明:
通过@RunWith和@SuiteClasses标签来注释一个空的包含无参数构造函数的类来作为套件类,将需要组成套件运行的类加到@SuiteClasses的属性中即可。

可以看到运行套件类的结果是2个测试类都进行了测试。

5) 参数测试
修改 testMultiple
    //@Ignore("忽略乘法测试")
    @Test
    public void testMultiple() {
        assertEquals(result,Math.multiple(faciend,multiplicator));
    }

编写参数方法:
@Parameters
    public static Collection multipleValues() {
        return Arrays.asList(new Object[][] {
        {3, 2, 6 },
        {4, 3, 12 },
        {21, 5, 105 },
        {11, 22, 242 },
        {8, 9, 72 }});
    }

说明:
需要使用@Parameters标签注解一个静态的返回集合对象的方法

增加成员变量和构造函数:
    int faciend;
    int multiplicator;
    int result;

    public MathTest(int faciend, int multiplicator, int result) {
        this.faciend = faciend;
        this.multiplicator = multiplicator;
        this.result = result;
    }

最后在给测试类增加如下注释:
@RunWith(Parameterized.class)


完整的循环测试代码如下:
import static org.junit.Assert.*;

import java.util.Arrays;
import java.util.Collection;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

/**
 * @author bulargy.j.bai
 * @mail bulargy@gmail.com
 * @创建时间:Mar 11, 2008
 * @描述:
 */
@RunWith(Parameterized.class)
public class MathTest {
	int faciend;
	int multiplicator;
	int result;

	public MathTest(int faciend, int multiplicator, int result) {
		 this.faciend = faciend;
		 this.multiplicator = multiplicator;
		 this.result = result;
	}

	@BeforeClass
	public static void setUpBeforeClass() throws Exception {
	}

	@AfterClass
	public static void tearDownAfterClass() throws Exception {
	}

	@Test(expected=ArithmeticException.class)
	public void testDivide() {
		assertEquals(3,Math.divide(9,3));
		assertEquals(3,Math.divide(10,3));
		Math.divide(10,0);//除数不能为0,会抛出异常

	}

	//@Ignore("忽略乘法测试")
	@Test
	public void testMultiple() {
		assertEquals(result,Math.multiple(faciend,multiplicator));
	}
	
	@Parameters
	public static Collection multipleValues() {
	 return Arrays.asList(new Object[][] {
        {3, 2, 6 },
        {4, 3, 12 },
        {21, 5, 105 },
        {11, 22, 242 },
        {8, 9, 72 }});
	}

}

OK,大功告成。测试看看吧,测试类跑了5次~~。

大概就这么多体会了,总得来说JUnit4以后测试还是很方便的,顺便这个是仅仅是为了做例子,实际使用中由于JUnit4不再受命名的限制,所以应该划分更细粒度的测试来完成,一个方法的正确,异常,错误及边界数据完全可以分开来写测试方法。由于大部分情况资源只用加载和释放一次就足够,大大提高的测试的速度,再也不会有以前那样点开测试然后去泡咖啡的情况出现了~~呵呵~~
分享到:
评论
11 楼 cleanWater 2008-10-23  
Arrays.asList(new Object[][] {  
        {3, 2, 6 },  
        {4, 3, 12 },  
        {21, 5, 105 },  
        {11, 22, 242 },  
        {8, 9, 72 }});  
    }  
以上二维数组的一个元素中怎恶魔可以放3个数字;还有请问楼主:这个测试中怎么乘法和除法都跑了5遍。我刚用这个东西,请帮忙看看。谢谢。
10 楼 kuuuu 2008-10-16  
参数测试,自定义对象好像有问题。
Example:
这样写static Collection.
        private User user;
	@Parameters
	public static Collection<ArrayList> user(){
		User user = new User();
		user.setUserId("mouse");
		user.setPassword("qqq111");
		User user1 = new User();
		user1.setUserId("ape");
		user1.setPassword("ape");
		return (Collection<ArrayList>) Arrays.asList(new Object[]{user,user1});
	}

调用测试报出异常。must return a Collection of arrays.
@Test
public void testLogin(){
  userSerivce.login(user);
}

9 楼 bulargy 2008-08-31  
本来就是让它跑5次么
8 楼 zxw523 2008-08-30  
怎么那个除法运算也跟着跑了5次
7 楼 black_angle 2008-06-12  
深秋小雨 写道
一个方法可能抛出多个异常,但执行一次只会抛出一个异常。
想对一个方法的每种异常进行测试的话,应该为每种情况写一个test方法吧。

恩 我也是这么思考的 谢谢
6 楼 yuan 2008-06-06  
black_angle 写道
当一个方法可能抛出多个异常的时候,该怎么测试呢?

一个方法可能抛出多个异常,但执行一次只会抛出一个异常。
想对一个方法的每种异常进行测试的话,应该为每种情况写一个test方法吧。
5 楼 black_angle 2008-06-06  
当一个方法可能抛出多个异常的时候,该怎么测试呢?
4 楼 yuan 2008-06-04  
删了,我想我搞错了。
3 楼 sotier 2008-05-14  
正在学习 呵呵
2 楼 bulargy 2008-03-11  
参数测试的这个啊,那我明天去公司把完整的参数测试的代码贴出来你就了解了~~
1 楼 feigme 2008-03-11  
很全嘛!
关于参数测试还是说的不够明白啊!

相关推荐

    springboot的测试,适合小白前期学习springboot

    4. **Mocking**:使用Mockito,我们可以模拟服务、DAO或其他复杂组件,以便专注于测试当前类的行为,而不是依赖项的实现。 5. **Integration Tests**:SpringBoot的`@SpringBootTest`注解可以用于创建完整的应用上...

    软件测试小白三年感悟.docx

    9. **自动化测试**:利用工具如Selenium、Junit等来执行重复的测试任务,提高效率。 10. **测试计划与文档**:详细记录测试策略、方法、预期结果和实际结果,为质量保证提供依据。 【职业发展路径】 对于初级测试...

    测试学习资料

    流行的测试工具如Selenium用于Web应用自动化测试,Junit和TestNG是Java中的单元测试框架,Postman则常用于API接口测试。 三、自动化测试 自动化测试是提高测试效率的关键。资料中可能涵盖了如何使用自动化测试工具...

    初试android studio 创建project时报错:Could not download junit.jar(junit:junit:4.12)

    本人小白,开始学习Android,记录自己的错误瞬间,大神不要喷我,哈哈! 安装好android studio后,测试并创建了一个HelloWord project,按照提示一步一步设置完成后,发现要下载一些gradle resource,结果下载了一夜...

    源码(523集小白到大神)

    13. **单元测试**:JUnit或TestNG的使用,确保代码质量。 这套教程通过523集的丰富内容,应该能够为初学者提供一个全面而深入的学习路径,帮助他们逐步掌握Java编程,并具备解决实际问题的能力。对于每个视频,学习...

    资源专区-小白必看-JAVA+PYTHON学习资料大全

    8. **测试与调试**:单元测试、集成测试的概念和工具,如JUnit(JAVA)、pytest(PYTHON)的使用。 9. **版本控制**:Git的基本操作和在JAVA、PYTHON项目中的应用。 10. **项目管理**:Maven或Gradle在JAVA项目中...

    ALevin配置环境所需要的基础包——JUnit

    能学到什么: 可以帮助大家更快的配置好ALevin运行环境 阅读建议: ALevin作为一个很好的虚拟网络仿真平台,它的开源给我们的学习带来很大方便,但在这之前我们先要将环境配置好,才能更好的使用着个开源工具,由于...

    Java小白新手入门必看的Java学习路线图,认真看错不了

    例如,学习使用IDEA这样的集成开发环境,了解Maven或Gradle构建工具,以及单元测试框架如JUnit。 总的来说,Java学习是一个循序渐进的过程,从基础知识到高级特性的掌握,再到实战经验的积累。只要你保持热情,坚持...

    软件测试压缩

    3. 测试工具:如Selenium用于Web应用测试,JUnit用于Java单元测试,Appium用于移动应用测试,JMeter用于性能测试等。这些工具的使用方法和实战案例可能在压缩包内有所介绍。 4. 缺陷管理:包括如何记录、分类、...

    最新编写小白必备

    5. **Spring Boot的测试支持**:包括单元测试和集成测试,如何使用JUnit和Mockito等工具进行测试。 6. **项目结构和配置**:分析"springboot-1"目录下的结构,包括src/main目录下的java和resources,以及pom.xml或...

    8天掌握软件测试实践课程(院校也在用的教学视频)

    通过本课程的学习,同学们将学习经典的黑盒测试基础,黑盒测试高级应用,还有像Junit插件,JMeter工具的使用,以及接口测试、性能测试、web和Android测试。这是一门操作实验课程,但是在实验的过程中穿插着理论的...

    软件测试教学视频(共30G)

    9. **测试框架**:如JUnit用于Java的单元测试,PyTest对于Python的测试支持,以及Mocha和Chai在JavaScript中的应用。了解如何编写和组织测试代码,使用断言库进行结果验证。 10. **最新趋势**:可能涵盖AI和机器...

    SSM基础实例(适合小白)

    8. **测试**:编写JUnit测试,验证SSM整合是否成功,各个组件能否正常工作。 通过这个实例,初学者不仅可以学习到SSM框架的基本用法,还能了解MVC设计模式和数据库操作,对Java Web开发有一个初步的认识。在实践中...

    how2j离线学习资源

    5. **调试与测试**:讲解如何使用JUnit进行单元测试,理解断言和调试技巧,以确保代码质量。 6. **面试准备**:包含常见的Java面试问题和解答,帮助准备求职的学员了解并熟悉企业面试中可能遇到的问题。 7. **最佳...

    基于JavaWeb的期刊管理系统+课设报告.zip

    1. Junit测试 2. JDK17 进行开发 3. 采用Jar包 1. Druid数据库连接池 2. QueryRunner 3. commons beanUtils 4. commons dbUtils 5. commons fileUpload 6. commons codec 7. commons io 8. java.utils.UUID ...

    基于SpringBoot、WebSocket、MyBatis实现的在线聊天室平台+源代码+文档说明

    - 测试框架:JUnit - 加密:BCrypt加密 ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子...

    Java学习资料.zip

    最后,可能还会有单元测试和持续集成的概念,比如JUnit测试框架和Maven或Gradle构建工具的使用。这些工具确保代码质量,自动化构建过程,以及项目的可维护性。 总的来说,"Java学习资料.zip" 提供的资源全面覆盖了...

    30天学通Java项目案例开发 源代码

    JUnit是一个流行的Java测试框架,通过编写测试用例,我们可以确保代码的正确性和稳定性。 总的来说,《30天学通Java项目案例开发 源代码》是一个全面的学习资源,涵盖了从基础到进阶的Java开发知识。通过深入研究...

    Java入门全套教程,从入门到就业(Java小白、零基础自学、初学者)

    14. **单元测试**:学习使用JUnit进行单元测试,理解断言和测试注解。 15. **Java面试常见问题**:涵盖一些常见的面试题,帮助求职者准备面试,如“Java内存模型”,“多线程中的死锁问题”,“equals()与hashCode...

Global site tag (gtag.js) - Google Analytics