niedziela, lutego 26, 2017

Lepszy test mniejszy i dokładniejszy, niż większy i ogólniejszy ;-)

Mam w Bloggeroidzie taki kawałek kodu:

  public static String markupToHTML(String content) {
// ampersand and lt and gt
      content = content.replace("&", "&");
content = content.replace("<<", "&lt;");
content = content.replace(">>", "&gt;");

// add links
      content = content.replaceAll("\\[([^\\]]+)\\s+(http[^\\]]+)\\]", "<a href=\"$2\">$1</a>");
content = content.replaceAll("\\[(http[^\\]\\s]+)\\s+([^\\]]+)\\]", "<a href=\"$1\">$2</a>");
content = content.replaceAll("\\[(http[^\\]\\s]+)\\]", "<a href=\"$1\">$1</a>");

// formatting
      content = content.replaceAll("\\*\\*([^*]*)\\*\\*", "<b>$1</b>");
content = content.replaceAll("\\_\\_([^_]*)\\_\\_", "<i>$1</i>");
content = content.replaceAll("\\-\\-([^_]*)\\-\\-", "<strike>$1</strike>");
content = content.replaceAll("\\^\\^([^_]*)\\^\\^", "<sup>$1</sup>");

return content;
}

Ma dokonywać konwersji postów z Bloggeroidowego markup'a do HTMLa.

I mam do tego trochę testów (które dopisuję ostatnio, bo wcześniej UT na Androidzie były tak sobie możliwe)

@Test public void strike() {
// setup
    String input="This is --strike--";
// examine
    String result = Markup.markupToHTML(input);
// verify
    assertEquals("This is <strike>strike</strike>", result);
}

@Test public void sup() {
// setup
    String input="E=mc^^2^^";
// examine
    String result = Markup.markupToHTML(input);
// verify
    assertEquals("E=mc<sup>2</sup>", result);
}

@Test public void link1Https() {
// setup
    String input="Go to [przemelek https://przemelek.blogspot.com]";
// examine
    String result = Markup.markupToHTML(input);
// verify
    assertEquals("Go to <a href=\"https://przemelek.blogspot.com\">przemelek</a>", result);
}

Dużo ich jest i wiele osób byłoby za tym by zamiast robić tyle małych testów mieć jeden mniej więcej taki:


@Test public void text() {
// setup
    String input="Most **famouse** __equation__ is E=mc^^2^^\nGo to [http://przemelek.blogspot.com]";
// examine
    String result = Markup.markupToHTML(input);
// verify
    assertEquals("Most <b>famouse</b> <i>equation</i> is E=mc<sup>2</sup>\nGo to <a href=\"http://przemelek.blogspot.com\">http://przemelek.blogspot.com</a>", result);
}

Bo ten test testuje praktycznie wszystko co moje multum małych testów.
Niejeden byłby za tym by w ogóle testować jeszcze wyżej, żeby sprawdzić jeszcze inne konwersje za jednym zamachem.

I niby coś w tym jest, w końcu one wszystkie razem występują....
Ale problem jest w tym, że jak taki test padnie to trzeba dość dużo czasu by dojść do tego co w ogóle nie działa.
Jeśli nawet w drugiej wersji testu okaże się, że __ nie jest tłumaczone na kursywę to dojdę do tego dopiero oglądając dokładnie różnicę między tekstem oczekiwanym, a otrzymanym.
W pierwszej wersji testów po prostu padnie mi test italic().

Stąd lepiej czasem napisać trochę głupich i malutkich testów, niż 1 mega test.

Ogólnie jak w teście pojawia się if albo for to wiedź, że coś się dzieje ;-)


Podobne postybeta
Skróty klawiszowe
Tworzenie poprawnych nazw plików :-)
Pomnóżmy sobie duże liczby ;-)
Eksperyment, czyli z Google+ do Bloggera ;-)
Data binding w Polymerze jest oszukany ;-)