JUnit单元测试——学习、试验记录,参数化、套件

本文介绍了如何使用JUnit进行参数化测试,通过读取Excel数据进行批量测试,并展示了创建测试套件以批量运行多个测试类的方法。同时,文章探讨了如何在控制台输出测试结果、禁用测试条件以及@Test注解的其他参数,如超时设置和预期异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:https://blog.youkuaiyun.com/uana_777/article/details/80626958  Java 读取Excel表格数据(使用工具:AndroidStudio )

参数化测试实验:

需要测试的类,两个整型数据加减乘除:

//两个int型数据的加减乘除
public class Calculator {
    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;
    }
}

简单测试一下加法:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class CalcultorTest {
    //获取测试类
    private Calculator mCalculator;
    @Before
    public void setUp(){
        mCalculator=new Calculator();
    }

    //声明测试用例,输入1+2,看结果是不是3
    @Test
    public void addTwoNumbers(){
        int result = mCalculator.add(1,2);
        Assert.assertEquals(3,result);
    }
}

如果设计了多条输入数据,采用参数化测试:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.Collection;

/**
 * 参数化测试
 * 1.需要给测试类做声明,Parameterized.class
 * 2.构造函数参数:添加测试用的参数,包含输入和输出(对应输入的期待值)参数
 * 3.添加参数集合,最好是:public static collection <Object[]> 集合名(){数组数据},数组参数顺序和构造函数应该一致
 * 4.在@Test声明的方法中,调用构造函数参数即可
 */
@RunWith(Parameterized.class)
public class CalculatorParameterizedTest {
    //测试类
    private Calculator mCalculator;
    //测试输入数据
    private  int ma=0;
    private  int mb=0;
    private  int mc=0;
    //构造函数将读入的数据赋值给ma,mb,mc
    public CalculatorParameterizedTest(int a,int b,int c){
        ma=a;
        mb=b;
        mc=c;
    }
    //声明输入数据集合,输入数据从集合中调用
    @Parameterized.Parameters
    public static Collection<Object[]> initData(){
        return Arrays.asList(new jxlDemo().ReadDataFromExcel());
    }
    @Before
    public void setUp(){
        mCalculator=new Calculator();
    }
    @Test
    public void testAdd_TwoNumbers(){
        int resultAdd = mCalculator.add(ma,mb);
        System.out.println(" 期待值:"+mc+" 执行结果:"+resultAdd);
        Assert.assertEquals(mc,resultAdd);
    }
}

关于jxlDemo是参考的资料,读取Excel文档里的数据作为输入,需要用到jxl.jar这个jar包,Excel文档放在新建的assets文件夹:


import java.io.File;
import java.io.IOException;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.read.biff.BiffException;

public class jxlDemo {
    public Object[][] ReadDataFromExcel(){
        Workbook book;//Excel文件操作对象
        Sheet sheet;//数据表
        Cell ma,mb,mc;//表单元
        //System.out.println(System.getProperty("user.dir"));
        File datafile=new File(System.getProperty("user.dir")+"/src/main/assets/TestData.xls");
        try{
            //获取要用的Excel文件, 完成数据读取等操作后需要close
            book=Workbook.getWorkbook(datafile);
            //获取Excel里的第一张表格,第二张就用book.getSheet(1);
            sheet=book.getSheet(0);
            int rows=sheet.getRows();//第一张表格的行数
            int Columns=sheet.getColumns();//第一张表格的列数
            //获取表格里的单元数据
            //ma=sheet.getCell(0,0);//获取的是第一列的列名
            Object[][] object = new Object[rows-1][Columns];
            //循环获取每一行的数据,赋值到a、b、c
            int i=1;
            int a;//a,b,c中间量也可以不用
            int b;
            int c;
            while(i<rows){
                ma=sheet.getCell(0,i);//第一列每一行的数据
                mb=sheet.getCell(1,i);//第二列每一行的数据
                mc=sheet.getCell(2,i);//第三列每一行的数据
                a=Integer.parseInt(ma.getContents());//string转int,赋值给a
                b=Integer.parseInt(mb.getContents());
                c=Integer.parseInt(mc.getContents());
                object[i-1][0]=a;//object[i-1][0]=Integer.parseInt(ma.getContents());
                object[i-1][1]=b;
                object[i-1][2]=c;
                i++;
            }
            book.close();
            return object;
        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }
}

截图记录实验数据。结果还是成功的,TestPass,故意改错mc列的期望结果值,也的确会报错。

 

测试用例多了,就有批量运行的需要。

而关于测试套件,就是整合许多的测试类,让其批量运行。

1.需要声明这是一个套件类,@RunWith(Suite.class)

2.整合加入其他的测试类,@Suite.SuiteClasses({测试类名1,测试类名2,......})

这样已经能右键点击运行了。

import org.junit.runner.RunWith;
import org.junit.runners.Suite;

@RunWith(Suite.class)
@Suite.SuiteClasses({CalcultorTest.class,CalcultorTest2.class})
public class TestSuiteForCalcultor {
}

学习一些网上资料,可以建一个主函数调用,让运行结果Result在控制台输出,。

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
    public static void main(String[] args){
        Result result= JUnitCore.runClasses(TestSuiteForCalcultor.class);
        for(Failure failure:result.getFailures()){
            System.out.println(failure.toString());
        }
        System.out.println(result.wasSuccessful());
    }
}

 

看到禁用测试除了使用@Ignore以外,还有Assume.assumeFalse或Assume.assumeTrue判断测试条件,

比如:Assume.assumeFalse(条件表达式)  判断条件返回的值,

若为false,则继续执行;

若为true,则抛出异常org.junit.AssumptionViolatedException

@Ignore这类注解也可以标在测试类上,表示类中所有测试方法都不执行。

 

注解@Test可以也能标注其他参数

@Test(timeout=100)默认时间单位为毫秒,表示用例方法执行若超过100ms,则标注为失败。

@Test(expected=XXXException.class),,表示测试用例应该抛出指定的异常,否则视为失败。

 

关于类 TestCase和TestResult,是对用例及运行结果的管理?好像现在不用专门继承它们再使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值