본문 바로가기
📚Framework & Library/JUnit

[Junit] Jasper Report PDF 문서 검증하기 (feat. JpdfUnit)

by inbeom 2024. 1. 23.
728x90
JasperReport 라이브러리를 사용하여 PDF형식의 보고서를 생성할 때 데이터가 제대로 가공되어 보고서가 정상적으로 생성 되는지 테스트 하기 위해 JpdfUnit을 사용하게 되었다.

 

*JasperReport에 대한 내용은 해당 글 참조.

https://inbeom.tistory.com/entry/JasperReports-JasperReports%EB%9E%80-feat-Jaspersoft-Studio

 

 

기존 Java에서는 Junit을 사용하여 데이터를 검증하고 서비스 로직 등을 테스트 하지만 JasperReport를 사용하여 생성한 PDF형식의 보고서의 데이터를 검증하기 위해서는 다른 방법이 필요하여 리서치를 통해 여러 개발자들이 PDF 데이터 검증에 활용하고 있는 JpdfUnit이라는 오픈소스 프레임워크를 도입하였다.

 

 

JpdfUnit은 생성된 PDF 문서를 Junit 테스트 프레임워크로 테스트하기 위한 프레임워크이다.

해당 프레임워크는 PDFBox 라이브러리에 쉽게 접근하고 활용할 수 있도록 설계되어 개발자가 PDF 데이터를 더욱 쉽고 편리하게 검증하여 서비스 로직의 안정성을 높일 수 있다.

 

JpdfUnit을 사용한 PDF Test Case 작성.

import org.junit.Test;
import de.qaware.jpdfunit.document.DocumentTester;

public class PDFUnitTest {

    @Test
    public void testPDFDocument() {
        // 테스트할 PDF 문서의 경로 설정
        String pdfFilePath = "path/to/your/document.pdf";

        // JPDFUnit의 DocumentTester 객체 생성
        DocumentTester tester = new DocumentTester(pdfFilePath);

        try {
            // 페이지 수 확인
            int expectedNumberOfPages = 3;
            tester.assertNumberOfPages(expectedNumberOfPages);

            // 첫 번째 페이지의 특정 텍스트 확인
            tester.assertPageContainsText(1, "Hello, World!");

            // 두 번째 페이지에 특정 이미지가 있는지 확인
            String imagePath = "path/to/your/image.png";
            tester.assertPageContainsImage(2, imagePath);

            // 특정 폰트 사용 여부 확인
            tester.assertFontInDocument("Arial");

            // PDF 문서 전체에서 특정 텍스트가 포함되어 있는지 확인
            tester.assertContainsText("PDF Testing Example");

            // 필요한 다른 테스트 수행

        } catch (Exception e) {
            // 테스트 중에 발생한 예외 처리
            e.printStackTrace();
        } finally {
            // 리소스 해제 등의 정리 작업
            tester.close();
        }
    }
}

이렇게 JpdfUnit 프레임워크를 사용하여 보다 편리하고 가독성있는 PDF 테스트 코드를 작성할 수 있다.

 

자세한 사용 방법이나 공식 문서는 홈페이지에 자세히 설명되어 있으므로 직접 확인 후 사용하는 것이 좋다. 

https://jpdfunit.sourceforge.net/

 

JPdfUnit homepage, framework for testing generated pdf document

overview JpdfUnit is a framework for testing a generated pdf document with the JUnit test framework so JPdfUnit is a high level api. The framework is designed for an easy access to the PDFBox library. This functionality provides the user a lot of possibili

jpdfunit.sourceforge.net

 


 

우선 위에서 설명한 JpdfUnit을 사용하여 테스트 코드를 작성하는 것은 좋은 방법이지만 현재 개발중인 프로젝트에서는 버전.? 문제로 Jenkins로 Build시 에러가 발생하여 실제 적용하지 못했다..
(porm.xml에 등록한 Repository의 URL을 정상적으로 찾지 못함..) 

 

 

JpdfUnit 프레임워크를 사용하지 못하게 되어 대안으로 데이터가 PDF로 변환(export) 되기 전 JasperPrint 객체의 데이터를 검증하는 방법으로 테스트 코드를 작성하였다.

 

Source Code 예시 >

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {WebAppInitializer.class, AppConfig.class,})
@WebAppConfiguration
public class JasperTest extends TestCase {

    private final ObjectMapper objectMapper = new ObjectMapper();

    private MockMvc mockMvc;

    @Autowired
    private ReportProcessController controller;

    @Autowired
    ReportService reportService;
    @Autowired
    ReportController reportController;

    @Test //Todo. 보고서 Unit Test
    @Transactional
    public void reportDataUnitTest() throws Exception {
        // create -> param
        Map<String, Object> param = new HashMap<>();
        param.put("startDate","??");
        param.put("endDate","??");
        param.put("userId", "??");

        // create -> Page.21 UUID
        Set<String> uuidsSet = new HashSet<>();
        uuidsSet.add("7a34a631-e7b6-4ff7-94c8-deb354f71700");
        uuidsSet.add("ad8a9bf3-62a2-4da3-92bc-fbbba66a0f5d");

        // Method Processing (Jasper Report 생성)
        JasperPrint jasperPrint = reportService.createReport(param);

        // Basic Data Verification
        assertThat(jasperPrint).isNotNull().isInstanceOf(JasperPrint.class);
        assertThat(jasperPrint)
                .extracting(
                        JasperPrint::getName, // report03
                        JasperPrint::getTopMargin, // 20
                        j -> j.getOrientationValue().getName(), // Portrait
                        j -> j.getOriginsList().size(), // 106
                        JasperPrint::getLocaleCode) // ko_KR
                .containsExactly(
                        "report03",
                        20,
                        "Portrait",
                        102,
                        "ko_KR");

        // Page Data Verification - AssertJ
        assertThat(jasperPrint.getPages())
                .isNotEmpty()
                .hasSize(54)
                .first()
                .isInstanceOf(JRBasePrintPage.class)
                .extracting(
                        p -> p.getElements().get(5).getUUID().toString(), // d8f6c50c-8485e4405j-ghfab
                        p -> p.getElements().get(2).getSourceElementId(), // 9
                        p -> p.getElements().get(6).getOrigin().getBandTypeValue().getName()) // title
                .containsExactly(
                        "d8f6c50c-8485e4405j-ghfab",
                        9,
                        "title");

        // Page Data Verification - Stream
        assertThat(jasperPrint.getPages().get(21).getElements().stream()
                .allMatch(
                        (s -> uuidsSet.contains(s.getUUID().toString())
                        )));
    }

 

위의 코드는 Junit4, AssertJ, Stream 등의 Framework & Library를 활용하여 PDF가 생성되기 전의 JasperPrint객체의 데이터를 검증하는 테스트 코드이다.

 

*JasperReport등 PDF의 데이터를 검증하기 위해 더 다양한 방법이 있을 수 있겠지만 Research 및 실제 사용해본 결과 위의 방법들이 가장 편리하고 효과적이었다.

 

 

 

- 끝 -

 

728x90