Testy End-to-End - czy warto?

M6
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Beskid Śląski
  • Postów:14
0

Ostatnio odszedł od nas gość, który na pełen etat zajmował się tworzeniem testów z wykorzystaniem Selenium (+ Java), w związku z czym pomagam czasem w utrzymywaniu tego cuda. Cały zestaw testów leci codziennie rano i wypluwa z siebie piękny raport z Cucumbera. Moje, oraz sporej części zespołu, spostrzeżenia są póki co takie:

  • stworzenie scenariusza testowego trwa długo (webclient musi się przeklikać przez te wszystkie logowania, punkty menu itd., więc każda powtórka trwa)
  • jeśli w raporcie wychodzą błędy, to ich analiza jest na ogół czasochłonna (a najczęściej błędy dotyczą samych scenariuszy, a nie systemu)
  • co za tym idzie - utrzymanie testów end-to-end w jako-takim stanie i aktualności kosztuje bardzo dużo wysiłku
  • trudno oprzeć się wrażeniu, że to narzędzie nie pomogło nam do tej pory (ok. 3 lata) wykryć żadnych poważniejszych błędów

Z jednej strony idea tego rodzaju testów wydaje się być przekonująca, szczególnie w przypadku mikroserwisów. Z drugiej strony manualni testerzy dużo sprawniej i szczegółowiej wyłapują różnego rodzaju bugi, natomiast serwisy zawierające porządne testy jednostkowe i integracyjne na ogół bronią się potem dość dobrze. Ponadto, gdy przypominam sobie wszystkie sytuacje typu

  • oh nein! dlaczego ten test jest na czerwono? aa, znowu ktoś się zalogował jako testowy user i zmienił domyślny język, lub
  • oh nein! aa, tekst w toast message ma na końcu kropkę, względnie
  • oh nein! aa, zmienił się selektor css dla kwoty dodatniej,

to dostaję palpitacji serca w tej sekundzie.

Co sądzicie o testach end-to-end? Czy warto inwestować w to czas/energię/pieniądze?

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Ja to się dziwię jak można w ogóle o coś takiego pytać.
Ale może pracuję ze specyficzną aplikacją (dużo konfiguracji, mało kodu).

Zmiany w css-ach nie powstają codziennie.
Natomiast błędy integracji kodu - tak, jak najbardziej mogą. Zwłaszcza jak łączysz pliki konfiguracyjne z iluś źródeł.
Ręczne testowanie kodu jest dobre, jak oddajesz pierwszy raz jakąś funkcjonalność.
Ale nie zatrudnisz stada ludzi, żeby Ci codziennie przeklikiwali aplikację, bo w końcu się wypalą.

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:6 minut
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
1

O bardzo dobre.
Jestem odpowiedzialny za wyj...nie testów selenium w jednej dużej firmie, w kluczowym projekcie.
Selenium generowało bardzo dużo pracy (dla zespółu), dawało marne efekty. Uznałem, że mamy większe problemy i czas skoncentrować wysiłki gdzie indziej - więcej dobrych unit testów, lepsze buildy, kod, sonar itp.
Opór był duży, bo te testy selenium dużo pracy zespół kosztowały i szkoda troche było wyrzucać, ale efekt jest taki, że po wywaleniu było jakbyśmy wypłynęli na powierzchnię spod wody, nagle 25 % czasu więcej się zrobiło (tyle mniej więcej wysiłku szło w utrzymanie).

Tak dokładnie to zostawiiliśmy kilka testów, które miały charakter smoke - logowanie do aplikacji, sprawdzanie czy głowny ekran się załadował.

A teraz do rzeczy: to zależy.
Testy selenium mają sens przy pewnej skali: dużo przeglądarek do obsługiwania, dużo konfiguracji, bardzo dużo użytkowników (setki tysięcy), skomplikowana i krytyczna dla funkcjonalność dla biznesu klientów itd, trudny deployment (bo np. klient ma własne lokalne instalki).

Generalnie trzeba oszacować jak dużo kosztuje nas błąd (a w zasadzie jak dużo kosztuje nasz biznes).

Jira, github to projekty takie, że jak rypnie gui, przez głupi skrypt to następnego dnia wręcz miliony ludzi są dotknięte - tam takie testy mają sens. Wyobraźmy sobie, że wpada nowa wersja jiry nie przetestowana dobrze na IE 10 i pól , który akurat masz w banku i robi się dramat. To grozi utratą ważnego klienta.

Dla odmiany, typowa aplikacja wewnętrzna, gdzie użytkowników mamy w naszej firmie( i jest ich mniej niż 1000 ) zwykle nie uzasadnia inwestycji w selenium.
Sklep internetowy czy tego typu aplikacja, której funkcjonalność jest w stanie szybko przetestować dwóch wynajętych ziemian, również inwestycji w testy e2e zwykle nie uzasadnia.

Trzeba to wszystko rozważyć i oszacować ryzyko dla projektu - moim zdaniem w ponad 90% projektów są sensowniejsze rzeczy do zrobienia niż utrzymywanie selenium. Jest to zwykle dużo droższe niż się wydaje, szczególnie w utrzymaniu, nawet jak się page object stosuje.


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 7x, ostatnio: jarekr000000
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
0

Każdy test to jakieś tam betonowanie implementacji.
Jak zrobisz za dużo unit testów z mockowaniem to też będzie źle - w projekcie będzie duży koszt zmian.
Jak zrobisz za dużo smoke testów to z kolei oprócz CSS-a masz jeszcze problem wydajności tych testów. Zwykle są najwolniejsze i feedback przy wielu tych testach (>100) może być albo bardzo opóźniony (mieliśmy >4h) albo kosztowny (jeśli używasz więcej niż 1 joba na testy).
Myślę że bez przetestowania kluczowych ścieżek end2end (nie tylko happy) zawsze masz ryzyko że coś pójdzie nie tak. I to ryzyko najgrubszego gatunku (typu jenkins zielony, więc releasujesz, użytkownik nie może w ogóle wejść do danej funkcji).

