Cobertura 是一种开源工具,它通过检测基本的代码,并观察在测试包运行时执行了哪些代码和没有执行哪些代码,来测量测试覆盖率。除了找出未测试到的代码并发现 bug 外,Cobertura 还可以通过标记无用的、执行不到的代码来优化代码,还可以提供 API 实际操作的内部信息。
Cobertura跟Maven完美结合,只需要在pom文件中增加一个插件即可:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>cobertura-maven-plugin</artifactId>
<version>2.7</version>
</plugin>
项目开发正确过程应该如此:
1.创建一个User对象:
package jmust.demo.Cobertura;
/**
* Hello world!
*
*/
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();
}
public User(String userName,String password,String nickName){
super();
this.userName = userName;
this.password = password;
this.nickName = nickName;
}
}
2.定义功能接口类:
package jmust.demo.Cobertura.Inter;
import jmust.demo.Cobertura.User;
public interface IUserService {
public boolean add(User user);
public boolean delete(String userName);
public User load(String userName);
public User login(String userName,String password);
}
3.编写单元测试类:
package jmust.demo.CoberturaTest;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import jmust.demo.Cobertura.User;
import jmust.demo.Cobertura.Exception.UserException;
import jmust.demo.Cobertura.Inter.IUserService;
import jmust.demo.Cobertura.Service.UserService;
/**
* Unit test for simple User.
*/
public class UserServiceTest {
private IUserService us;
private User user;
@Before
public void setUp(){
//初始化
us = new UserService();
user = new User("admin","123","管理员");
}
@Test
public void addTest(){
User u = user;
us.add(u);
User tu = us.load("admin");
assertNotNull(tu);
}
@Test(expected=UserException.class)
public void AddExistUsername(){
us.add(user);
User tu = new User("admin", "1234", "alskdf");
boolean state = us.add(tu);
assertFalse(state);
}
@Test
public void testDelete(){
us.add(user);
User tu = us.load(user.getUserName());
assertNotNull(tu);
us.delete(user.getUserName());
tu = us.load(user.getUserName());
assertNull(tu);
}
@Test
public void testLogin(){
us.add(user);
String username=user.getUserName();
String password=user.getPassword();
User tu = us.login(username, password);
assertNotNull(tu);
}
@Test(expected=UserException.class)
public void testNotExistsUserLogin(){
us.add(user);
String username="admin1";
String password="123";
User tu = us.login(username, password);
assertNotNull(tu);
}
@Test(expected=UserException.class)
public void testPasswordErrorUserLogin(){
us.add(user);
String username="admin";
String password="1235";
User tu = us.login(username, password);
assertNotNull(tu);
}
}
4.再编写功能实现类:
package jmust.demo.Cobertura.Service;
import java.util.HashMap;
import java.util.Map;
import jmust.demo.Cobertura.User;
import jmust.demo.Cobertura.Exception.UserException;
import jmust.demo.Cobertura.Inter.IUserService;
public class UserService implements IUserService{
private Map<String,User> us = new HashMap<String,User>();
/**
* 添加
*/
public boolean add(User user) {
if(load(user.getUserName()) != null){
throw new UserException("用户已存在");
}
us.put(user.getUserName(), user);
return true;
}
/**
* 删除
*/
public boolean delete(String userName) {
us.remove(userName);
return true;
}
/**
* 加载
*/
public User load(String userName) {
return us.get(userName);
}
/**
* 登录
*/
public User login(String userName, String password) {
User u = load(userName);
if(u == null) throw new UserException("用户不存在");
if(!u.getPassword().equals(password)) throw new UserException("用户密码不正确");
return u;
}
}
到此,项目开发完成了。然后我们来执行,看看它的覆盖率如何:
首先,我们先来把项目打包成jar包,通过maven命令执行, mvn install或者mvn package或者mvn deploy
然后,我们再继续执行maven命令,mvn cobertura:cobertura ,完成后,会在项目的目录target下有个site文件夹,我们打开里面的index页面,可以看到详细的覆盖率以及代码执行次数等。