一、Junit概述
1. Junti简介
JUnit是一个回归测试框架,用于Java开发人员编写单元测试之用。现在开源测试工具,很多都是对于JUnit的扩展。
JUnit目前主要有3.8与4.0两个版本,区别比较大,为编写单元测试提供了主要的接口。目前主流的IDE都提供了对于JUnit的支持。
2. 使用junit注意事项
测试的方法返回值必须是void。
标准的命名规则是test+方法名。
不能有参数。
3. 如何测试
明确需求。
知道输入什么,知道出现什么结果。
知道输入什么,知道不该出现什么结果。
4. Junti类管理
一般我们的测试类放在项目test文件夹。
测试包名可以和项目被测类所使用的包名一样。
测试类的取名一般为测试类名+Test。
5. 编写测试代码的技巧
测试方法的执行顺序是不确定的。
不要用TestCase的构造函数初始化Fixture,而要用setUp()和tearDown()方法。
当继承一个测试类时,记得调用父类的setUp()和tearDown()方法。
测试类和测试方法应该有一致的命名方案。
测试要尽可能地小,执行速度快。
二、Junit的使用
1. JUnit3的单元测试
测试类需要继承TestCase。
测试方法必须用test开头,不能包含返回值,不能包括参数。
使用setUp()方法进行初始化环境。每一个测试用例都会执行该方法。
使用teardown()方法清理测试环境,如可以进行数据库还原恢复等操作。每一个测试用例都会执行该方法。
下面使用具体示例了解Junit3的单元测试实现。
被测试类:
public class Calculator {
public int add(int num1,int num2){
return num1 + num2;
}
}
Junit3单元测试实现:
import junit.framework.TestCase;
import static org.junit.Assert.*;
public class CalculatorTest extends TestCase{
public void setUp() throws Exception {
}
public void tearDown() throws Exception {
}
public void testAdd() {
int num1 = 1;
int num2 = 2;
Calculator obj = new Calculator();
int expResult = 3;
int result = obj.add(num1, num1);
assertEquals(expResult, result);
}
}
2. JUnit4的测试
可以不继承TestCase类。
测试方法名可以和被测试的名称一样,需要在方法名上加上@Test标签注解。
初始化测试环境:随便写一个方法,如:initData(){},加上@Before标签注解。
清理测试环境:随便写一个方法,如:clearData(){},加上@After标签注解。
注意:@Before和@After注释的方法只能各有一个。这个取代了JUnit以前版本中的setUp和tearDown方法。
Junit4单元测试实现:
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;
public class CalculatorTest{
@Before
public void initData() throws Exception {
}
@After
public void clearData() throws Exception {
}
@Test
public void testAdd() {
int num1 = 1;
int num2 = 2;
Calculator cal = new Calculator();
int expResult = 3;
int result = cal.add(num1, num1);
assertEquals(expResult, result);
}
}
三、Junit4元数据
@Before:使用了该元数据的方法在每个测试方法执行之前都要执行一次。
@After:使用了该元数据的方法在每个测试方法执行之后要执行一次。
@Test(expected=*.class)在JUnit4.0之前,对错误的测试,我们只能通过fail来产生一个错误,并在try块里面assertTrue(true)来测试。现在,通过@Test元数据中的expected属性。expected属性的值是一个异常的类型。
@Test(timeout=xxx):该元数据传入了一个时间(毫秒)给测试方法,
如果测试方法在制定的时间之内没有运行完,则测试也失败。
@ignore:该元数据标记的测试方法在测试中会被忽略。当测试的方法还没有实现,或者测试的方法已经过时,或者在某种条件下才能测试该方法(比如需要一个数据库联接,而在本地测试的时候,数据库并没有连接),那么使用该标签来标示这个方法。同时,你可以为该标签传递一个String的参数,来表明为什么会忽略这个测试方法。比如:@lgnore(“该方法还没有实现”),在执行的时候,仅会报告该方法没有实现,而不会运行测试方法。
四、组装一个测试套件并运行
1. Junit3中创建测试套件示例
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* JUnit3.8中批量运行所有的测试类。。直接在该类上Run As JUnit Test即可
* @see 这里就用到了设计模式中典型的组合模式,即将不同的东西组合起来
* @see 组合之后的东西,即可以包含本身,又可以包含组成它的某一部分
* @see TestSuite本身是由TestCase来组成的,那么TestSuite里面就可以包含TestCase
* @see 同时TestSuite里面还可以继续包含TestSuite,形成一种递归的关系
* @see 这里就体现出来了,所以这是一种非常非常好的设计模式,一种好的策略
*/
public class TestAll extends TestCase {
//方法名固定的,必须为public static Test suite()
public static Test suite() {
//TestSuite类实现了Test接口
TestSuite suite = new TestSuite();
//这里传递的是测试类的Class对象。该方法还可以接收TestSuite类型对象
suite.addTestSuite(CalculatorTest.class);
suite.addTestSuite(MyStackTest.class);
return suite;
}
}
2.Junit4中创建测试套件
JUnit4中测试套件的创建步骤:
① 创建一个空类作为测试套件的入口
② 使用org.junit.runner.RunWith 和org.junit.runners.Suite.SuiteClasses注解 修饰该空类
③ 将org.junit.runners.Suite 作为参数传入RunWith注解,即使用套件运行器执行此类
④ 将需要放入此测试套件的测试类组成数组,作为SuiteClasses注解的参数
⑤ 保证这个空类使用public 修饰,而且存在公开的不带有任何参数的构造函数
Junit4中创建测试套件示例:
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
/**
* JUnit4.x测试套件的举例
* @see 下面的CalculatorTest.class和ParameterTest.class均为我们自己编写的JUnit4单元测试类
*/
@RunWith(Suite.class)
@SuiteClasses({CalculatorTest.class,MyStackTest.class})
public class TestAll {
}
部分资料来源:http://blog.csdn.net/everwhl/article/details/8891585