本文主要介绍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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。