单元测试属于白盒测试。
JUnit3.x是针对于Java5之前的版本,没有注解,需要按照规范来写测试。JUnit4.x是针对于Java5以及之后的版本,使用注解。
一、使用junit3.x的步骤:
- 在项目中添加junit3.x的测试jar:项目-->Build Path-->Add Libraries...;
- 定义一个测试类,并让该测试类继承于TestCase类,测试类命名:XxxTest;
- 在XxxTest中编写测试方法,如: public void testXxx() throws Exception{ }。注意:方法是public修饰的,无返回的,必须以test作为方法的前缀,Xxx表示测试的功能名字;
- 选择某一个测试方法运行run as junit。
- 若在测试前进行初始化要覆写TestCase的protected void setUp() throws Exception{ }方法;
- 若在测试后进行销毁要覆写TestCase的protected void tearDown() throws Exception{ }方法;
执行顺序:setUp-->测试方法-->tearDown-->setUp-->测试方法2-->tearDown-->...
测试举例:
//EmployeeDAOTest组件的测试类
public class EmployeeDAOTest extends TestCase{
//初始化操作
protected void setUp() throws Exception{
System.out.println("初始化");
}
//销毁
protected void tearDown() throws Exception{
System.out.println("销毁");
}
//测试员工的保存操作
public void testSave() throws Exception{
System.out.println("员工保存");
}
//测试员工的删除操作
public void testDelete() throws Exception{
System.out.println("员工删除");
}
}
运行结果:初始化
员工保存
销毁
初始化
员工删除
销毁
二、使用junit4.x的步骤:
- 在项目中添加junit4.x的测试jar:项目-->Build Path-->Add Libraries...;
- 定义一个测试类(不用继TestCase类),测试类名字:XxxTest;
- 在XxxTest中编写测试方法:
@Test
public void testXxx() throws Exception{ } 注意:方法是public修饰的,无返回的,必须有@Test标签,Xxx表示测试的功能名;
- 选择某一个测试方法运行run as junit。
- 若在测试前进行初始化要定义一个方法,并贴上@Before标签;
- 若在测试前进行销毁要要定义一个方法,并贴上@After标签;
- @BeforeClass:在所有的Befoer之前,只在最开始执行一次,方法必须用static修饰;
- @AfterClass:在所有的After之后,只在最后执行一次,方法必须用static修饰。
测试举例:
public class EmployeeDAOTest {
@BeforeClass
public static void init1() throws Exception {
System.out.println("初始化1");
}
@AfterClass
public static void destroy1() throws Exception {
System.out.println("销毁1");
}
@Before
public void init() throws Exception {
System.out.println("初始化");
}
@After
public void destroy() throws Exception {
System.out.println("销毁");
}
@Test
public void testSave() throws Exception {
System.out.println("员工保存");
}
@Test
public void testDelete() throws Exception {
System.out.println("员工删除");
}
}
运行结果:初始化1
初始化
员工保存
销毁
初始化
员工删除
销毁
销毁1
三、使用断言做测试
期望值:断言时希望是多少;
真实值:程序内部运算之后实际是多少;
断言成功:期望值和真实值相同,显示绿条;
断言失败:期望值和真实值不同,显示红条。
(不使用断言,红条和绿条没什么大的意义)
断言 | 功能 | ||||||
Assert.assertEquals(message, excepted, actual) | 比较的值
|
||||||
Assert.assertSame(message, excepted, actual) |
比较地址,断言是同一个对象 |
||||||
Assert.assertNotSame(message, excepted, actual) | 比较地址,断言不是同一个对象 | ||||||
Assert.assertTrue(message,condition) | 断言condition应该为TRUE | ||||||
Assert.assertFalse(message,condition) | 断言condition应该为FALSE | ||||||
Assert.assertNull(message,Object) | 断言对象为null | ||||||
Assert.assertNotNull(message,Object) | 断言对象为不为null | ||||||
@Test(excepted=ArithmeticException.class) | 断言该方法报错:ArithmeticException | ||||||
@Test(timeout = 400) | 期望该方法在400毫秒之内执行完成 |
代码示例:
//Math测试类
public class MathTest {
// 依赖关系:表明要测试的对象是谁
private IMath math = new MathImpl();
@Test
public void testAdd() {
int ret = math.add(1, 2);
// 使用断言方式
Assert.assertEquals("结果错误", 4, ret);
}
@Test
public void testDivide() {
int ret = math.divide(12, 3);
Assert.assertEquals(4, ret);
}
}