Back to Repositories

Testing Excel Encryption Operations in alibaba/easyexcel

This test suite validates Excel file encryption functionality in EasyExcel, covering both read and write operations for XLS and XLSX formats with password protection. It demonstrates secure data handling across different Excel versions and stream-based operations.

Test Coverage Overview

The test suite provides comprehensive coverage of encrypted Excel file operations:

  • Password-protected read/write for Excel 2003 (.xls) and 2007 (.xlsx) formats
  • Stream-based and file-based encryption handling
  • Data integrity verification through write-then-read validation
  • Decimal formatting and rounding mode verification

Implementation Analysis

The testing approach employs JUnit 5 framework features with methodical test organization:

The suite implements ordered test execution using @TestMethodOrder annotation, ensuring sequential processing of different Excel format tests. Each test method focuses on a specific combination of Excel version and I/O method, using shared utility methods for consistent data handling.

Technical Details

Key technical components include:

  • JUnit Jupiter for test execution and lifecycle management
  • EasyExcel API for Excel operations
  • File I/O streams for direct file manipulation
  • Custom TestFileUtil for file management
  • Password-based encryption using ‘123456’ as test key

Best Practices Demonstrated

The test suite exemplifies several testing best practices:

  • Separation of concerns between test setup (@BeforeAll) and test execution
  • Consistent error handling and resource cleanup
  • Reusable test data generation methods
  • Clear test method naming convention
  • Comprehensive coverage of both file-based and stream-based operations

alibaba/easyexcel

easyexcel-test/src/test/java/com/alibaba/easyexcel/test/core/encrypt/EncryptDataTest.java

            
package com.alibaba.easyexcel.test.core.encrypt;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

import com.alibaba.easyexcel.test.core.simple.SimpleData;
import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.support.ExcelTypeEnum;

import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;

/**
 * @author Jiaju Zhuang
 */
@TestMethodOrder(MethodOrderer.MethodName.class)
public class EncryptDataTest {

    private static File file07;
    private static File file03;
    private static File file07OutputStream;
    private static File file03OutputStream;

    @Test
    public void testformat() {
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
        BigDecimal bigDecimal = new BigDecimal("0.105");

        System.out.println(decimalFormat.format(bigDecimal));
    }

    @BeforeAll
    public static void init() {
        file07 = TestFileUtil.createNewFile("encrypt07.xlsx");
        file03 = TestFileUtil.createNewFile("encrypt03.xls");
        file07OutputStream = TestFileUtil.createNewFile("encryptOutputStream07.xlsx");
        file03OutputStream = TestFileUtil.createNewFile("encryptOutputStream03.xls");
    }

    @Test
    public void t01ReadAndWrite07() {
        readAndWrite(file07);
    }

    @Test
    public void t02ReadAndWrite03() {
        readAndWrite(file03);
    }

    @Test
    public void t03ReadAndWriteStream07() throws Exception {
        readAndWriteStream(file07OutputStream, ExcelTypeEnum.XLSX);
    }

    @Test
    public void t04ReadAndWriteStream03() throws Exception {
        readAndWriteStream(file03OutputStream, ExcelTypeEnum.XLS);
    }

    private void readAndWrite(File file) {
        EasyExcel.write(file, EncryptData.class).password("123456").sheet().doWrite(data());
        EasyExcel.read(file, EncryptData.class, new EncryptDataListener()).password("123456").sheet().doRead();
    }

    private void readAndWriteStream(File file, ExcelTypeEnum excelType) throws Exception {
        FileOutputStream fileOutputStream = new FileOutputStream(file);
        EasyExcel.write(fileOutputStream, EncryptData.class).password("123456").excelType(excelType).sheet()
            .doWrite(data());
        fileOutputStream.close();

        FileInputStream fileInputStream = new FileInputStream(file);
        EasyExcel.read(fileInputStream, EncryptData.class, new EncryptDataListener()).password("123456").sheet()
            .doRead();
    }

    private List<SimpleData> data() {
        List<SimpleData> list = new ArrayList<SimpleData>();
        for (int i = 0; i < 10; i++) {
            SimpleData simpleData = new SimpleData();
            simpleData.setName("姓名" + i);
            list.add(simpleData);
        }
        return list;
    }
}