一.测试环境
-
使用junit4.x:
junit4.x基于Java5开始的版本,支持注解. -
步骤:
-
把junit4.x的测试jar,添加到该项目中来;
-
定义一个测试类.
测试类的名字: XxxTest XXX表示测试的功能名字. -
在EmployeeDAOTest中编写测试方法:如
@Test public void testXxx() throws Exception { }
注意:方法是public修饰的,没有参数,无返回的,该方法上必须贴有@Test标签,Xxx表示测试的功能名字.
-
选择某一个测试方法,鼠标右键选择 [run as junit],或则选中测试类,表示测试该类中所有的测试方法.
以后单元测试使用最多的方式:
若要在测试方法之前做准备操作:
EmployeeDAOTest随意定义一个方法并使用@Before标注:``` @Before public void xx() throws Exception方法 ```
若要在测试方法之后做回收操作:
EmployeeDAOTest随意定义一个方法并使用@After标注:``` @After public void xx() throws Exception方法 ```
特点:每次执行测试方法之前都会执行Before方法,每次执行测试方法之后都会执行After方法;
初始化一次,和最终销毁一次
只能修饰静态方法
-
@BeforeClass标签:在所有的Before方法之前执行,只在最初执行一次.
只能修饰静态方法
@AfterClass标签:在所有的After方法之后执行,只在最后执行一次.
执行顺序: BeforeClass->(Before->Test-After多个测试方法)-->AfterClass
新建类EmployeeDAOTest
//模拟Junit4 单元测试
public class EmployeeDAOTest {
/**
1)必须为public
2)必须为void
3)必须无参
4)XxxClass必须静态
*/
/*@Test
private int testName(int i) throws Exception {
System.out.println();
return 0;
}*/
@BeforeClass
public static void staticInit() {
System.out.println("静态初始化");
}
@Before
public void testInit() {
System.out.println("初始化");
}
@Test
public void testSave() {
System.out.println("单元测试保存...");
}
@Test
public void testDelete() throws Exception {
System.out.println("单元测试删除...");
}
@After
public void testRecover() {
System.out.println("回收资源...");
System.out.println("----------------");
}
@AfterClass
public static void staticRecover() {
System.out.println("静态回收资源...");
}
}
二.断言
-
断言有:期望值,真实值,当真实值和期望值相同则断言成功,否则失败
-
步骤(基于接口测试):
- 写一个接口 --> IMath
- 写一个测试类测试接口中的方法 --> MathTest
- 写一个实现类实现接口
- 测试该接口的实现(解释依赖关系)
① :Assert.assertEquals(message, expected, actual):比较的值
三个参数:
message: 断言失败的提示信息,断言成功不会显示.
expected: 期望值
actual: 真实值
若真实值和期望值想等,则断言成功.--->绿条
②:Assert.assertSame(message, expected, actual):比较地址,是同一个对象
Assert.assertNotSame(message, expected, actual):断言不是同一个对象
③:Assert.assertTrue(message, condition):断言condition应该为TRUE.
④:Assert.assertFalse(message, condition):断言condition应该为FALSE.
⑤:Assert.assertNull(message, object):断言对象object为null.
⑥:Assert.assertNotNull(message, object):断言对象object不为null.
⑦:@Test(expected=ArithmeticException.class)
期望该方法报错,报错ArithmeticException.
⑧:@Test(timeout=400)
期望该方法在400毫秒之内执行完成.
新建接口IMath
//接口
public interface IMath {
/**
* 求积方法
*
* 返回类型:int
* 参数a:加数
* 参数b:加数
*/
public int add(int a, int b);
/**
* 求商方法
*
* 返回类型:int
* 参数a:被除数
* 参数b:除数
*/
public int divi(int a, int b);
}
新建类MathImpl
public class MathImpl implements IMath {
@Override
public int add(int a, int b) {
return a + b;
}
@Override
public int divi(int a, int b) {
return a / b;
}
}
新建类MathTest
public class MathTest {
private final MathImpl math = new MathImpl();
@Test
public void testAdd() {
int ret = math.add(2, 3);
/**
* message: 断言失败的提示信息,断言成功不会显示.
* expected: 期望值
* actual: 真实值
*/
Assert.assertEquals("断言失败", 5, ret);
}
@Test
public void testDivi() {
int ret = math.divi(10, 2);
Assert.assertEquals("断言失败", 5,ret);
}
//期望该方法报错,报错ArithmeticException.
@Test(expected=ArithmeticException.class)
public void testException() throws Exception {
math.divi(10, 0);
}
//期望该方法在400毫秒之内执行完成.
@Test(timeout=10)
public void testTime() throws Exception {
Thread.sleep(100);
}
}