Cel lekcji

Zrobimy eksperyment i zepsujemy nasz test. Jednak będzie to coś więcej niż tylko kontrolowany błąd który łatwo naprawić. Poznamy pierwszą technikę jak reagować i usuwać błędy w naszym kodzie.

Wideo wersja lekcji

AKTUALIZACJA lekcji wideo:
W związku z odświeżeniem tekstu całej serii kursów – lekcje wideo mogą okazać się odrobinę nieaktualne. Pracujemy nad tym – mimo to pozostawiamy wersję wideo gdyż pokazane tam kroki są generalnie poprawne.

Nieprzechodząca asercja – jak sobie z nią radzić.

Zróbmy eksperyment i zepsujmy nasz test.

Powielamy linę z metodą driver.get(), Oryginalną linię komentujemy za pomocą znaku # (dzięki czemu nie będzie wykonywana). W niezakomentowanej kopii zmieniamy adres na https://demobank.jaktestowac.pl/logowanie_prod.html czyli:

#driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')
driver.get('https://demobank.jaktestowac.pl/logowanie_prod.html')

Uruchamiamy test i na konsoli widzimy:

 C:\Users\jaktestowac\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/jaktestowac/PycharmProjects/demo_test/auto_test_1.py
Demobank - Strong główna - Logowanie
Traceback (most recent call last):
  File "C:/Users/jaktestowac/PycharmProjects/demo_tests/auto_test_1.py", line 8, in 
    assert  'Demobank - Bankowość Internetowa - Logowanie' == title
AssertionError

Process finished with exit code 1

Przeanalizujmy tekst błędu z konsoli

  1. W pierwszej linii otrzymujemy informację o uruchomieniu: z jakiego Pythona skorzystaliśmy oraz jaki skrypt został uruchomiony.
  2. Druga to wypisany przez nas aktualny tytuł.
  3. Kolejna linia to jakby legenda, mamy słowo Traceback czyli opis stanu aplikacji w momencie wystąpienia błędu. Mianem traceback możemy nazwać cały opis błędu wypisanego na konsole w razie niepowodzenia uruchomienia skryptu.
  4. Czwarta linia to dokładna nazwę pliku oraz linię w której wystąpił błąd. Gdybyśmy zmienili nasz skrypt w moduł to dla wartości <module> otrzymalibyśmy jego nazwę.
  5. W linii piątej wskazane jest wyrażenie generujące błąd
  6. W szóstej linii zaprezentowana jest nazwa błędu
  7. Finalnie zaprezentowany jest exit code, który zazwyczaj będzie miał wartość 0 lub 1 co odpowiednio oznacza powodzenie lub niepowodzenie wykonania programu czy skryptu.

Z traceback widać, że nasza asercja spowodowała przerwanie wykonywania kodu ze względu na bliżej nieokreślony błąd 😉 .

TIP: Gdy coś nie działa w twoim kodzie należy spokojnie i analitycznie podejść do problemu gdyż większość wynika z błahych powodów jak literówka czy brak wcięcia.
Najpierw należy dokładnie zapoznać się z tekstem błędu z konsoli uruchomieniowej i odnaleźć linię w naszym kodzie która generuje błąd. Nie zawsze to jest oczywiste i proste, dlatego nie zrażaj się gdy natrafisz na problemy. Potraktuj to jako świetne ćwiczenie rozwijające umiejętności programowania. Gdy nie znajdziesz odpowiedzi zawsze napisz na naszym forum lub zostaw komentarz 🙂

Z pewnością nurtuje Ciebie pytanie czemu nie ma dokładnej informacji dlaczego asercja nie przeszła? Niestety ten rodzaj asercji sprawdza tylko wartość poprawną bądź błędną jednak istnieją pakiety, które wypiszą na konsolę o wiele więcej informacji (użyjemy ich w kolejnym kursie).

Na obecną chwilę możemy stwierdzić, że warunek równości 'Demobank - Bankowość Internetowa - Logowanie' == title nie jest spełniony. Pasowało by się dowiedzieć co ma w sobie title. Wcześniej w kodzie użyliśmy funkcji print() do wypisania wartości dla title na konsolę i właśnie z tego pomysłu skorzystamy. Porównując spodziewaną wartość z aktualną wartością zmiennej title można wywnioskować, że któraś z nich jest niepoprawna.

TIP: Czasem nie jest oczywiste gdzie leży problem. Może się tak zdarzyć, że to nasze testy są nieaktualne i nowe wartości na stronie są poprawne. Automaty jedynie wykrywają zmiany, a zidentyfikowanie problemu i jego usunięcie to już osobne działania związane z rozmową z osobami tworzącymi daną stronę i analizą wdrażanych wymagań.

TIP: Jako wartości dla do porównania zmiennej title użyliśmy tekstu rozpoczynającego się i zakończonego apostrofem ' . Taką konstrukcję nazywamy łańcuchem znakowym, albo krótko string). Stosując w string na końcu i na początku apostrofy ' sprawiamy, że Python rozumie, że nie jest to jakaś specjalna nazwa tylko zwykły tekst, Tekst jest wczytywany od pierwszego apostrofu do kolejnego.
A co się stanie jak w tekście wystąpi apostrof? Nasz program prawdopodobnie nie zadziała. Dlatego możemy użyć na szybko alternatywę w postaci znaku cudzysłowu " do otoczenia naszego łańcucha znakowego np: "Rozmawiałem ze Steve'em". Analogicznie można zrobić z cudzysłowem czyli 'Powiedział "Hi"'.

A co jeśli będziemy chcieli w naszym tekście zarówno z apostrofów i cudzysłowów? Stosujemy wtedy tak zwany escaping czyli dodanie w tekście przed każdym apostrofem bądź cudzysłowem znaku \ (backslash) np: 'Rozmawiałem ze Steve\'em. Powiedział "Hi"' lub "Rozmawiałem ze Steve'em. Powiedział \"Hi\"" . Gdy będziemy wyświetlać ten string na konsole backslash-e zostaną usunięte.

No i oczywiście możemy na wszystkich ' i " zrobić escaping i nie ma znaczenia co zastosujemy do otoczenia naszego tekstu: 'Rozmawiałem ze Steve\'em. Powiedział \"Hi\"' i "Rozmawiałem ze Steve\'em. Powiedział \"Hi\""

Pamiętaj aby zawsze używać innych bądź “eskejpowanych” apostrofów lub cudzysłowów niż te którymi rozpoczyna i kończy się string.

Wracamy do poprawnej wersji driver.get() czyli:

driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html')

Usuń lub zakomentuj (pamiętasz? Znak # na początku linii) niepotrzebną linię z pobraniem strony powodującej błąd w asercji.

Sprzątamy i podsumowujemy

Aby ułatwić sobie sprawę dodaję automatyczne zamykanie przeglądarki poprzez użycie metody drivera quit() czyli wpisuję na końcu linię:

driver.quit()
TIP: poza metodą quit() występuje również metoda close(), która także bywa używana do zamykania przeglądarki po testach. Aczkolwiek występują pewne różnice w ich zachowaniach, o których warto pamiętać i mieć je na uwadze. Więcej o nich dowiesz się w naszym słowniku – driver.close() vs. driver.quit(). Ogólnie zalecamy stosować quit(), która zamyka całą przeglądarkę w poprawny sposób 😉

No i test zakończony – zobacz exit code na konsoli. Poznaliśmy traceback gdy wystąpi błąd i jak wstępnie dokonać jego analizy oraz użyliśmy nowej metod dla driver. Następna lekcja to prezentacja całego rozwiązania z tego kursu i zadania indywidualne dla Ciebie.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *