junit--基于测试开发和cobertura框架
来源:互联网 发布:cf手游刷枪软件不封号 编辑:程序博客网 时间:2024/05/16 10:04
1.什么是基于测试的开发
正常的开发流程:编码-->测试-->重复-->提交
基于测试的开发流程:测试-->编码-->重复-->提交
先写了测试之后,由于测试覆盖率要求为100%,所以就会让代码中可能存在的分支都进行测试,这样过先写测试单元,可以为将来的代码提供一种有效的参考
基于测试的开发例子:
编写接口:
package com.qunar.service;import com.qunar.model.User;public interface IUserService {public void add(User user);public void delete(String username);public User loader(String username);public User login(String username, String password);}2.针对接口进行测代码的编写 注意要覆盖每个方面
package com.qunar.service;import static org.junit.Assert.*;import org.junit.Before;import org.junit.Test;import com.qunar.model.User;import com.qunar.model.UserException;import com.qunar.service.impl.UserServiceByMap;public class TestUserService {private IUserService us;private User baseUser;@Beforepublic void setUp() {// initus = new UserServiceByMap();baseUser = new User("admin", "123", "管理员");}@Testpublic void testAdd() {User user = baseUser;us.add(user);User user2 = us.loader("admin");assertNotNull(user2);assertTrue(user.equals(user2));}@Testpublic void testDelete() {us.add(baseUser);User tUser = us.loader(baseUser.getUsername());assertNotNull(tUser);us.delete(baseUser.getUsername());tUser = us.loader(baseUser.getUsername());assertNull("删除的用户还存在",tUser);}@Testpublic void testLogin() {us.add(baseUser);String username = "admin";String password = "123";User user = us.login(username, password);assertTrue(user.equals(baseUser));}@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 = "1234";us.login(username, password);}}
3.编写实现类
package com.qunar.service.impl;import java.util.Map;import com.google.common.collect.Maps;import com.qunar.model.User;import com.qunar.model.UserException;import com.qunar.service.IUserService;public class UserServiceByMap implements IUserService {private Map<String, User> map = Maps.newHashMap(); @Overridepublic void add(User user) { if (loader(user.getUsername())!=null) {throw new UserException("用户名已经存在");} map.put(user.getUsername(), user);}@Overridepublic void delete(String username) {map.remove(username);}@Overridepublic User loader(String username) {// TODO Auto-generated method stubreturn map.get(username);}@Overridepublic User login(String username, String password) {User user = loader(username);if(user==null){throw new UserException("用户名不存在");}if(user.getPassword()!= password){throw new UserException("用户密码不正确");}return user;}}
运行testCase 全部通过
如果在实现类中,当删除用户名为admin的时候不允许删除,如下所示
public void delete(String username) {if(username.equals("admin")){return ;}map.remove(username);}
再次运行测试代码:
java.lang.AssertionError: 删除的用户还存在at org.junit.Assert.fail(Assert.java:93)at org.junit.Assert.assertTrue(Assert.java:43)at org.junit.Assert.assertNull(Assert.java:551)at com.qunar.service.TestUserService.testDelete(TestUserService.java:39)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:606)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)at org.junit.runners.ParentRunner.run(ParentRunner.java:300)at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)这样可以明确的指出那里出了错误
2.cobertura 的使用
1)首先修改工程的pom.xml文件 加入如下代码
<reporting> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>cobertura-maven-plugin</artifactId> <version>2.5.1</version> </plugin> </plugins> </reporting>
首先运行“mvn cobertura:help”, 如果不能运行,请添加以下仓库
<pluginRepositories> <pluginRepository> <id>Codehaus repository</id> <url>http://repository.codehaus.org/</url> </pluginRepository> </pluginRepositories>
cobertura插件的命令
mvn cobertura:help 查看cobertura插件的帮助mvn cobertura:clean 清空cobertura插件运行结果mvn cobertura:check 运行cobertura的检查任务mvn cobertura:cobertura 运行cobertura的检查任务并生成报表,报表生成在target/site/cobertura目录下cobertura:dump-datafile Cobertura Datafile Dump Mojomvn cobertura:instrument Instrument the compiled classes
到项目根目录下运行mvn cobertura:cobertura 将会插桩class文件、测试、生成覆盖率报告
我的测试代码生产的报表如下:
0 0
- junit--基于测试开发和cobertura框架
- junit学习笔记(三):测试驱动开发和cobertura框架
- 使用Cobertura统计JUnit测试覆盖率
- 一个基于JUnit的测试框架
- 数据库框架-ormlite和测试框架-junit
- 使用Ant+JUnit+Cobertura来实现代码覆盖自动测试
- Java测试框架TestNG和JUnit对比
- Java测试框架TestNG和JUnit对比
- 软件测试技术JUnit和单元测试入门简介--Junit框架
- Ant+JUnit+Cobertura
- Junit框架(基于myeclipse)
- Java开发01----Junit安装和测试
- Junit测试框架
- JUnit测试框架简介
- JUnit测试框架
- Java测试框架Junit
- Junit测试框架
- JUnit测试框架简介
- Python串口通信--pyseral
- 如何让HTML5调用手机摄像头拍照——实践就是一切
- Linux内核编程(一) —— 内核模块加载
- Codeforces 437B The Child and Set(暴力)
- C# XMLHTTP 读文件
- junit--基于测试开发和cobertura框架
- C++编程故障处理—— conversion from ‘__gnu_cxx::__normal_iterator
- Android常用方法之由url,返回获得的原始json
- 为MS SQL 2005添加一个用户admin
- Linux内核编程(二) —— 接受参数的模块
- 常用的PS操作
- set serveroutput on 命令
- HTML的学习资料
- 【点击模型学习笔记】Predicting Clicks_Estimating the Click-Through Rate for New Ads_MS_www2007