JUnit4单元测试框架使用

时间:2022-06-23 05:08:44

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

JUnit4单元测试框架使用

JUnit4单元测试框架使用

JUnit4单元测试框架使用
(3)新建一个源代码目录来存放测试的代码
(4)编写测试方法并运行,测试代码上右键->Run As->JUnit Test
(5)根据结果分析代码中的问题

4、运行结果

  • Failure一般由单元测试使用的断言方法判断失败所引起的,这经表示测试点发现了问题,也就是说程序输出的结果和预期的不一样
  • error是有代码异常引起的,它可以产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏bug
    JUnit4单元测试框架使用

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));
}
}