天天看点

测试体系 JUnit4 感悟

关于 test 测试方面 自己的体会

http://weity.blogspot.com/

我的海外blog,有兴趣的可以去看看,别忘记点一下 google的广告哦。

  在软件开发流程里面,test(测试)属于比较靠后的 步骤,在经过 概要设计,基本设计,详细设计,制造等流程之后,

才会进入的一个 非常重要的软件开发步骤

  基本上,测试的人,应该参与了前面几个步骤,应该说 是非常了解 业务逻辑,制造方法,

以及明确的知道自己想要什么结果的人。

  如果做不到上面说的几项,基本上测试的人是个没有灵魂的。也是基本上属于 机械的,不知所以然的 危险的测试。

  基本上 测试分为几个阶段

  1:制造结束初始--单体测试

  2:项目某一个模块制造结束初始--统合测试

  3:项目结束初始--系统测试

(本文以JUnit单体测试为主要阐述对象)

 单体测试

  在制造结束初始阶段,每个单独的程序都需要来验证 业务,功能的正确性。

  这个时候,基本面 还是以 程序功能是否正确 作为主要对象。

几种测试工具选择

  1:基本上的功能都可以通过JUnit来完成功能测试。点击这里下载

  2:辅助的 如果操作数据库方面比较多的程序,可以使用DBUnit。点击这里下载 

  3:文法上的测试工具,可以选择 JTest (收费)。点击这里下载

  这里基本上介绍JUnit 4.X和DBUnit 2.0,JTest由于收费,还有设计验证模板都很繁琐,不在这里介绍。

  哦,差一点忘记了,还有一个JUnit 扩展包hamcrest,点击这里下载

  参考文章:探索 JUnit 4.4 新特性 来自 IBM developerWork china

下面进入正题:

  首先,来看一段代码

  equalTo方法

定义: public class Matchers {   public static <T> org.hamcrest.Matcher<T> equalTo(T operand) {     return org.hamcrest.core.IsEqual.equalTo(operand);   } } 应用: @Test public void testAssertThatWithEqualTo() {   Assert.assertThat("test", Matchers.equalTo("test"));   Assert.assertThat("test", Matchers.equalToIgnoringCase("TEST"));   Assert.assertThat("test", Matchers.equalToIgnoringWhiteSpace("    test    "));   Assert.assertThat(10, Matchers.equalTo(new Integer(10))); }

  使用过JUnit 的大家,都熟悉这个方法,现在JUnit 4.5 +hamcrest 提供了更方便的 静态方法。

下面来看一下如何对 String来进行比较

@Test

public void testAssertThatConcerningString() {

  Assert.assertThat("test", Matchers.containsString("es"));

  Assert.assertThat("test", Matchers.startsWith("tes"));

  Assert.assertThat("test", Matchers.endsWith("st"));

}

下面是数值的验证

@Test

public void testAssertThatConcerningNumber() {

  // clothTo()验证有没有误差

  Assert.assertThat(1.01d, Matchers.closeTo(1.001d, 0.01d));

  Assert.assertThat(0.991d, Matchers.closeTo(1.001d, 0.01d));

  // 因为1.01 不在 1.001 +- 0.005 的范围,所以导致失败

  // Assert.assertThat(1.01d, Matchers.closeTo(1.001d, 0.005d));

  Assert.assertThat(11, Matchers.greaterThan(10));

  Assert.assertThat(11, Matchers.greaterThanOrEqualTo(11));

  // 也有lessThan(), lessThanOrEqualTo()

}

下面是比较困难的数组系列

@Test

public void testAssertThatConcerningCollection() {

  List<Integer> list = new ArrayList<Integer>();

  list.add(1);

  list.add(2);

  list.add(3);

  Assert.assertThat(list, Matchers.hasItem(2));

  // hasItems()方法的参数是可变长度

  Assert.assertThat(list, Matchers.hasItems(2));

  Assert.assertThat(list, Matchers.hasItems(1, 2, 3));

  Integer[] integers = {new Integer(1), new Integer(2)};

  Assert.assertThat(integers, Matchers.hasItemInArray(1));

  Map<Integer, String> map = new HashMap<Integer,String>();

  map.put(1, "one");

  map.put(2, "two");

  map.put(3, "three");

  Assert.assertThat(map, Matchers.hasEntry(1, "one"));

  // Map的key和value,都可以用Matcher来比较

  Assert.assertThat(map, Matchers.hasEntry(Matchers.equalTo(2), Matchers.equalTo("two")));

}

