是否存在类似assertHTMLEquals的单元测试

时间:2013-05-09 21:08:54

标签: java html junit

在我的测试中,我检查:

assertEquals("<div class=\"action-button\" title=\"actionButton\">"</div>", result);

如果有人更改了html(result),放置SPACE,HTML仍然有效,但我的测试会失败。

有没有办法比较两个html片段,如果它们与HTML相同。与assertHTMLEquals

一样

XML UNIT说这两行是相同的:

字符串1:

<ldapConfigurations>
<ldap tenantid="" active="false">
</ldap>
</ldapConfigurations>

字符串2:

<ldapConfigurations>
<ldapdd tenantid="" active="false">
</ldap>
</ldapConfigurations>

但是他们不是,你可以看到。 (见:ldapdd

2 个答案:

答案 0 :(得分:4)

这不一定适用于您的情况,但如果您的HTML恰好是有效的XML,它将会。您可以使用名为xmlunit的此工具。有了它,你可以编写一个如下所示的断言方法:

public static void assertXMLEqual(Reader reader, String xml) {
    try {
        XMLAssert.assertXMLEqual(reader, new StringReader(xml));
    } catch (Exception ex) {
        ex.printStackTrace();
        XMLAssert.fail();
    }
}

如果这对您不起作用,可能还有一些其他工具可用于HTML比较。如果这不起作用,您可能希望最终使用像jtagsoup(或其他)这样的库,并比较它解析的所有字段是否相等。

答案 1 :(得分:3)

您可以通过XMLUnitTolerantSaxDocumentBuilder实用程序实现格式错误的HTML断言

TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder =
                         new TolerantSaxDocumentBuilder(XMLUnit.newTestParser());
HTMLDocumentBuilder htmlDocumentBuilder =
                         new HTMLDocumentBuilder(tolerantSaxDocumentBuilder);
XMLAssert.assertXMLEqual(htmlDocumentBuilder.parse(expectedHTML),
                         htmlDocumentBuilder.parse(actualHTML));

为了支持格式错误的HTML(例如没有关闭标记的元素 - 在XML中无法想象),您必须使用其他文档构建器TolerantSaxDocumentBuilder以及HTMLDocumentBuilder(这个将允许在网页上断言)。之后,像往常一样断言文件。

工作代码示例:

public class TestHTML {
    public static void main(String[] args) throws Exception {
        String result = "<div             class=\"action-button\"                title=\"actionButton\">            </div>";
        assertHTMLEquals("<div class=\"action-button\" title=\"actionButton\"></div>", result); // ok!

        // notice it is badly formed
        String expectedHtml = "<html><title>Page Title</title>"         
                + "<body><h1>Heads<ul>"
                + "<li id='1'>Some Item<li id='2'>Another item";

        String actualMalformedHTML = expectedHtml.replace(" ", "     "); // just added some spaces, wont matter
        assertHTMLEquals(expectedHtml, actualMalformedHTML); // ok!

        actualMalformedHTML = actualMalformedHTML.replace("Heads", "Tails");
        assertHTMLEquals(expectedHtml, actualMalformedHTML); // assertion fails
    }

    public static void assertHTMLEquals(String expectedHTML, String actualHTML) throws Exception {
        TolerantSaxDocumentBuilder tolerantSaxDocumentBuilder = new TolerantSaxDocumentBuilder(XMLUnit.newTestParser());
        HTMLDocumentBuilder htmlDocumentBuilder = new HTMLDocumentBuilder(tolerantSaxDocumentBuilder);
        XMLAssert.assertXMLEqual(htmlDocumentBuilder.parse(expectedHTML), htmlDocumentBuilder.parse(actualHTML));
    }
}

请注意,HTML函数也可以使用XML函数,例如XPath。

如果使用Maven,请将其添加到pom.xml

<dependency>
    <groupId>xmlunit</groupId>
    <artifactId>xmlunit</artifactId>
    <version>1.4</version>
</dependency>