Mock 测试导出Excel文件

本文介绍了一种Java导出Excel文件的单元测试方法。使用Junit框架进行测试,通过Mockito模拟HttpResponse来验证导出功能。文章展示了具体的测试代码示例。

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

业务经常涉及到Excel文件的导出,后台给前端提供导出服务接口,不可能自己都没测试过,就提供给前端调用。最好的方案就是程序员编写单元测试,可以说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。

##单元测试
java 常用的单元测试框架是Junit,利用测试框架可以使我们在编写测试用例的过程更加便捷优雅。通过测试用例,我们只需要关注:对于特定的输入,被测对象的返回是否征程,下面是涉及到的相关类。

controller类提供导出接口

    @GET
        @Path("/{version}/exportRecordDetail")
        @ApiOperation(value = "导出电子支付结算明细")
        public String exportRecordDetail (@Context HttpServletResponse response, @BeanParam SingleWithdrawReq request){        
            //...
            response.setContentType("application/x-download");
            // 获取模板文件
            String templateFile = "/export/AccountRecordDetail.xlsx";	    
            try (InputStream is = this.getClass().getResourceAsStream(templateFile);
                 OPCPackage pkg = OPCPackage.open(is);
                 XSSFWorkbook workbook = new XSSFWorkbook(pkg)) {
                outputFile = URLEncoder.encode(outputFile, "UTF-8");        
                //...
                workbook.write(response.getOutputStream());
            } catch (IOException | InvalidFormatException e) {
                //... 
            }
            return null;
        }

核心代码: workbook.write(response.getOutputStream()); 这一句是指将文件写到输出流里,用到了HttpservletResponse 接口,因此在测试用例里,我们并不能直接实例化HttpservletResponse,因而也就不能作为参数传递到controller层。

那怎么办呢?首先想到了引入mock方法。Mock的引入,可以帮助我们构建比较难构造的Object,这些Object 通常有很多以来,在单元测试中构造出这些对象通常花费比较大的成本。

Mock 单元测试

@Test 
public void exportService() {
    SingleWithdrawReq request = new SingleWithdrawReq();
    request.setParkId(12345);
    ParkingBalanceAccountResources resource = new ParkingBalanceAccountResources();
    // Mock HttpServletResponse 实例
    HttpServletResponse response = Mockito.mock(HttpServletResponse.class);
    // 定义一个输出的本地文件
    File file = new File("output.xls");
    try (ServletOutputStream sos = new MockServletOutputStreamUtil (file)) {
        //用MockServletOutputStreamUtil 代替ServletOutputStream
        Mockito.when(response.getOutputStream()).thenReturn(sos);
        resource.exportRecordDetail(response, request);
    }
 }

单元测试思路: 将输出流写到一个临时文件里,但是在case里我们如何传入一个response并且得到输出流呢?

##工具类:构造ServletOutputStream

public class MockServletOutputStreamUtil extends ServletOutputStream {

    private FileOutputStream fos;    //定义文件输出流
    public MockServletOutputStreamUtil(File file) {
        try {
            this.fos = new FileOutputStream(file);    // 将输出流指向文件
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
    @Override
    public boolean isReady() {
        return true;
    }
    @Override
    public void setWriteListener(WriteListener writeListener) {
        throw new RuntimeException("do not support this method");
    }
    @Override
    public void write(int b) throws IOException {
        fos.write(b);
    }
    @Override
    public void close() {
        try {
            fos.close();
        } catch (IOException e) {
            throw new RuntimeE
xception(e);
        }
    }

<think>好的,用户想了解如何结合unittest与Excel文件进行自动化测试。首先,我需要回忆一下相关的知识,并结合提供的引用内容来构建回答。 用户提到的引用中,有关于使用Python的requests、unittest和Excel搭建测试框架的内容。特别是引用2和3提到了具体的实现方法,比如使用mock模块和封装测试用例。另外,引用4可能涉及如何封装请求和处理Excel数据。 首先,处理Excel文件需要用到库,比如openpyxl或xlrd。不过根据引用1中的代码示例,使用的是“接口自动化测试.xlsx”,所以可能需要确定具体使用哪个库读取Excel。通常,openpyxl更适合处理.xlsx格式,并且支持读写操作。 接下来,结合unittest框架,需要将Excel中的测试数据加载到测试用例中。这可以通过在setUpClass方法中读取Excel文件,并将测试数据存储为类属性来实现。每个测试方法(如test_login)可以遍历这些数据,执行请求并断言结果。 引用3中的代码展示了如何使用mock来模拟响应,这可能在某些情况下有用,比如当需要隔离外部依赖时。但在实际测试中,可能更倾向于发送真实请求,因此需要根据情况决定是否使用mock。 此外,数据驱动测试是关键。每个Excel行代表一个测试用例,包含参数、预期结果等信息。使用unittest的动态生成测试用例方法,可以为每个数据行生成独立的测试方法,便于管理和执行。 还需要考虑异常处理和测试报告生成。unittest本身支持生成基础报告,但结合HTMLTestRunner可以生成更详细的HTML报告,方便查看结果。 总结步骤应该是:安装库、准备Excel、读取数据、编写测试类、执行用例并生成报告。需要确保代码示例正确,比如使用openpyxl读取数据,处理不同的工作表,以及在测试方法中进行断言。 最后,生成相关问题,可能涉及数据驱动测试的其他方法、异常处理技巧、报告生成工具的选择,以及如何提高测试效率等。</think>以下是如何结合unittest与Excel文件实现自动化测试的步骤详解: ### 一、环境准备 1. 安装依赖库: ```bash pip install openpyxl requests unittest-xml-reporting ``` 2. Excel文件结构示例(接口自动化测试.xlsx): ``` | CaseID | 接口地址 | 请求方式 | 请求参数 | 预期状态码 | 预期结果 | |--------|---------|---------|---------|-----------|---------| | 1 | /login | POST | {"user":"admin"} | 200 | success | ``` ### 二、核心代码实现 ```python import unittest import requests from openpyxl import load_workbook class APITestCase(unittest.TestCase): @classmethod def setUpClass(cls): # 读取Excel测试数据(对应引用1的文件路径) cls.wb = load_workbook("接口自动化测试.xlsx") cls.sheet = cls.wb["Sheet1"] cls.test_data = [dict(zip(row[0], row[1])) for row in zip( [cell.value for cell in cls.sheet[1]], (row for row in cls.sheet.iter_rows(min_row=2, values_only=True)) )] def test_api_cases(self): """动态生成测试用例(数据驱动)""" for data in self.test_data: with self.subTest(data=data): # 发送请求(对应引用2的框架结构) response = requests.request( method=data["请求方式"], url=data["接口地址"], json=eval(data["请求参数"]) ) # 断言验证 self.assertEqual(response.status_code, data["预期状态码"]) self.assertIn(data["预期结果"], response.text) if __name__ == "__main__": unittest.main() ``` ### 三、关键实现说明 1. **数据驱
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值