下面是Bean的验证

@Test

public void testAssertThatConcerningBeans() {

  Item item = new Item();

  item.setName("test");

  Assert.assertThat(item, Matchers.hasProperty("name"));

  Assert.assertThat(item, Matchers.hasProperty("name", Matchers.equalTo("test")));

}

下面是Object的验证

@Test

public void testAssertThatConcerningObject() {

  Item item = new Item();

  item.setName("test");

  // 验证第一个参数对象的toString()

  Assert.assertThat(item, Matchers.hasToString(Matchers.equalTo(item.toString())));

  // 验证Class#isAssignableFrom()

  Assert.assertThat(item.getClass(), Matchers.typeCompatibleWith(Serializable.class));

  Assert.assertThat(item.getClass(), Matchers.instanceOf(Serializable.class));

  Item nullItem = null;

  Assert.assertThat(nullItem, Matchers.nullValue());

  Assert.assertThat(item, Matchers.notNullValue());

  Assert.assertThat(item, Matchers.sameInstance(item));

}

下面是逻辑的验证

@Test

public void testAssertThatConcerningLogic() {

  // Matchers.anything()是一直为True

  Assert.assertThat("test", Matchers.anything());

  // 全部都是True才可以

  Assert.assertThat("test", Matchers.allOf(Matchers.equalTo("test"), Matchers.containsString("es")));

  // 有一个为True就可以

  Assert.assertThat("test", Matchers.anyOf(Matchers.equalTo("xxxx"), Matchers.containsString("es")));

}

下面是完整的代码:

theOthersOfMatchers.java

package com.weity.JUnit4.samples;

import static org.hamcrest.CoreMatchers.allOf;

import static org.hamcrest.CoreMatchers.anyOf;

import static org.hamcrest.CoreMatchers.anything;

import static org.hamcrest.CoreMatchers.equalTo;

import static org.hamcrest.CoreMatchers.is;

import static org.hamcrest.CoreMatchers.not;

import static org.junit.Assert.assertThat;

import static org.junit.matchers.JUnitMatchers.containsString;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.hamcrest.Matchers;

import org.junit.Test;

