JUnit4及其在IDEA中的使用

时间:2022-11-15 05:07:25

在idea中使用JUnit

一、环境配置      使用idea IDE 进行单元测试,首先需要安装JUnit 插件。

1.安装JUnit插件步骤               File-->settings-->Plguins-->Browse repositories-->输入JUnit-->选择JUnit Generator V2.0安装。           2.使用JUnit插件              在需要进行单元测试的类中,使用快捷键alt+insert,选择JUnit test,选择JUnit4。
3. 配置生成的test类位置
Output Path: ${SOURCEPATH}/[target directory]/${PACKAGE--你待测试类的包名}/${FILENAME}JUnit4及其在IDEA中的使用

点击JUnit4,可以编辑模板

package test.$entry.packageName; -----可以更改生成的测试类的包名

更改默认包含的测试函数


用JUnit4进行单元测试

idea 中自动import 所需包
import org.junit.Test; 
import org.junit.Before;
import org.junit.After;
在 JUnit4 中,测试是由 @Test 注释来识别的,测试类使用Test做为类名的后缀(非必要),测试方法使用test作为方法名的前缀(非必要)。测试方法必须使用public void 进行修饰,不能带有任何参数。测试类的包应该与被测试类的包保持一致。

JUnit4允许我们使用 @Before和@After来注释多个方法(替代JUnit3的setUp() 和tearDown() 方法),这些方法在每个测试方法执行前和执行后都要运行一次,完成初始化字段或准备数据和清除工作。

public class UnitAddTest {

@Before
public void before() throws Exception {
System.out.println("Start:");
}

@Before
public void before2() throws Exception {
System.out.println("Start2:");
}

@After
public void after() throws Exception {
System.out.println("Over!");
}

/**
*
* Method: add(int i, int j)
*
*/
@Test
public void testAdd() throws Exception {
//TODO: Test goes here...
UnitAdd test = new UnitAdd();
int c =test.add(1,2);
org.junit.Assert.assertEquals(3,c,0);

}

测试结果:
Passed

Start2:
Start:
Over!

结果分析:
Passed说明没有错误
Failure 一般是单元测试使用的断言方法判断失败引起,说明预期结果和程序运行结果不一致。
error 是有代码异常引起的,他产生于测试代码本身中的Bug。


其他常用注解:

1. @BeforeClass 和@AfterClass

JUnit4引入了一个JUnit3中没有的新特性——类范围的 setUp() 和tearDown() 方法。任何用 @BeforeClass 注释的方法都将在该类中的测试方法运行之前刚好运行一次,而任何用 @AfterClass 注释的方法都将在该类中的所有测试都运行之后刚好运行一次。

@BeforeClass所修饰的方法在所有方法加载前执行,而且他是静态的在类加载后就会执行该方法,在内存中只有一份实例,适合用来加载配置文件。 @AfterClass所修饰的方法在所有方法执行完毕之后执行,通常用来进行资源清理,例如关闭数据库连接。
所以一个Junit 4 的单元测试用例执行顺序为:@BeforeClass –> @Before –> @Test –> @After –> @AfterClass;每一个测试方法的调用顺序为:@Before –> @Test –> @After。
注意:
@BeforeClass和@AfterClass对于所有测试方法只运行一次,而@Before和@After是每个测试方法都运行一次。多个before和after的执行顺序是不定的
@BeforeClass和@AfterClass必须声明为public static,所有标识为@AfterClass的方法都一定会被执行,即使在标识为@BeforeClass的方法抛出异常的的情况下也一样会。而@Before和@After必须声明为public 并且非static。所有标识为@After 的方法都一定会被执行,即使在标识为 @Before 或者 @Test 的方法抛出异常的的情况下也一样会。

2.@Ignore:忽略的测试方法,标注的含义就是“某些方法尚未完成,暂不参与此次测试”;这样的话测试结果就会提示你有几个测试被忽略,而不是失败。一旦你完成了相应函数,只需要把@Ignore标注删去,就可以进行正常的测试。

3.@Test(timeout=毫秒) 允许程序运行的时间。

4.@Test(excepted=XX.class) 在运行时忽略某个异常。

5.参数化设置:需要测试的仅仅是测试数据,代码结构是不变的,只需要更改测试数据。用法如下:

在单元测试类前注解:@RunWith(Parameterized.class),然后构造需参数化的构造器。写个函数用于输入需要测试的参数和期待结果,并在该函数前面注解@Parameters


@RunWith(Parameterized.class)
public class UnitAddTest {
int expected = 0;
int input1 = 0;
int input2 = 0;
/**
* 参数化测试必须的构造函数
* @param expected 期望的测试结果,对应参数集中的第一个参数
* @param input1 测试数据,对应参数集中的第二个参数
* @param input2 测试数据,对应参数集中的第三个参数
*/
public UnitAddTest(int expected,int input1,int input2){
System.out.println("Constructor Method with Parameters!");
System.out.println();
this.expected = expected;
this.input1=input1;
this.input2 = input2;
}
@Before
public void before1() throws Exception {
System.out.println("Start1:");
}

@Before
public void before2() throws Exception {
System.out.println("Start2:");
}

@After
public void after() throws Exception {
System.out.println("Over!");
}

@Parameters
public static Collection input(){
System.out.println("Initialize Data!");
return Arrays.asList(new Object[][]{
{4,3,1},
{6,2,5}
});
}
/**
* Method: add(int i, int j)
*/
@Test
public void testAdd() throws Exception {
UnitAdd test = new UnitAdd();
Assert.assertEquals(expected,test.add(input1,input2));
}
}

这个例子中故意在第二组数据中写错结果,跑程序之后就会显示第一粗测试通过,第二组失败,即上面写道的failed,表示执行结果与期待结果不等。


4 常用的断言介绍(参考博客 http://blog.csdn.net/afeilxc/article/details/6218908 )

 4.1 、assertEquals([String message],Object target,Object result)

target与result不相等,中断测试方法,输出message

assertNull   断言对象为null,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

assertEquals(a, b) 测试a是否等于b(a和b是原始类型数值(primitive value)或者必须为实现比较而具有equal方法)

assertEquals

断言两个对象相等,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

例如计算器加法功能的测试可以使用一下验证:

Assert.assertEquals(0,result);

4.2  assertTrue/False([String message],Boolean result)

Result为 false/true,中断测试方法,输出message

assertTrue

断言条件为真,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

assertFalse(a) 测试a是否为false(假),a是一个Boolean数值。

assertFalse

断言条件为假,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

4.3  assertNotNull/Null([String message],Obejct result

Retult= = null/result!=null,中断测试方法,输出message

assertNotNull(a) 测试a是否非空,a是一个对象或者null。

assertNotNull 断言对象不为null,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

4.4  assertSame/NotSame(Object target,Object result)

Traget与result 不指向/指向 同一内存地址(实例),中断测试方法,输出message

assertNotSame(a, b) 测试a和b是否没有都引用同一个对象。

assertNotSame

断言两个引用指向不同对象,若不满足,方法抛出带有相应信息的AssertionFailedError异常。

assertSame 断言两个引用指向同一个对象,若不满足,方法抛出带有相应信息AssertionFailedError异常。

4.5  fail([String message])

中断测试方法,输出message

Fail  让测试失败,并给出指定信息。