Junit4入门

JUnit测试一个类:

package com.junit4;

public class T {
	public int add(int x, int y) {
		return x + y;
	}

	public int devide(int x, int y) {
		return x / y;
	}
}

 

eclipse创建JUuit测试类(用JUnit Test Case创建,创建时使用eclipse自带的JUnit jar包):

package com.junit4.test;

//静态引入(也就是说,静态引入一个类,就可以直接使用这个类中的静态方法,而不需要类名了)
import static org.junit.Assert.*;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

import com.junit4.T;

public class TTest {

	public TTest() {
		System.out.println("TTest");
	}

	// 每一个测试方法之前运行
	@Before
	public void before() {
		System.out.println("before");
	}

	// 每一个测试方法之后运行
	@After
	public void after() {
		System.out.println("after");
	}

	// 所有测试开始之前运行[因为是这个类被初始化之前运行,所以这个方法是static]
	// 当需要取得一些很耗费时间的资源或者搭载一些很耗费时间的环境时,就会用到BeforeClass,比如:链接数据库
	@BeforeClass
	public static void beforeClass() {
		System.out.println("beforeClass");
	}

	// 所有测试结束之后运行
	// 当需要把这些资源释放掉或环境卸载掉时,就会用到AfterClass,比如:关闭一些数据库链接
	@AfterClass
	public static void afterClass() {
		System.out.println("afterClass");
	}

	@Test
	public void testAdd() {
		int z = new T().add(4, 6);
		assertEquals(10, z);
		assertEquals("结果不等于10", 10, z);
	}

	// 在JUnit测试领域,有一句著名的话:keeps the bar green to keeps the code clean.

	// 忽略该测试方法
	@Ignore
	// 期望代码抛出ArithmeticException异常,并且要在100毫秒内运行完毕
	@Test(expected = java.lang.ArithmeticException.class, timeout = 100)
	public void testDevide() {
		new T().devide(4, 0);
	}
}

 

运行结果:

beforeClass

TTest

before

after

afterClass

 

放弃旧的断言,使用hamcrest断言(这里就要用到assertThat方法,该方法最后一个参数使用hamcrest匹配方法)

示例:

//n是不是大于1并且小于15

assertThat(n, allOf(greaterThan(1), lessThan(15)));

//n是不是大于16或者小于8

assertThat(n, anyOf(greaterThan(16), lessThan(8)));

//n是任何值

assertThat(n, anything());

//n是不是和nExpected相等[equalTo比较两个对象,is比较两个值]

assertThat(n, equalTo(nExpected));

//str是不是test字符串

assertThat(str, is("test"));

//str是不是不是test字符串

assertThat(str, not("test"));

//str是不是包含test字符串

assertThat(str, containsString("test"));

//str是不是以test字符串结尾

assertThat(str, endsWith("test"));

//str是不是以test字符串开头

assertThat(str, startsWith("test"));

//str忽略大小写后是不是和test字符串相等

assertThat(str, equalToIgnoringCase("test"));

//str忽略空格字符后是不是和test字符串相等

assertThat(str, equalToIgnoringWhiteSpace("test"));

//d是不是接近3.0,误差不超过0.3

assertThat(d, closeTo(3.0, 0.3));

//d是不是大于3.0

assertThat(d, greaterThan(3.0));

//d是不是小于3.0

assertThat(d, lessThan (10.0));

//d是不是大于等于3.0

assertThat(d, greaterThanOrEqualTo (5.0));

//d是不是小于等于3.0

assertThat(d, lessThanOrEqualTo (16.0));

//map是不是有test键对应的test

assertThat(map, hasEntry("test", "test"));

//map是不是有test

assertThat(map, hasKey ("test"));

//map是不是有test

assertThat(map, hasValue ("test"));

//list是不是有test这一项

assertThat(list, hasItem ("test"));

具体操作:

引入两个jar包:hamcrest-core-1.3.jarhamcrest-library-1.3.jar

 

package com.junit4.test;

import static org.junit.Assert.*;
import static org.hamcrest.Matchers.*;

import org.junit.Test;

import com.junit4.T;

public class TTest {

	@Test
	public void testAdd(){
		int z = new T().add(4, 6);
		// 这个方法可以代替其他所有的assert*方法
		assertThat("结果不正确", z, is(10));
		assertThat("结果不正确", z, allOf(greaterThan(5), lessThan(20)));
	}
}

 

运行之后出行异常:

java.lang.SecurityException: class "org.hamcrest.Matchers"'s signer information does not match signer information of other classes in the same package

    at java.lang.ClassLoader.checkCerts(ClassLoader.java:776)

    at java.lang.ClassLoader.preDefineClass(ClassLoader.java:488)

    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)

    ……

这个原因是:创建时使用eclipse自带的JUnit jar包和引入的hamcrest jar包使用的不是同一个ClassLoader

解决办法:删掉eclipse自带的JUnit jar包,引入JUnit官方下载的jar

 

ErrorFailures的区别:

Error是程序本身出错,而Failures是测试失败,程序在没有Error的前提下,才能进行Failures测试,比如:int x = 8/0,这个时候就是程序本身出错了,而把代码assertEquals("结果不等于10", 10, z);改成assertEquals("结果不等于9", 9, z);这个时候就是测试失败了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值