public class theOthersOfMatchers {

@SuppressWarnings("unchecked")

@Test

public void chkString(){

String testedString = "developerWorks";

String testedValue = "abc";

String expectedValue = "abc";

// is 

assertThat( testedString, is( "developerWorks" ) );

// not 

assertThat( testedString, not( "BdeveloperWorks" ) );

// containsString 

assertThat( testedString, containsString( "developerWorks" ) );

// endsWith 

assertThat( testedString, Matchers.endsWith( "developerWorks" ) ); 

// startsWith 

assertThat( testedString, Matchers.startsWith( "developerWorks" ) ); 

// equalTo 

assertThat( testedValue, equalTo( expectedValue ) ); 

// equalToIgnoringCase

assertThat( testedString, Matchers.equalToIgnoringCase( "developerWorks" ) ); 

// equalToIgnoringWhiteSpace

assertThat( testedString, Matchers.equalToIgnoringWhiteSpace( "developerWorks" ) );

assertThat("test", Matchers.equalTo("test"));

assertThat("test", Matchers.equalToIgnoringCase("TEST"));

assertThat("test", Matchers.equalToIgnoringWhiteSpace("    test    "));

}

@SuppressWarnings("unchecked")

@Test

public void chkInt(){

int testedNumber = 1;

// allOf == &&

assertThat( testedNumber, allOf( Matchers.greaterThan(0), Matchers.lessThan(16) ) );

// anyOf == ||

assertThat( testedNumber, anyOf( Matchers.greaterThan(16), Matchers.lessThan(8) ) );

// anything ==true

assertThat( testedNumber, anything() );

// is 

assertThat( testedNumber, is( 1 ) );

// not 

assertThat( testedNumber, not( 2 ) );

// equalTo

assertThat( testedNumber, Matchers.equalTo(new Integer(1)));

}

@SuppressWarnings("unchecked")

@Test

public void chkDouble(){

double testedDouble = 1.0;

// closeTo 

assertThat( testedDouble, Matchers.closeTo( 20.0, 0.5 ) );

// greaterThan 

assertThat( testedDouble, Matchers.greaterThan(16.0) );

// lessThan 

assertThat( testedDouble, Matchers.lessThan (16.0) );

// greaterThanOrEqualTo 

assertThat( testedDouble, Matchers.greaterThanOrEqualTo (16.0) );

// lessThanOrEqualTo 

assertThat( testedDouble, Matchers.lessThanOrEqualTo (16.0) );

// closeTo()

assertThat(1.01d, Matchers.closeTo(1.001d, 0.01d));

assertThat(0.991d, Matchers.closeTo(1.001d, 0.01d));

// 

assertThat(1.01d, Matchers.closeTo(1.001d, 0.005d));

assertThat(11, Matchers.greaterThan(10));

assertThat(11, Matchers.greaterThanOrEqualTo(11));

// lessThan(), lessThanOrEqualTo()

}

@SuppressWarnings("unchecked")

@Test

public void chkArray(){

//collection

List<Integer> list = new ArrayList<Integer>();

list.add(1);

list.add(2);

list.add(3);

assertThat(list, Matchers.hasItem(2));

// hasItems()

assertThat(list, Matchers.hasItems(2));

assertThat(list, Matchers.hasItems(1, 2, 3));

Integer[] integers = {new Integer(1), new Integer(2)};

assertThat(integers, Matchers.hasItemInArray(1));

Map<Integer, String> map = new HashMap<Integer,String>();

map.put(1, "one");

map.put(2, "two");

map.put(3, "three");

assertThat(map, Matchers.hasEntry(1, "one"));

// 

assertThat(map, Matchers.hasEntry(Matchers.equalTo(2), Matchers.equalTo("two")));

List<String> lis = new ArrayList<String>();

lis.add("key");

lis.add("value");

lis.add("elemment");

//collection mapObject = new collection();

//Map mapObject = new HashMap(1);

//Map iterableObject = new HashMap(1);

Map<String, String> mapObject = new HashMap<String,String>();

mapObject.put("key", "value");

mapObject.put("ke2", "two");

mapObject.put("ke3", "three");

//String iterableObject = "";

// hasEntry 

assertThat( mapObject, Matchers.hasEntry( "key", "value" ) );

// hasItem 

//assertThat( iterableObject, Matchers.hasItem ( "element" ) );

// hasKey 

//assertThat( mapObject.get(0), Matchers.hasKey ( "key" ) );

// hasValue 

//assertThat( mapObject, Matchers.hasValue ( "key" ) );

}

@Test

public void testAssertThatConcerningBeans() {

Item item = new Item();

item.setStrName("test");

assertThat(item, Matchers.hasProperty("strName"));

assertThat(item, Matchers.hasProperty("strName", Matchers.equalTo("test")));

}

@Test

public void testAssertThatConcerningObject() {

Item item = new Item();

item.setStrName("test");

// 

assertThat(item, Matchers.hasToString(Matchers.equalTo(item.toString())));

// 

assertThat(item.getClass(), Matchers.typeCompatibleWith(Serializable.class));

assertThat(item.getClass(), Matchers.instanceOf(Serializable.class));

Item nullItem = null;

assertThat(nullItem, Matchers.nullValue());

assertThat(item, Matchers.notNullValue());

assertThat(item, Matchers.sameInstance(item));

}

@Test

public void testAssertThatConcerningLogic() {

// Matchers.anything()

assertThat("test", Matchers.anything());

// 

assertThat("test", Matchers.allOf(Matchers.equalTo("test"), Matchers.containsString("es")));

// 

assertThat("test", Matchers.anyOf(Matchers.equalTo("xxxx"), Matchers.containsString("es")));

}

}

接下来是: Item.java

package com.weity.JUnit4.samples;

import java.io.Serializable;

public class Item implements Serializable {

public String strName;

public Item(){

}

public String getStrName() {

return strName;

}

public void setStrName(String strName) {

this.strName = strName;

}

@Override

protected Object clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

return super.clone();

}

@Override

public boolean equals(Object arg0) {

// TODO Auto-generated method stub

return super.equals(arg0);

}

@Override

protected void finalize() throws Throwable {

// TODO Auto-generated method stub

super.finalize();

}

@Override

public int hashCode() {

// TODO Auto-generated method stub

return super.hashCode();

}

@Override

public String toString() {

// TODO Auto-generated method stub

return super.toString();

}

}