Tutaj trochę n.t.
https://www.altkomakademia.pl/baza-wiedzy/qna/discussion/1020/smoke-testy-czym-sa/p1

edytowany 2x, ostatnio: vpiotr
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0
  1. Warto
  2. Ale niekoniecznie z poziomu frontendu i selenium. Przecież możesz zrobić e2e na poziomie samych serwisów i jsona, a nie koniecznie co się wyświetli w UI. Takie testy są prawie że tak samo użyteczne, a 100 razy łatwiejsze w utrzymaniu.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Zobacz pozostałe 3 komentarze
TD
@jarekr000000: tylko że ten GET może zwracać jakiś response bazując na logice biznesowej, prawda? Wydaje mi się to trochę trudne przetestować wszystkie przypadki na poziomie API (a nie jednostkowym). Chyba, że ktoś pisze CRUDa.
Shalom
@tdudzik: wiadomo ze nie zrobisz 100% pokrycia testami e2e czy integracyjnymi bo możesz mieć zwyczajnie za dużo kombinacji rożnych, ale to nie znaczy ze nie należy takich testów pisać.
jarekr000000
@tdudzik: nie testuje wszystkich przypadków na poziomie API. W zasadzie to robię na tym poziomie automatyczne testy akceptacyjne. Sprawdzam kontrakt. Dla danego stanu aplikacji -> ma byc taka konkretnie odpowiedź.
TD
@Shalom nie mówię że nie warto, właśnie interesuje mnie jak szczegółowe takie testy powinny być. Zazwyczaj wszystkie przypadki testuję jednostkowo na poziomie np. serwisu domenowego. Problem mam właśnie z tym jak testować serwisy aplikacyjne, infrastrukturę i REST API np. Jak szczegółowo, co mockować, itp.
jarekr000000
@tdudzik w sumie słuszne wątpliwości - bo takie testy REST to jedno. A faktyczne rest E2E, z cąłą infrastukturą, faktyczną baza, prawdziwym security, zewnętrznymi serwisami to zupełnie inna sprawa. Tu znowu robię tylko kilka smoków (żeby sprawdzić, że wsio wstało). Na ogół nawet nie moge tego dobrze sprawdzić głębiej - za dużo zależności i problemów z 3rd party systemami. Ale też zwykle nie wychodzi, że trzeba.
M6
  • Rejestracja:ponad 8 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Beskid Śląski
  • Postów:14
0

Kontekst jest taki: robimy dość duży system bankowy, w tle pracuje na ten moment jakieś 15 naszych serwisów + kilka innych, od których jesteśmy zależni + rozrośnięty ponad miarę frontend + zależności typu komunikacja z innymi bankami. Ze względu na złożoność interakcji tego wszystkiego, testy e2e wydają się być dość prostym sposobem na przetestowanie, czy wszystko faktycznie do siebie pasuje, bez mockowania żadnych zależności.

Testy akceptacyjne oczywiście mnóstwo ok, piszemy ich sporo, Wiremock 4ever, ale no właśnie - mockowanie zostaje.

Obecnie mamy tych testów selenium grubo ponad 200, przy czym niektóre są dość rozbudowane. Od kiedy przerzuciliśmy to na SeleniumBox to przynajmniej całość leci jakieś 1:30h, zamiast dotychczasowych 6 - więc problem powolnego feedbacku jest po części rozwiązany. Jak pisałem - moje wątpliwości co do sensu całego przedsięwzięcia związane są z tym, że błędy w raporcie to u nas w większości kwestia złych danych testowych lub niedopasowania testów do zmian w implementacji, przy czym prostowanie tego kosztuje naprawdę sporo czasu.

Uznaliśmy, że ok 60% tych testów należy deaktywować, a skupić się jedynie na utrzymaniu zbioru funkcjonalności, które koniecznie muszą działać.

Ogólnie uważam, że idea sama w sobie może i jest dobra, ale należy się dwa razy zastanowić czy oraz przede wszystkim co testować. Łatwo można skończyć z hałdą kodu, który trzeba jakoś utrzymywać, natomiast zespół zadziwiająco szybko przywyka do tego, że raport z jenkinsa jest nieco czerwony :)

edytowany 1x, ostatnio: MW600
SL
  • Rejestracja:ponad 7 lat
  • Ostatnio:prawie 6 lat
  • Postów:236
0

W poprzedniej hucie były wykorzystywane testy automatyczne wykonywane przez Selenium, ale tylko na preprodukcji systemu do testowania wybranych funkcjonalności, które wykorzystywały integracje z innym systemem produktowym. Testy były uruchamiane na preprodukcji przed wdrożeniem wydania na produkcje. Obecna huta jest na etapie dywagacji czy testy automatyczne są do czegoś potrzebne:)

Korzyść z Selenium jest, ale jak była mowa w którymś z postów powyżej koniecznie trzeba się zastanowić co się chce testować i po co.

edytowany 1x, ostatnio: slowbro
no_solution_found
  • Rejestracja:prawie 18 lat
  • Ostatnio:5 dni
0

testy na selenium wg mnie winne być testami akcpetacyjnymi, które testują ścieżkę krytyczną, czyli czy użytkownik może się zalogować (i jeśli mówimy o sklepie) wejść na 1 z rzędu produkt i go kupić. Tyle.


Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)