测试工作(2.2 -- Junit4)

本文介绍JUnit4.x的基本特性和使用方法,包括注解、测试生命周期管理、测试套件和参数化测试等。通过具体示例展示了如何组织单元测试以确保代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Junit4.x :依靠Java5的新特性“注解”,结合反射。

A. 静态导入 import static org.junit.Assert.*;
类B静态导入A,则B可直接使用A的静态成员,省略类名。
B. @Test 注解。
C. 测试类完全独立,不再继承任何类。


简单示例:
/**
* @author shi
* Junit所有的测试完全是独立的,之间不会相互影响
*/
public class MathDemoTest {

MathDemo demo;

@BeforeClass
public static void beforeClass() {
System.out.println("全部测试开始前调用 。。。仅一次");
}

@AfterClass
public static void afertClass() {
System.out.println("测试全部结束后调用 。。。仅一次");
}

/**
* 每个Test测试前执行
*/
@Before
public void init() {
System.out.println("每个测试start均执行");
demo = new MathDemo();
}

/**
* 每个Test结束后调用
*/
@After
public void destory() {
System.out.println("每个测试end均执行");
}

/**
* 测试
*/
@Test
public void testDiv() {
int expected = 2;
assertEquals(expected, demo.division(4, 2));
}



/**
* 测试异常,期望设置的异常
*/
@Test(expected=ArithmeticException.class)
public void testDivision() {
assertEquals(1, demo.division(2, 0));
}

/**
* 测试执行时间,若大于这个时间则失败,单位是毫秒
*/
@Test(timeout=1)
public void testTime() {
assertEquals(2, demo.division(4, 2));
}

@Test
@Ignore
public void testIgnor() {
//忽略测试
System.out.println("忽略测试");
}

}



关键:
1、Junit最佳实践:
A.源代码与测试代码,存放于不同的源码包。
B.测试任何可能的错误。单元测试不是用来证明您是对的,而是为了证明您没有错。

2、测试运行器?Junit4默认的测试运行器?使用@RunWith(RunnerClassName extends <Runner>),指定具体的测试运行器,同样可以自己实现测试运行器。

3、测试套件(suite) :分层管理不同模块的单元测试代码。
@RunWith(Suite.class)
@SuiteClasses({MathDemoTest.class}) //参数为测试类组成的数组
public class TestSuite {}

4、参数化测试
为准备使用参数化测试的测试类指定特殊的运行器 org.junit.runners.Parameterized。
为测试类声明两个变量,分别用于存放期望值expected和测试所用数据target。
为测试类构造测试数据,声明一个使用注解 org.junit.runners.Parameterized.Parameters 修饰的,返回值为java.util.Collection 的公共静态方法,并在此方法中初始化所有需要测试的参数对。
为测试类声明一个带有参数的公共构造函数,参数为expected与target。
编写测试方法,使用定义的变量expected与target作为参数进行测试。



package demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class WordDealUtil {

public String wordFormatForDB(String name) {

Pattern p = Pattern.compile("[A-Z]");
Matcher m = p.matcher(name);
StringBuffer sb = new StringBuffer();

while (m.find()) {
m.appendReplacement(sb, "_" + m.group());
}
return m.appendTail(sb).toString().toLowerCase();
}

}


package demo;

import java.util.Arrays;
import java.util.Collection;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;

import static org.junit.Assert.*;

@RunWith(Parameterized.class)
public class WordDealUtilTest {

private WordDealUtil wordUtil;

private String expected;
private String target;



@Before
public void initMethod() {
wordUtil = new WordDealUtil();
}

/*
* 定义测试数据
*/
@Parameters
public static Collection words() {
return Arrays.asList(new Object[][] {
{ "employee_info", "employeeInfo" }, // 测试一般的处理情况
{ null, null }, // 测试 null 时的处理情况
{ "", "" }, // 测试空字符串时的处理情况
{ "employee_info", "EmployeeInfo" }, // 测试当首字母大写时的情况
{ "employee_info_a", "employeeInfoA" }, // 测试当尾字母为大写时的情况
{ "employee_a_info", "employeeAInfo" } // 测试多个相连字母大写时的情况
});
}

/**
* 参数化测试必须的构造函数
* @param expected 期望的测试结果,对应参数集中的第一个参数
* @param target 测试数据,对应参数集中的第二个参数
*/
public WordDealUtilTest(String expected , String target){
this.expected = expected;
this.target = target;
}


/**
* 测试将 Java 对象名称到数据库名称的转换
*/
@Test
public void wordFormatForDB(){
assertEquals(expected, wordUtil.wordFormatForDB(target));
}


}



参考 :http://www.uml.org.cn/j2ee/200703132.asp(推荐阅读)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值