Tuesday, January 23, 2007

Htmlvalidering som en del av enhetstester

Jag har använt CSE HTML Validator för att validera genererad html. Programmet utför inte bara validering utan ger bra tips om vad som bör finnas på en sida. Allt detta är bra men hur automatiserar jag valideringen och gör den till en del av mina enhetstester? Denna funktion erbjuder inte CSE HTML Validator så jag har googlat men utan att hitta ett bra svar.

Men nu har jag svaret! Inspirerad av Tim O'Reilly som för länge sen insett att internet är ett operativsystem kom jag på att använda W3Cs valideringssida, tillsammans med HtmlUnit.

Så här går det till:
  1. Fråga din webbapp efter den html du vill validera.
  2. Stoppa in denna html in rätt formulär på validator.w3.org.
  3. Submitta och kolla sedan att texten "Passed validation" finns på svarssidan.
Klart. Busenkelt. Här kommer all javakod som behövs:
public class HtmlTest extends TestCase {

public void testPage() throws IOException {
// Get the WebClient that is part of HtmlUnit.
WebClient webClient = new WebClient();

// Get the html we want to validate, in this case the front page
// of skickafilen.se.
Page htmlPage = webClient.getPage("http://skickafilen.se");
String htmlToValidate = htmlPage.getWebResponse().getContentAsString();

// Get the validator page from W3.
HtmlPage validatorPage =
(HtmlPage) webClient.getPage("http://validator.w3.org/");

// Find the textarea and enter the html we want to validate.
HtmlForm form = (HtmlForm) validatorPage.getForms().get(2);
HtmlTextArea textarea =
(HtmlTextArea) form.getTextAreasByName("fragment").get(0);
textarea.setText(htmlToValidate);

// Submit the validator page and store the resulting page in a string.
String result = ((HtmlPage) form.submit()).asText();

// Make sure our html validated ok.
assertTrue(result.contains("Passed validation"));
}
}

W3C har även ett SOAP-gränssnitt mot valideringstjänsten men vem orkar bry sig om något så überkomplicerat som SOAP?

Archive