Jak Mogę przetestować interfejs graficzny?

Obliczenia w moim kodzie są dobrze przetestowane, ale ponieważ jest tak dużo kodu GUI, mój ogólny zasięg kodu jest niższy niż bym chciał. Czy są jakieś wytyczne dotyczące testów jednostkowych kodu GUI? Czy to w ogóle ma sens?

Na przykład w mojej aplikacji są wykresy. Nie byłem w stanie dowiedzieć się, jak zautomatyzować testowanie Wykresów. Trzeba ludzkiego oka, AFAIK, aby sprawdzić, czy wykres jest poprawny.

(używam Javy Swing)

Author: Steve McLeod, 2008-10-18

12 answers

Projekty takie jak MVP i MVC zazwyczaj starają się wyodrębnić jak najwięcej logiki z rzeczywistego GUI, jak to tylko możliwe. Jednym z bardzo popularnych artykułów na ten temat jest "skromne okno dialogowe" autorstwa Michaela Feathersa. Osobiście miałem mieszane doświadczenia z próbami przeniesienia logiki z interfejsu użytkownika-czasami działało to bardzo dobrze, a innym razem było więcej kłopotów niż warto. To trochę poza moim obszarem specjalizacji.

 63
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 08:51:44

Oczywiście, odpowiedzią jest użycie MVC i przeniesienie jak największej ilości logiki z GUI.

Mając to na uwadze, słyszałem od współpracownika dawno temu, że kiedy SGI portował OpenGL na nowy sprzęt, mieli kilka testów jednostkowych, które rysowały zestaw pierwotnych na ekranie, a następnie obliczały sumę MD5 bufora ramki. Wartość tę można następnie porównać do znanych dobrych wartości skrótu, aby szybko określić, czy API jest dokładne na piksel.

 32
Author: dicroce,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 21:08:18

Możesz wypróbować UISpec4J jest otwartoźródłową biblioteką do testowania Funkcjonalnego i/lub jednostkowego dla aplikacji Java opartych na swingu...

 10
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 19:20:17

Oto kilka wskazówek:

Spróbuj usunąć jak najwięcej kodu z GUI (mieć kontroler i obiekt modelu) w ten sposób będziesz mógł je testować bez GUI.

W przypadku grafiki należy przetestować wartość dostarczaną do kodu generującego grafikę.

 6
Author: Patrick Desjardins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 19:19:22

Możesz spróbować użyć Cucumber i Swinger do pisania testów akceptacyjnych funkcjonalnych w prostym języku angielskim dla aplikacji Swing GUI. Swinger korzysta z biblioteki Jemmy Netbeans pod maską, aby napędzać aplikację.

Ogórek pozwala pisać takie testy:

 Scenario: Dialog manipulation
    Given the frame "SwingSet" is visible
    When I click the menu "File/About"
    Then I should see the dialog "About Swing!"
    When I click the button "OK"
    Then I should not see the dialog "About Swing!"
Kliknij i zobacz najlepsze darmowe filmy erotyczne z Bazy Kilku Milionów Porno Filmów Za Darmo z Swinger.
 6
Author: Dema,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-13 11:59:52

Istnieje selen RC, który zautomatyzuje testowanie interfejsu WWW. Będzie nagrywać akcje i odtwarzać je. Nadal będziesz musiał przejść przez interakcje z interfejsem użytkownika, więc nie pomoże to w pokryciu, ale może być używane do zautomatyzowanych kompilacji.

 5
Author: David Robbins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 19:41:11

Testowanie jest formą sztuki. Zgadzam się logika powinna być usunięta GUI jak najbardziej. Możemy wtedy skupić się na testach jednostkowych. Jak Wszystko inne testowanie polega na zmniejszaniu ryzyka. Nie zawsze trzeba testować wszystko, ale wiele razy najlepszą rzeczą jest, aby przerwać różne testy na różnych obszarach.

Inne pytanie brzmi, co tak naprawdę próbujesz przetestować na warstwie interfejsu. Testowanie interfejsu użytkownika jest najdroższym testowaniem, ponieważ zwykle trwa dłużej, aby utworzyć, utrzymać i jest najbardziej kruchy. Jeśli testujesz logikę, aby wiedzieć, że współrzędne są poprawne przed próbą narysowania linii, co dokładnie testujesz? Jeśli chcesz przetestować Wykres z czerwoną linią jest rysowany. Czy możesz dać mu określone z góry współrzędne i sprawdzić, czy niektóre piksele są czerwone, czy nie czerwone? Jak sugerowano powyżej porównań bitmapowych pracy, Selenium ale moim głównym celem nie byłoby ponad test GUI, ale raczej przetestować logikę, która pomoże stworzyć UI, a następnie skupić się na tym, co część interfejs psuje się lub jest podejrzany i skupia tam kilka testów.

 5
