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

junit学习笔记(三):测试驱动开发和cobertura框架

阅读更多

测试驱动开发

测试驱动开发,英文全称Test-Driven Development,简称TDD,是一种不同于传统软件开发流程的新型的开发方法。它要求在编写某个功能的代码之前先编写测试代码,然后只编写使测试通过的功能代码,通过测试来推动整个开发的进行。这有助于编写简洁可用和高质量的代码,并加速开发过程。

传统的的开发流程:
编码--->测试--->重复--->提交

基于测试驱动的开发流程:
测试--->编码--->重复--->提交

 

下面是一个简单的用户管理的用测试驱动开发的小小例子:

1、先定义好实体类User:

 

package com.fjnu.model;

public class User {
	private String username;
	private String password;
	private String nickname;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String username, String password, String nickname) {
		super();
		this.username = username;
		this.password = password;
		this.nickname = nickname;
	}
	
}



 

2、然后定义好数据操作层的接口IUserService:

 

package com.fjnu.service;

import com.fjnu.model.User;

public interface IUserService {
	public void add(User user);
	
	public void delete(String username);
	
	public User load(String username);
	
	public User login(String username, String password);
}


3、再定义一个异常类UserException,继承RuntimeException。

 

 

4、有了这些,就可以针对接口IUserService编写测试类TestUserService了,这个测试类类似于白盒测试,要把各种分支的可能情况都要考虑到并且编写测试代码:

 

package com.fjnu.service;

import static org.junit.Assert.*;

import org.junit.Before;
import org.junit.Test;

import com.fjnu.model.User;
import com.fjnu.model.UserException;


public class TestUserService {
	private IUserService us;
	private User baseUser;
	
	@Before
	public void setUp(){
		// 初始化
		us = new UserServiceByMap();
		baseUser = new User("admin", "123", "管理员");
	}
	
	private void assertUserEquals(User u, User tu){
		assertEquals("add方法有错误!", u.getUsername(), tu.getUsername());
		assertEquals("add方法有错误!", u.getNickname(), tu.getNickname());
		assertEquals("add方法有错误!", u.getPassword(), tu.getPassword());
	}
	
	@Test
	public void testAdd(){
		User u = baseUser;
		us.add(u);
		User tu = us.load("admin");
		assertNotNull(tu);
		assertUserEquals(u, tu);
		//fail("请加入添加的测试代码");
	}
	
	@Test(expected=UserException.class)
	public void AddExistUsername(){
		us.add(baseUser);
		User tu = new User("admin", "1234", "alskdf");
		us.add(tu);
	}
	
	@Test
	public void testDelete(){
		us.add(baseUser);
		User tu = us.load(baseUser.getUsername());
		assertNotNull(tu);
		us.delete(baseUser.getUsername());
		tu = us.load(baseUser.getUsername());
		assertNull(tu);
	}
	
	@Test
	public void testLogin(){
 		us.add(baseUser);
		String username=baseUser.getUsername();
		String password=baseUser.getPassword();
		User tu = us.login(username, password);
		assertUserEquals(baseUser, tu);
	}
	
	@Test(expected=UserException.class)
	public void testNotExistsUserLogin(){
		us.add(baseUser);
		String username="admin1";
		String password="123";
		us.login(username, password);
 	}
	
	@Test(expected=UserException.class)
	public void testPasswordErrorUserLogin(){
		us.add(baseUser);
		String username="admin";
		String password="1235";
		us.login(username, password);
	}
}



 

5、编写完测试类之后,就可以实现接口IUserService了:

 

package com.fjnu.service;

import java.util.HashMap;
import java.util.Map;

import com.fjnu.model.User;
import com.fjnu.model.UserException;

public class UserServiceByMap implements IUserService {
	private Map<String, User> us = new HashMap<String, User>();
	
	@Override
	public void add(User user) {
		// TODO Auto-generated method stub
		if(load(user.getUsername()) != null){
			throw new UserException("用户名已存在");
		}
		us.put(user.getUsername(), user);
	}

	@Override
	public void delete(String username) {
		// TODO Auto-generated method stub
		us.remove(username);
	}

	@Override
	public User load(String username) {
		// TODO Auto-generated method stub
		return us.get(username);
	}

	@Override
	public User login(String username, String password) {
		// TODO Auto-generated method stub
		User u = load(username);
		if(u==null) throw new UserException("用户名不存在");
		if(!u.getPassword().equals(password)) throw new UserException("用户密码不正确");
		return u;
	}

}

 

 

最终:

 



 
 

cobertura框架:测试代码覆盖率

用测试驱动开发时,会有一个问题,就是不知道你的测试代码是否覆盖了所有的情况,或者说不知道覆盖了多少。
Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息。
 
更详细的介绍和使用方法:
 
 
 
 
 
分享到:
评论

