,,详解Java单元测试之JUnit篇

,,详解Java单元测试之JUnit篇

本文主要介绍JUnit,它详细解释了Java单元测试。边肖认为这很好。现在分享给大家,给大家一个参考。来和边肖一起看看吧。

单元测试就是写测试代码,要准确快速的保证程序基本模块的正确性。

JUnit是一个Java单元测试框架,默认安装在Eclipse中。

JUnit4

JUnit4通过注释识别测试方法。目前支持的主要注释有:

@BeforeClass global只会执行一次,而且是第一次运行。

@Before在测试方法运行之前运行。

@测试测试方法

@After允许在测试方法运行之后。

@AfterClass global只会执行一次,而且是最后一次运行。

@Ignore忽略此方法

下面基于Eclipse介绍JUnit的基本应用

基本测试

1.创建一个名为JUnitTest的新项目。我们写一个计算器类,是一个可以简单实现加减乘除开方开方的计算器类,然后对这些函数进行单元测试。

公共类计算器{

私有静态int结果;//静态变量,用于存储运行结果

public void add(int n) {

结果=结果n;

}

公共空减(整数){

结果=结果-1;//Bug:正确的应该是结果=结果-n

}

公共空乘(整数){

}//这个方法还没有写

公共空除(整数){

结果=结果/n;

}

公共空广场(int n) {

结果=n * n

}

public void squareRoot(int n) {

for(;) ;//Bug:无限循环

}

Public void clear() {//将结果清零

结果=0;

}

public int getResult(){

返回结果;

}

}

1.将JUnit4单元测试包引入到这个项目中:右键点击项目,点击属性,如图。

在弹出的属性窗口中,首先选择左边的Java Build Path,然后选择右边的Libraries选项卡,再点击右边的Add Library…按钮,如下图所示。

然后在新弹出的对话框中选择JUnit4,并单击OK。如上图所示,JUnit4软件包包含在我们的项目中。

2.生成JUnit测试框架:在Eclipse的Package Explorer中右键单击该类的弹出菜单,选择“新建JUnit测试用例”。如下图所示:

单击Next后,系统会自动列出您的类中包含的方法,并选择您想要测试的方法。在这个例子中,我们只测试四种方法:加法、减法、乘法和除法。

之后系统会自动生成一个新的类CalculatorTest,里面包含一些空的测试用例。您只需要稍微修改这些测试用例就可以使用它们。

完整的CalculatorTest代码如下:

公共类计算器测试{

私有静态计算器Calculator=new Calculator();

@以前

公共void设置()引发异常{

calculator . clear();

}

@测试

公共void testAdd() {

calculator . add(3);

calculator . add(4);

assertEquals(7,calculator . get result());

}

@测试

public void test subtract(){

calculator . add(8);

calculator . subtract(3);

assertEquals(5,calculator . get result());

}

@Ignore('Multiply()尚未实现')

@测试

public void testMultiply() {

fail('尚未实现');

}

@测试

public void testDivide() {

calculator . add(8);

calculator . divide(2);

assertEquals(4,calculator . get result());

}

}

1.运行测试代码:修改上述代码后,右键单击CalculatorTest类并选择“作为JUnit测试运行”来运行我们的测试,如下图所示。

运行结果如下:

进度条为红色,表示发现错误,具体测试结果在进度条上注明“进行了4次测试,其中一次被忽略,一次失败”。

限时测试

对于那些逻辑复杂、深度循环嵌套的程序,很有可能会出现死循环,所以必须采取一些防范措施。限时测试是一个很好的解决方案。我们为这些测试函数设置了一个执行时间。过了这个时间,它们就会被系统强制终止,系统也会向你报告这个功能终止的原因是超时,让你发现这些bug。要实现这个功能,只需要在@Test标签上添加一个参数。代码如下:

@Test(超时=1000)

public void squareRoot() {

calculator . square root(4);

assertEquals(2,calculator . get result());

}

Timeout参数表示以毫秒为单位设置的时间,因此1000代表1秒。

测试异常

JAVA中的异常处理也是一个重点,所以你经常会写一些需要抛出异常的函数。所以,如果你认为一个函数应该抛出异常,但它没有,这是一个Bug吗?这当然是一个Bug,JUnit已经考虑到这一点来帮助我们找到这种Bug。比如我们写的计算器类,有除法功能。如果除数是0,我们必须抛出“除以0异常”。因此,我们有必要对这些进行测试。代码如下:

@Test(应为=ArithmeticException.class)

public void divideByZero(){

calculator . divide(0);

}

如上面的代码所示,我们需要使用@Test标记的expected属性把我们要检查的异常传递给他,这样JUnit框架就可以自动帮助我们检查我们指定的异常是否抛出。

参数化测试

我们可能遇到过这样一个函数,它的参数有很多特殊值,或者它的参数被分成很多区域。

比如测试函数“计算一个数的平方”。暂时可以分为三类:正,0,负。写测试的时候,至少要写三个测试,包括所有三种情况,真的很麻烦。测试代码如下:

公共类高级测试{

私有静态计算器Calculator=new Calculator();

@以前

public void clearCalculator(){

calculator . clear();

}

@测试

public void square1() {

calculator . square(2);

assertEquals(4,calculator . get result());

}

@测试

public void square2(){

calculator . square(0);

assertEquals(0,calculator . get result());

}

@测试

public void square3(){

calculator . square(-3);

assertEquals(9,calculator . get result());

}

}

为了简化类似的测试,JUnit4提出了“参数测试”的概念,只编写一个测试函数,将这些情况作为参数传递,一次性完成测试。代码如下:

@RunWith(Parameterized.class)

公共类SquareTest{

私有静态计算器Calculator=new Calculator();

private int参数;

private int结果;

@参数

公共静态集合数据(){

return Arrays.asList(新对象[][]{

{2, 4},

{0, 0},

{-3, 9},

});

}

//构造函数来初始化变量

public SquareTest(int param,int result){

this.param=param

this.result=result

}

@测试

公共空广场(){

calculator . square(param);

assertEquals(result,calculator . get result());

}

}

测试类执行三次,依次采用数据集中的数据{处理值,预期处理结果}。结果如下:

代码分析如下:

专门为这类测试生成一个新的类,但是不能和其他测试共享同一个类。在这个例子中,我们定义了一个SquareTest类。

为此类指定一个流道,而不是默认流道。语句@RunWith(Parameterized.class)为此类指定了一个ParameterizedRunner。

定义一个要测试的类,定义两个变量,一个存储参数,一个存储预期结果。

定义测试数据集,也就是上面提到的data()方法。这个方法可以任意命名,但是必须用@Parameters注释来修饰。

定义构造函数,其功能是初始化两个先前定义的参数。

这就是本文的全部内容。希望对大家的学习有帮助,支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: