2

在我的测试中,我检查:

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:)

4

2 回答 2

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 (或其他)这样的库,并比较它解析的所有字段是否相等。

于 2013-05-09T21:18:43.367 回答
3

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

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>
于 2013-05-09T21:22:00.360 回答