PR0GRAMISTA
Po co testować

A no mi te testy? To pytanie zadał sobie każdy, a przynajmniej powinien. Początkujący uciekają od tego zagadnienia jak od ognia. Coś tam ktoś kiedyś mówił kiedy rekruter zada pytanie o tą ważną część w procesie tworzenia softu.

Po co?

Aby oszczędzać czas.

Wydaje się to ironiczne. Pisanie kodu to nasza praca, zatem czemu pisanie dodatkowej części ma niby oszczędzić czas. Sytuacja jest podobna do tej, którą opisywałem w poście o CI. Tam była konfiguracja, tutaj jest kodzenie.

Cele

  • Oszczędność czasu --- jeśli tworzymy coś więcej niż typowy skrypt w Pythonie to szybko zauważymy, że aby ręcznie zbadać, że cała aplikacja działa, trzeba spędzić sporo czasu a wraz z rozwojem projektu czas ten będzie się zwiększał. Efekt ten jest jeszcze bardziej problematyczny, jeśli mamy testować część, której nie pisaliśmy i nie wiemy co tak naprawdę trzeba zbadać.

    //Memes-API
    @Test
    public void parsesOk() throws Exception {
        Page page = mistrzowieScrapper.parse(testDocument);
    
        assertNotNull(page);
        assertFalse(page.isEmpty());
        assertTrue(page.getMemes().size() > 0);
        assertTrue(page.getNextPage() != null);
    }
    

    Memes-API zależy od zewnętrznych serwisów, może się popsuć tak po prostu, bez testowania ten projekt byłby katorgą

  • Testy to etykiety. Jeśli nie wiesz co dana klasa ma robić a są do niej testy to polecam zajrzeć do nich. Zazwyczaj szybko jest się w stanie zrozumieć co to ma robić.

    @Test
    public void newButton() throws Exception {
        clickOn("File");
        verifyThat("File", (Node input) -> {
            return (input instanceof MenuButton) && ((MenuButton) input).isShowing();
        });
        clickOn("New");
    
        NodeQuery query = lookup("#newProjectDialog");
        verifyThat(query, Node::isVisible);
    
        Node node = query.query();
        interact(() -> node.getScene().getWindow().hide()); //Hide dialog
        sleep(100);
    }
    

    Możesz nie wiedzieć skąd ten kod jest, ale wiesz, że przycisk File->New powinien otworzyć dialog.

  • Ułatwia pracę po przerwie. Testy sprawiają, że o wiele łatwiej jest wrócić do starego projektu. Nie musisz się zastanawiać. Potrzebny na szybko jakiś prosty feature? Po prostu wchodzisz piszesz coś nowego i jeśli testy przestały przechodzić w jakimś miejscu to idziesz i to badasz. Ewentualnie usuwasz test i nazywasz ten bug funkcjonalnością.

  • Odkrywanie błędów o których nie wiesz.

EOF

Na początku swojej przygody z programowaniem miałem wrażenie, że testy są zbędne i do dziś podchodzę z ostrożnością do ich pisania. Łatwo jest się w tym zgubić i testować coś czego się nie powinno. Ten post to tylko odpowiedź na pytanie po co. Jak testować i o zagrożeniach związanych z tym zagadnieniem napiszę w następnych postach. Wkrótce.

11 marca 2017
testowanie dsp2017