一.什么是Junit
Junit是一个开源的Java测试框架,用于编写和运行重复的使用的测试用例,它是由<<设计模式:可复用面向对象软件的基础>的>作者Erich Gamma和Kent Beck开发的。
二.Junit中重要的概念和类:
(1)TestCase
当一个类继承自TestCase,即成为一个测试类,它包含有testXXXX形式的测试方法。
(2)TestSuit
将相关的测试归入一组,将多个测试方法归入一个test suit。如果没有编写test Suit的话,系统会默认为每个test case生成一个test Suite。
(3)Test Runner
用于执行TestSuit。
(4)TestResult
用用包含测试中发生的错误,次数等。
(5)Assert
用于检测条件是否成立。
常见有如下几个:
断言方法 | 说明 |
assertTrue/False | 判断条件是true还是false |
assertEquals() | 判断是否相等 |
assertNotNull()/Null() | 判断对象是否为空 |
assertSame()/NotSame() | 判断两个对象是否指向同一个对象 |
fail() | 失败 |
failNotSame/failNotEquals | 当不指向同一个内存地址或者不相等的时候,输出错误信息 |
三.编写测试用例的流程:
(1)创建继承自TestCase类的测试类
(2)编写测试方法一般都是固定模式public void testXXXX();
(3)创建testSuit并将(1)中编写的TestCase添加到testsuit;
(4)运行TestRunner对TestSuit进行测试。
这里要介绍两个有用的方法:
setup()/tearDown()
setup:在每次执行测试方法之前,该方法都会被执行,通常在这里进行一些固定的工作
tearDown():每次测试方法执行结束的时候,这个方法都会被执行一次,通常在这里执行一些收尾工作。
四.Junit3 与Junit4的区别,及Junit4新特性
Junit 3 | Junit 4 |
必须引入junit.framework.TestCase | 必须引入 import static org.junit.Assert.*; import org.junit.Test; |
必须继承TestCase | 不需继承TestCase |
测试方法必须使用test开头 | 不需要但是必须加上@test注释,但是返回值必须是void类型,并且不能带参数。 还可以使用@Test(timeout=100)给测试函数设定一个执行时间,超过了这个时间,它们就会被系统强行终止,并且系统还会汇报该函数结束的原因是因为超时。 使用@Test(excepted=IllegalArgumentException.class)测试期望的异常,如果没有发现异常或者抛出的异常不是期望的就测试失败。 |
setUp名字不能变(覆盖父类的方法) | 使用@Before,方法名称随意 |
tearDown名称不能变 | 使用@After:方法名可变 |
Junit新增加特性:
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("BeforeClass");
}
//在所有测试方法包括Before之前执行,只执行一次
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("tearDownAfterClass");
}
//在所有测试方法包括After之后执行,只执行一次
综上所述Junit4的单元测试用例执行顺序为
@BeforeClass->@Before->@Test方法1->@After->@Before->@Test方法2->@After—>@AfterClass
Junit4没有设置Test Suit,它使用@RunWith以及@SuitClasses来替代。
如下所示:
package com.example.ForTestClass.junit;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;
JUnit 中所有的测试方法都是由运行器负责执行的。 JUnit 为单元测试
提供了默认的测试运行器,但 JUnit并不一定需要使用 默认的运行器。我们不仅可以通过继承org.junit.runner.Runner定制自己
运行器并且还可以为每一个测试类指定使用某个具体的运行器。制定方法如下:
在实际项目中往往单元测试类会很多, JUnit 提供了一种批量运行测试
类的方法,叫做测试套件。也就是上面所说的Test Suit。这样每次需要验证系统功能正确性时,只执行一个或几个测试套件便可以了。
@SuiteClasses({ ClassForTestTest.class, ClassForTestTests.class })添加测试类
public class AllTests {
}
@Ignore用于暂时忽略某个测试方法,因为有时候由于测试环境受限,并不能
保证每一个测试方法都能正确运行。
@Ignore("Multiply() Not yet implemented")
@Test
public final void test() {
}
参数化测试:
在测试的时候会遇到一种情况就是需要模拟不同的参数对方法进行测试,但是为不同的参数创建一个测试方法是不大现实的,这时候可以使用参数化测试机制来解决这个问题。
如下例子所示
@RunWith(Parameterized.class)
public class CalculateTest2 {
Calculate calculate;
private int input1;
private int input2;
private int expected;
@Parameters
public static Collection prepareData() {
Object[][] object = { { -1, -2, -3 }, { 0, 2, 2 }, { -1, 1, 0 },
{ 1, 2, 3 } };
return Arrays.asList(object);
}
public CalculateTest2(int input1, int input2, int expected) {
this.input1 = input1;
this.input2 = input2;
this.expected = expected;
}
@Before
public void setUp() throws Exception {
calculate = new Calculate();
}
@Test
public void testAdd() {
int result = calculate.add(input1, input2);
assertEquals(expected, result);
}
}
五.Eclipse下使用Junit4
下面就以eclipse下的Junit 4为例说明如何使用Junit进行测试:
创建一个项目,编写待测试的类ClassForTest如下图所示:
ClassForTest.java的源码如下所示:
package com.example.ForTestClass;
public class ClassForTest {
public int add(int a,int b){
return a+b;
}
public double divide(int a,int b){
return a/b;
}
}
选中ClassForTest.java右击New –>Others出现下面的对话框选中Junit Test Cass

出现上面的界面后点击next,
选中待测试的方法:
点击Next,提示是否将Junit添加到编译路径?点击OK。它将自动产生如下代码:
选中ClassForTestTest.java右击选中new—>Junit Test Suit出现如下界面:
点击next选中要添加到TestSuit中的类:
点击finish
选中刚刚创建的Test Suit右击run As Junit Test 查看结果:
六.一些编写规范
(1)测试代码应单独位于一个Source Folder下一般命名为test,并且在该Source Folder下所处的包名最好与待测试类同名。
(2)测试方法名格式test+待测试方法名+简要描述(可选)
(3)测试类名格式待测试类名+Test
(4)多使用一些带消息的标签,这样可以定位出错误的原因
assertEquals("ClassForTestTestss测试出错"+result+":"+expect, result, expect);
七.推荐材料:
Junit4 文档
http://tool.oschina.net/apidocs/apidoc?api=junit-4.10
Open文档网站下的资源:
http://www.open-open.com/doc/list/194