Author: Charles Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-06 17:37:36

Możesz użyć JFCUnit aby przetestować swój GUI, ale grafika może być trudniejsza. Przy kilku okazjach zrobiłem migawki mojego GUI i automatycznie porównałem go z poprzednią wersją. Chociaż nie zapewnia to rzeczywistego testu, ostrzega cię, jeśli automatyczna kompilacja nie wytworzy oczekiwanego wyniku.

 3
Author: Steve Moyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 19:19:37

Z twojego pytania wynika, że szukasz zautomatyzowanego sposobu na szczegółowe sprawdzenie zachowania GUI, przykład, który podajesz, to sprawdzenie, czy krzywa jest rzeczywiście narysowana poprawnie.

Unit testing framework to sposób na automatyczne testowanie, ale myślę, że tego rodzaju testy, które chcesz wykonać, to skomplikowane testy integracyjne, które weryfikują poprawne zachowanie wielu klas, wśród których są klasy Twojego zestawu narzędzi/biblioteki GUI, których nie powinieneś chcieć test.

Twoje opcje zależą w dużym stopniu od platform/zestawów narzędzi/frameworków, których używasz: na przykład aplikacja używająca Qt jako frameworka GUI może używać Squish do automatyzacji swoich testów. Wyniki testów weryfikujesz raz, a kolejne automatycznie wykonywane testy porównują wyniki ze zweryfikowanymi.

 3
Author: andreas buykx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-04 21:21:23

Window Licker for Swing & Ajax

 2
Author: robi-y,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-28 20:52:58

Z tego, co wiem, Jest to dość skomplikowane i naprawdę zależy od języka-wiele języków ma swój własny sposób testowania GUI, ale jeśli naprawdę potrzebujesz przetestować GUI( w przeciwieństwie do interakcji model/gui), często musisz symulować rzeczywistego użytkownika klikającego przyciski. Na przykład Framework SWT używany w Eclipse dostarcza SWTBot, JFCUnit już wspomniano, Mozilla ma swój własny sposób symulowania tego w XUL (i z tego co czytałem na ich blogach, te testy wydają się być dość kruche).

Czasami musisz zrobić zrzut ekranu i przetestować renderowanie pikseli (wierzę, że Mozilla robi to, aby sprawdzić poprawne renderowanie stron) - wymaga to dłuższej konfiguracji, ale może być to, czego potrzebujesz do Wykresów. W ten sposób, po aktualizacji kodu i przerwach testowych, musisz ręcznie sprawdzić obraz, czy błąd był rzeczywisty, lub poprawiłeś kod renderowania wykresu, aby wygenerować ładniejsze wykresy i musisz zaktualizować zrzuty ekranu.

 0
Author: Kim Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-18 20:35:04

Jeśli używasz swingu, FEST-Swing jest przydatny do prowadzenia GUI i testowania twierdzeń. To sprawia, że całkiem proste do testowania rzeczy, takich jak "jeśli kliknę przycisk a, okno dialogowe B powinno być wyświetlane" lub "Jeśli wybieram opcję 2 z listy rozwijanej, wszystkie pola wyboru powinny być nie zaznaczone".

Scenariusz wykresu, o którym wspominasz, nie jest tak łatwy do przetestowania. Bardzo łatwo jest uzyskać pokrycie kodu Dla komponentów GUI tylko poprzez ich tworzenie i wyświetlanie (i być może jazda nimi z FEST). Jednak tworzenie sensownych twierdzeń jest trudną częścią (a pokrycie kodu bez sensownych twierdzeń jest ćwiczeniem w samooszukiwaniu się). Jak sprawdzić, czy Wykres nie został narysowany do góry nogami lub za mały?

Myślę, że po prostu trzeba zaakceptować, że niektóre aspekty GUI nie mogą być skutecznie testowane przez zautomatyzowane testy jednostkowe i że trzeba będzie przetestować je w inny sposób.

 0
Author: Dan Dyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-19 13:50:46