JUnit4单元测试框架使用
前一段时间老师让真理下有关单元测试的知识,因为我对java相对比较熟悉所以选择了JUnit4,下面是结合一些视频教程和网上一些资料整理的一些相关内容。
一、开发环境
1、开发语言:java
2、单元测试框架:JUnit4
3、工具:eclipse
二、用法
1、介绍
JUnit4是一个Java语言的单元测试框架。Junit4测试是程序员测试,即所谓白盒测试,因为程序员知道被测试的软件如何(How)完成功能和完成什么样(What)的功能。
2、功能
- @Test:将一个普通的方法修饰成为一个测试方法
- @Test(expected=XX.class)
- @Test(timeout=毫秒 )
- @BeforeClass:它会在所有的方法运行前被执行,static修饰
- @AfterClass:它会在所有的方法运行结束后被执行,static修饰
- @Before:会在每一个测试方法被运行前执行一次
- @After:会在每一个测试方法运行后被执行一次
- @Ignore:所修饰的测试方法会被测试运行器忽略
- @RunWith:可以更改测试运行器,可以完成多组值同时测试
3、使用方法
(1)建立Java Project并编写需要测试的功能类
(2)导入JUnit库,在项目右键->Build Path->Add Libraries->选择JUnit并点击next->选择JUnit4 并点击finish
(3)新建一个源代码目录来存放测试的代码
(4)编写测试方法并运行,测试代码上右键->Run As->JUnit Test
(5)根据结果分析代码中的问题
4、运行结果
- Failure一般由单元测试使用的断言方法判断失败所引起的,这经表示测试点发现了问题,也就是说程序输出的结果和预期的不一样
- error是有代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏bug
5、注意事项
- 测试方法上必须使用@Test进行修饰
- 测试方法必须使用public void进行修饰,不能带任何的参数
- 测试类的包应该和被测试类保持一致
- 测试单元中的每个方法必须可以独立测试,测试方法不能有任何依赖
三、代码
1、功能类
public class Calculate {
public int add(int a, int b){
return a+b;
}
public int subtract(int a, int b){
return a-b;
}
public int multiply(int a, int b){
return a*b;
}
public int divide(int a, int b){
return a/b;
}
}
2、测试类
public class CalculateTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
System.out.println("this is beforeClass...");
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
System.out.println("this is afterClass...");
}
@Before
public void setUp() throws Exception {
System.out.println("this is before...");
}
@After
public void tearDown() throws Exception {
System.out.println("this is after");
}
@Test
public void testAdd() {
//第一个参数为预期值,第二个参数为函数的计算结果
assertEquals(12, new Calculate().add(8, 4));
}
@Test
public void testSubtract() {
assertEquals(4, new Calculate().subtract(8, 4));
}
@Test
public void testMultiply() {
assertEquals(32, new Calculate().multiply(8, 4));
}
@Test
public void testDivide() {
assertEquals(2, new Calculate().divide(8, 4));
}
}
3、测试套件入口类
@RunWith(Suite.class)
@Suite.SuiteClasses({TaskTest1.class,TaskTest2.class,TaskTest3.class})
public class SuiteTest {
//测试套件就是组织测试类一起运行的
}
4、更改测试运行器类
@RunWith(Parameterized.class)
public class ParameterTest {
/*
* 1.更改默认的测试运行器为RunWith(Parameterized.class)
* 2.声明变量来存放预期值 和结果值
* 3.声明一个返回值 为Collection的公共静态方法,并使用@Parameters进行修饰
* 4.为测试类声明一个带有参数的公共构造函数,并在其中为之声明变量赋值
*/
int expected =0;
int input1 = 0;
int input2 = 0;
@Parameters
public static Collection<Object[]> t() {
return Arrays.asList(new Object[][]{
{3,1,2},
{4,2,2}
}) ;
}
public ParameterTest(int expected,int input1,int input2) {
this.expected = expected;
this.input1 = input1;
this.input2 = input2;
}
@Test
public void testAdd() {
assertEquals(expected, new Calculate().add(input1, input2));
}
}