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을 사용하여 테스트 코드를 작성하는 것은 좋은 방법이지만 현재 개발중인 프로젝트에서는 버전.? 문제로 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 및 실제 사용해본 결과 위의 방법들이 가장 편리하고 효과적이었다.
- 끝 -
'📚Framework & Library > JUnit' 카테고리의 다른 글
[Junit] Elasticsearch Unit(Integration) Test Code 작성하기 (0) | 2024.01.23 |
---|---|
[Junit] Test 종류. Test Case (feat. 전자정부 프레임워크) (0) | 2023.11.17 |
[Junit] TypeReference, JsonPath - Json 다루기 (feat. ObjectMapper) (3) | 2023.11.17 |
[Junit] Junit4 다양한 라이브러리 활용 (feat. AssertJ, Unitils, RestAssured) (2) | 2023.11.17 |
[JUnit] junit5 간단한 테스트 코드 작성 (0) | 2023.09.10 |