๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

Java ์—์„œ XML ๋‘๊ฐœ์˜ ํŒŒ์ผ ๋น„๊ต ํ•˜๊ธฐ - XMLUnit

by Jo__y 2023. 4. 6.

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 ๋•๋ถ„์— ์†Œ์Šค๊ฐ€ ๊ฐ„๊ฒฐํ•ด์กŒ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€