log4j包的使用
junit是一个非常常用的java单元测试框架.
一.导入junit包,搭建junit测试环境
现在版本的eclipse或者myeclipse都静静内置了junit工具包。常用的方法三种:
- 比如在需要单元测试的方法上,可以直接 写上
@Test
然后使用ctrl+/
代码补全,这个时候eclipse回自动 import junit包. - 如果导包失败,可以在项目上右键 / build path / add libares,然后选择junit包.接着可以执行1中操作
- 如果
add library
中没有junit包,这个时候就需要自己导入,可以下载相应版本的junit,在java project的根目录录下,见lib包,将下载的junit包粘贴到lib包下面,选中粘贴进来的junit包,右键,build path->add to build path,在执行上面的操作
注意了:平时自己为了编写程序方便,一般只有满足junit的使用条件就在编写的方法上面随便@test,这个样子可以不用写
main
方法,很是快捷.但团队协作中注意使用的规范,见下文.
二.编写测试类规范 注意事项
- 一般一个目标类对应一个测试类.
- 测试类与被测试类最好是放在同一个保重,可以放在不同的源文件中.
- 测试类的名字为被测试类的名字加上Test后缀,比如目标类是
Animal
,对应测试类可以命名为AnimalTest
三.编写测试方法规范 注意事项
- 一般一个方法对应一个单元测试方法.
- 测试方法的名字为test做前缀,后面紧跟目标方法的方法名,比如有一个方法是
bubbleSort()
,对应的测试方法应当是testBubbleSort()
,一目连然,顾名思义. - 单元测试方法上面要加上
@Teset
注解(或者@org.junit.Test
),具体而言就应当向下面这样:
@Test
public void testBubbleSort(int[] arr])
{
}
- 单元测试方法
不能有参数,也不能有返回值(必须是void型的)测试的方法不能是静态的
四.测试方法的基本使用
junit最终的目的是执行测试方法,测试目标类有没有问题
- 可以单独执行一个测试方法;也可以在package树中,选中一个工程/或者工程中的某一个包/或者某个包中的某个类,然后右键,
run as junit
- 执行完后,现实绿色则表示执行成功,显示红色则表示测试失败(抛出异常后会显示测试失败)
比不看一段例子,我们要测试Tool类
Tool类
public class Demo1 {
@Test //注解
public void getMax(int a, int b){
/* int a = 3;
int b = 5 ;*/
int max = a>b?a:b;
System.out.println("最大值:"+max);
}
@Test
public void sort(){
int[] arr = {12,4,1,19};
for(int i = 0 ; i < arr.length-1 ; i++){
for(int j = i+1 ; j<arr.length ; j++){
if(arr[i]>arr[j]){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
System.out.println("数组的元素:"+Arrays.toString(arr));
}
对应的测试类ToolTest
public class ToolTest {
@Test
public void testGetMax(){
int max = Tool.getMax();
if(max!=5){
throw new RuntimeException();
}else{
System.out.println("最大值:"+ max);
}
}
@Test
public void testGetMin(){
int min = Tool.getMin();
if(min!=3){
throw new RuntimeException();
}else{
System.out.println("最小值:"+ min);
}
}
}
junit中经常被使用到的类
Assert断言工具类
断言,顾名思义就是用来判断的,通常我们测试的时候是观察打印到控制台的程序是不是和我们的预期相符,这个时候我们可以使用Assert.assertXXX(),只需要观察测试后是红条还是绿条
assertTrue(...) 参数的值应是true
assertFalse(...) 参数的值应是false
assertNull(...) 应是null值
assertNotNull(...) 应是非null的值
assertSame(...) 使用==比较的结果为 true(表示同一个对象)
AssertNotSame(...) 使用==比较的结果为false
assertEquals(...) 两个对象equals()方法比较结果为true
比如上面的例子:
@Test
public void testGetMax(){
int max = Tool.getMax();
if(max!=5){
throw new RuntimeException();
}else{
System.out.println("最大值:"+ max);
}
}
我们必须观察控制台输出的结果是不是我们想要的,如果使用断言的话,课把代码写成下面的样子:
@Test
public void testGetMax(){
int max = Tool.getMax();
Assert.assertSame(5, max);
}
如果max==5,执行测试之后是绿条,否则是红条,使用起来相当方便.
用于准备环境/清理环境的方法
@Test
表示单元测试方法。
@Before
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之前都执行一次。
@After
所修饰的方法应是非static的(且没有参数,返回值为void)。
表示这个方法会在本类中的每个单元测试方法之后都执行一次。
@BeforeClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之前执行,只执行一次。
@AfterClass
所修饰的方法应是static的(且没有参数,返回值为void)。
表示这个方法会在本类中的所有单元测试方法之后执行,只执行一次。
比如现在要测试一个读文件的方法readFile(),然后sort()方法调用readFile()方法,对读取出来的数据排序.测试readFile()方法的时候,我们要确保硬盘上已经准备好了要都去的文件,否则会报错,如果手动操作的话,要先创建好文件,测试完成后在手动的删除,这样比较麻烦,我们可以把上面的这些过程交给junit自动完成。于是就可以如下:
public class Demo1 {
// @Before
@BeforeClass //**注意 修饰的方法必须是static**
public static void beforeRead()
{
System.out.println("已经准备好测试环境,提前创建了xxx.dat文件。。。");
}
@Test
public void readFile()
{
System.out.println("从硬盘读取数据成功。。。");
}
@Test
public void sort()
{
System.out.println("读取数据到内存之后,排序。。。");
}
// @After
@AfterClass //**注意 修饰的方法必须是static**
public static void afterRead()
{
System.out.println("撤销测试环境,删除了xx.dat文件...");
}
}