Java

Java μ—μ„œ XML λ‘κ°œμ˜ 파일 비ꡐ ν•˜κΈ° - XMLUnit

Jo__y 2023. 4. 6. 17:09

XML 파일 λ‘κ°œλ₯Ό 비ꡐ해야 ν•˜λŠ” 일이 μžˆμ–΄μ„œ μ°Ύμ•„λ³΄λ‹ˆ XMLUnit μ΄λΌλŠ” λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μžˆμ—ˆλ‹€.
그리고 XML 파일 λ‚΄μš© μ€‘μ—μ„œλ„ νŠΉμ • 속성(Attribute) 값은 μ œμ™Έν•˜κ³  비ꡐ해야 ν–ˆλ‹€.
μ²˜μŒμ— μ°Ύμ•˜μ„λ•ŒλŠ” 1.* λ²„μ „μœΌλ‘œ ν™•μΈν•΄μ„œ λ‚΄κ°€ μ›ν•˜λŠ” κΈ°λŠ₯을 찾을 수 μ—†μ—ˆκ³ ,
DocumentBuilder 둜 DOM 으둜 λ§Œλ“€μ–΄μ„œ 비ꡐ해야 ν•˜λ‚˜ κ³ λ―Όν•˜κ³  μžˆμ„λ•Œ
Apache μ—μ„œ μ œκ³΅ν•˜λŠ” XMLUnit 의 2.* 버전이 μžˆλ‹€λŠ” 것을 μ•Œμ•˜κ³ , λ°”λ‘œ 문제λ₯Ό ν•΄κ²° ν•  수 μžˆμ—ˆλ‹€.
Maven dependency λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

<!-- https://mvnrepository.com/artifact/org.xmlunit/xmlunit-core -->
<dependency>
    <groupId>org.xmlunit</groupId>
    <artifactId>xmlunit-core</artifactId>
    <version>2.9.0</version>
    <scope>test</scope>
</dependency>

첫번째 ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

@Test
    public void xmlUnitTest() {
        String source = "<employees> " +
                            "<employee id='1'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                            "<employee id='2'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                        "</employees>";
        String target = "<employees> " +
                            "<employee id='3'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                            "<employee id='4'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                        "</employees>";

        Diff myDiff = DiffBuilder.compare(source).withTest(target)
                .checkForSimilar()
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
                .ignoreWhitespace()
                // id 속성은 μ œμ™Έν•˜κ³  비ꡐ
                .withAttributeFilter(a -> "attributeName".equals("id"))
                .build();

        List<Difference> differences = (List<Difference>) myDiff.getDifferences();
        System.out.println("size : "+ differences.size());
        for (Difference difference : differences) {
            System.out.println(difference);
        }
    }

첫번째둜 λ‘κ°œμ˜ xml λ‚΄μš©μ€ κ°™κ³ , id 만 λ‹€λ₯Όκ²½μš° 돌렀 λ³΄μ•˜λ‹€.

size : 0

id 속성은 λ¬΄μ‹œν•˜κ³  λ‚΄μš©λ§Œ κ·Έ μ™Έμ˜ λ‚΄μš©μ„ λΉ„κ΅ν•˜μ—¬ Difference 값이 0 으둜 λ‚˜μ™”λ‹€.

λ‘λ²ˆμ§Έ ν…ŒμŠ€νŠΈ μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

@Test
    public void xmlUnitTest() {
        String source = "<employees> " +
                            "<employee id='1'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                            "<employee id='2'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                        "</employees>";
        String target = "<employees> " +
                            "<employee id='3'> " +
                                "<name>David</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                            "<employee id='4'> " +
                                "<name>James</name> " +
                                "<department>Sales</department> " +
                            "</employee> " +
                        "</employees>";

        Diff myDiff = DiffBuilder.compare(source).withTest(target)
                .checkForSimilar()
                .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
                .ignoreWhitespace()
                // id 속성은 μ œμ™Έν•˜κ³  비ꡐ
                .withAttributeFilter(a -> "attributeName".equals("id"))
                .build();

        List<Difference> differences = (List<Difference>) myDiff.getDifferences();
        System.out.println("size : "+ differences.size());
        for (Difference difference : differences) {
            System.out.println(difference);
        }
    }

μ²«λ²ˆμ§Έμ™€ λ‹€λ₯Έμ μ€ id κ°€ 3인 곳의 name 을 David 둜 λ³€κ²½ ν•˜μ˜€λ‹€.
그리고 ν…ŒμŠ€νŠΈ ν•  경우

size : 1
Expected text value 'James' but was 'David' - comparing ...

list μ‚¬μ΄μ¦ˆκ°€ 1 이고 James λ₯Ό μ˜ˆμƒν–ˆμ§€λ§Œ David 값을 κ°€μ§€κ³  μžˆλ‹€κ³  좜λ ₯ λ˜μ—ˆλ‹€.

XMLUnit 덕뢄에 μ†ŒμŠ€κ°€ κ°„κ²°ν•΄μ‘Œλ‹€.

λ°˜μ‘ν˜•