码迷,mamicode.com
首页 > 其他好文 > 详细

单元测试

时间:2016-05-12 21:17:09      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

今儿接触JUnit测试框架,发现测试工具非常有用。不说别的,能帮助我自动生成测试代码,而且省去了手动测试时main函数调用各个方法的麻烦事。我使用的是JUnit Test case不知道另一个JUnit Test Suite是干嘛用的。
在开发中,对于自己开发的模块,只有在通过单元测试之后,才能提交到 SVN 库 或者 Git 库。
正是由于测试在开发中的重要地位,才会在IT界刮起了 TDD 的旋风。TDD,也就是测试驱动开发模式。它旨在强调在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。
好像Test Suite很复杂的样子,来,让大叔好好关照他。
  1. public class TestSuite1 {  
  2. public static Test suite() {  
  3. TestSuite suite = new TestSuite("Test for package1");  
  4.   
  5. suite.addTest(new JUnit4TestAdapter(Test1.class));  
  6. suite.addTest(new JUnit4TestAdapter(Test2.class));   
  7. suite.addTest(new JUnit4TestAdapter(Test3.class));  
  8.   
  9. suite.addTest(new JUnit4TestAdapter(TestSuite2.class));  
  10. return suite;  
  11. }  
  12. }  
     
一个例子就懂了,就是组合测试,据说用了compose模式。
JUnit3 和JUnit4区别,我看着就是JUnit3使用继承,JUnit4使用注解。
回到了我开始调用包的问题,我从Maven上下了两个包,junit-4.12.jar和hamcrest-all-1.3.jar。前者是java单元测试包,后者是干嘛用的。大叔告诉你,开始遗留问题,不得不查,否则就成历史遗留问题了。hamcrest是:
Hamcrest 是一个测试的框架,它提供了一套通用的匹配符 Matcher,灵活使用这些匹配符定义的规则,程序员可以更加精确的表达自己的测试思想,指定所想设定的测试条件。结合testng或其他测试工具,可以写出更为简洁的test。如下例子
  1. import static org.hamcrest.MatcherAssert.assertThat;
  2. import static org.hamcrest.Matchers.*;
  3. import junit.framework.TestCase;
  4. public class BiscuitTest extends TestCase {
  5.   public void testEquals() {
  6.     Biscuit theBiscuit = new Biscuit("Ginger");
  7.     Biscuit myBiscuit = new Biscuit("Ginger");
  8.     assertThat(theBiscuit, equalTo(myBiscuit));
  9.   }
  10. }
     
大叔又想到了,assert啥啥啥的,到底有哪几种?于是开始搜。。。
在静态类junit.framework.Assert或者静态类org.junit.Assert中存在以下几个方法
1.assertTrue/False([String message,]boolean condition);
判断一个条件是true还是false。感觉这个最好用了,不用记下来那么多的方法名。
2.fail([String message,]);
失败,可以有消息,也可以没有消息。
3.assertEquals([String message,]Object expected,Object actual);
判断是否相等,可以指定输出错误信息。
第一个参数是期望值,第二个参数是实际的值。
这个方法对各个变量有多种实现。在JDK1.5中基本一样。
但是需要主意的是float和double最后面多一个delta的值,可能是误差范围,不确定这个 单词什么意思,汗一个。
4.assertNotNull/Null([String message,]Object obj);
判读一个对象是否非空(非空)。
5.assertSame/NotSame([String message,]Object expected,Object actual);
判断两个对象是否指向同一个对象。看内存地址
7.failNotSame/failNotEquals(String message, Object expected, Object actual)
当不指向同一个内存地址或者不相等的时候,输出错误信息。

前面不是提到hamcrest和JUnit的产物assertThat吗,那么有什么强大的地方呢?

import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import com.lyh.share.model.User;
 
public class UserDaoTest {
private User test1;
private User test2;
 
@Before
public void init(){
test1 = new User();
test1.setUsername( "tt1" );
test1.setPassword( "123" );
test1.setShares( );
test2 = new User();
test2.setUsername( "tt2" );
test2.setPassword( "321" );
test2.setShares( );
}
 
@Test
public void findUser(){
/**数值匹配**/
 
//测试变量是否大于指定值
assertThat(test1.getShares(), greaterThan( ));
//测试变量是否小于指定值
assertThat(test1.getShares(), lessThan( ));
//测试变量是否大于等于指定值
assertThat(test1.getShares(), greaterThanOrEqualTo( ));
//测试变量是否小于等于指定值
assertThat(test1.getShares(), lessThanOrEqualTo( ));
//测试所有条件必须成立
assertThat(test1.getShares(), allOf(greaterThan( ),lessThan( )));
//测试只要有一个条件成立
assertThat(test1.getShares(), anyOf(greaterThanOrEqualTo( ), lessThanOrEqualTo( )));
//测试无论什么条件成立(还没明白这个到底是什么意思)
assertThat(test1.getShares(), anything());
//测试变量值等于指定值
assertThat(test1.getShares(), is( ));
//测试变量不等于指定值
assertThat(test1.getShares(), not( ));
 
/**字符串匹配**/
String url = "http://www.taobao.com" ;
//测试变量是否包含指定字符
assertThat(url, containsString( "taobao" ));
//测试变量是否已指定字符串开头
assertThat(url, startsWith( "http://" ));
//测试变量是否以指定字符串结尾
assertThat(url, endsWith( ".com" ));
//测试变量是否等于指定字符串
assertThat(url, equalTo( "http://www.taobao.com" ));
//测试变量再忽略大小写的情况下是否等于指定字符串
assertThat(url, equalToIgnoringCase( "http://www.taobao.com" ));
//测试变量再忽略头尾任意空格的情况下是否等于指定字符串
assertThat(url, equalToIgnoringWhiteSpace( "http://www.taobao.com" ));
 
/**集合匹配**/
List<User> user = new ArrayList<User>();
user.add(test1);
user.add(test2);
//测试集合中是否还有指定元素
assertThat(user, hasItem(test1));
assertThat(user, hasItem(test2));
 
/**Map匹配**/
Map<String,User> userMap = new HashMap<String,User>();
userMap.put(test1.getUsername(), test1);
userMap.put(test2.getUsername(), test2);
//测试map中是否还有指定键值对
assertThat(userMap, hasEntry(test1.getUsername(), test1));
//测试map中是否还有指定键
assertThat(userMap, hasKey(test2.getUsername()));
//测试map中是否还有指定值
assertThat(userMap, hasValue(test2));
}
}
 来源: <http://www.tuicool.com/articles/aErQjiF>

单元测试

标签:

原文地址:http://blog.csdn.net/ldw220817/article/details/51355246

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!