相关推荐

    测试驱动开发及开发实践.pdf

    JUnit是一款流行的Java语言单元测试框架,广泛应用于Java应用程序的测试驱动开发实践中。使用JUnit进行TDD主要包括以下步骤: 1. **安装JUnit库**:将JUnit库添加到项目的依赖列表中。 2. **创建测试类**:根据待...

    测试驱动开发with Junit(三)

    总结,"测试驱动开发with JUnit(三)"这一主题涵盖了TDD的基本理念和JUnit的使用技巧,通过学习,开发者能够更有效地运用TDD实践来提高代码质量和可维护性。通过阅读提供的PDF文档,你可以深入了解TDD的实施步骤和...

    读书笔记:junit junit5 jupiter 单元测试 java单元测试 测试驱动开发.zip

    读书笔记:junit junit5 jupiter 单元测试 java单元测试 测试驱动开发

    Junit+ant+cobertura示例

    JUnit是Java编程语言中最常用的单元测试框架之一。它允许开发者编写可重复运行的测试用例,以确保代码的正确性。JUnit提供断言方法来验证预期的结果,以及注解来标记测试方法,如@Test。此外,JUnit支持异常测试、...

    JUnit学习笔记JUnit学习笔记JUnit学习笔记

    JUnit是Java编程语言中最常用的单元测试框架,由Erich Gamma和Kent Beck这两位软件开发界的大师共同创建。它是一个开源项目,可以在官方网站www.junit.org上获取最新版本。本文主要探讨JUnit 4.1,这是一个重要的...

    JUnit学习笔记

    综上所述,“JUnit学习笔记”可能涵盖了JUnit的基本使用、核心概念、注解驱动的测试、异常处理、参数化测试,以及如何在开发环境中集成和使用JUnit进行测试。这份文档对于学习和掌握JUnit测试框架具有很高的参考价值...

    Junit学习笔记~

    Junit学习笔记,希望有用~~~~~~~~~~~~~~~~~~~~~~

    junit-libs:junit测试包

    4. TDD(测试驱动开发)与JUnit: - 测试驱动开发是一种编程实践,先编写测试用例,然后编写刚好能让测试通过的代码。JUnit是TDD的重要工具,帮助开发者确保代码的质量。 5. 集成测试工具: - JUnit与Mockito结合...

    Junit学习笔记

    JUnit是Java编程语言中最常用的单元测试框架之一,它使得开发者能够编写可自动化执行的测试用例,以确保代码的功能正确性。本学习笔记将深入探讨JUnit的核心概念、使用方法以及其在实际开发中的应用。 一、JUnit...

    JUnit和单元测试入门简介

    JUnit 是一个开源的 Java 测试框架,用于编写和运行可重复的测试。它主要用于白盒测试、回归测试。单元测试是最小粒度的测试,以测试某个功能或代码块。JUnit 框架是 xUnit 系列框架的一个实例,用于 Java 语言。 ...

    Junit4.12和依赖包

    总的来说,Junit4.12为Java开发人员提供了强大的单元测试能力,其注解驱动的模型、丰富的断言方法、参数化测试和分类等功能使得测试代码更加简洁、易于维护。正确理解和使用Junit4.12,对于确保代码质量和提升开发...

    JUnit 4测试驱动开发----junit技术讲解

    JUnit 4 是一款广泛应用于Java开发中的单元测试框架,它极大地简化了测试代码的编写和执行。作为Java事实上的标准单元测试库,JUnit 4 的易用性和灵活性使其成为开发者首选的测试工具。本文将深入讲解JUnit 4的关键...

    Junit单元测试Junit单元测试Junit单元测试Junit单元测试

    Junit单元测试是一个功能强大且灵活的测试框架,广泛应用于软件开发中,可以帮助开发者提高测试效率和代码质量。但是,Junit单元测试也存在一些缺点,需要开发者具备较高的编程技能和配置技能。

    junit和cobertura实例

    在测试驱动开发中,单元测试非常重要,而测试代码的分支覆盖率和行覆盖率同样重要,目前比较流行的单元测试工具为junit,而覆盖率测试工具cobertura非常好用,现在将2者集成到一块,个人感觉在现实的开发中还是比较...

    java 测试驱动开发 by Example

    - "测试驱动开发 by Example"这本书很可能详细介绍了TDD的实践方法,包括案例研究和最佳实践,对于想要深入了解TDD的Java开发者来说是一份宝贵的学习资料。 总的来说,Java测试驱动开发通过先编写测试,再编写代码...

    Junit学习.rar

    8. **测试驱动开发(TDD)**:JUnit是TDD实践中不可或缺的一部分,通过先写测试再写代码,保证了代码质量。 9. **Hamcrest匹配器**:JUnit 4常常结合Hamcrest库,提供更丰富的断言方式。 10. **@TestTimeout**:...

Global site tag (gtag.js) - Google Analytics