Powrót do: Podstawy Testów Automatycznych w Selenium i Python cz. 2 – Twój pierwszy zestaw testów
Kodzimy – dodajemy importy
Kontynuujemy testowanie poznanej w części pierwszej kursu strony https://demobank.jaktestowac.pl/ oraz jej podstrony.
Na początek stworzymy nowy plik z testami auto_test_2.py w folderze demo_tests (w tym samym miejscu gdzie znajduje się plik z pierwszej części kursu).
Od razu dodamy do niego nowy import modułu unittest
, który oferuje wiele przydatnych metod do testowania i jest domyślnym modułem Pythona (więc nie trzeba go pobierać jak to było w przypadku Selenium).
import unittest
Następnie dodamy do niego znany nam import selenium
:
import unittest from selenium import webdriver
Zauważ, że nie musimy znowu pobierać pakietu Selenium i od razu jest on rozpoznawany. W poprzednim kursie zaimportowaliśmy ten pakiet i stał on się częścią obecnej instalacji języka Python, dzięki czemu możemy z niego teraz korzystać tak jak z wbudowanych pakietów.
Klasa oraz pierwszy test
Zapoznamy się tu z nowym pojęciem klasy w języku Python poprzez skorzystanie z instrukcji class
.
class MainTests:
Oto bardzo prosta deklaracja klasy. Używamy słowa kluczowego class
i nadajemy nazwę naszej klasie. W języku Python nazwę klasy konstruujemy ze standardowych znaków alfabetu łącząc poszczególne słowa zaczynając je od dużych liter. Czyli analogicznie chcąc zrobić klasę dla prostych testów nazwiemy ją SimpleTests
.
Jak zauważyłeś po nazwie klasy dajemy znak dwukropka :
co oznacza, że w następnych liniach musi znaleźć się kod potrzebny aby ta klasa się uruchomiła.
My od razu zabierzemy się za tworzenie specjalnej klasy z testami czyli rozwiniemy naszą deklarację klasy o dodanie nawiasów i wypełnieniem ich kodem z użyciem wcześniej zaimportowanego modułu:
class MainTests(unittest.TestCase):
Nasza klasa teraz korzysta (profesjonalnie: dziedziczy) z gotowych rozwiązań zaimplementowanych w module unittest
a dokładnie z innej klasy TestCase
, dlatego po nazwie naszej klasy w nawiasach dodaliśmy kod unittest.TestCase
.
Następnie dodajemy do naszej klasy kod: własną metodę, która jest właśnie naszym testem.
import unittest from selenium import webdriver class MainTests(unittest.TestCase): def test_demo_login(self): pass
Obowiązuje tu kilka zasad
- Korzystamy z instrukcji
def
tworząc metodę - W nawiasach po nazwie metody umieszczamy parametr
self
jest zawsze dodawany przy metodach, więcej o nim napiszemy w kolejnych lekcjach tego kursu – niemniej musi tam się znaleźć:) - Po deklaracji instrukcji umieszczamy znak dwukropka
:
, tak jak w przypadku klasy oznacza to, że będziemy dodawali w naszej metodzie kod 🙂 - Dodatkowo nazwę metody musimy zacząć od słowa test (np: test_strona_glowna) – dzięki czemu zostanie ona rozpoznana jako metoda testowa i tak też wykonana.
Warto zaznaczyć, że w Pythonie o przynależności danego wiersza do danej funkcji decyduje wielkość wcięcia. Dla przykładu powyższa deklaracja metody powinna posiadać jeden tabulator gdyż należy do klasy zadeklarowanej powyżej. To samo z ciałem metody, które wklejamy z naszego poprzedniego testu – powinno ono zawierać jedno wcięcie pod nazwą metody.
Kopiujemy kod który został stworzony w pierwszym kursie serii Podstawy Testów Automatycznych w Selenium i Python cz. I – Twój pierwszy test automatyczny. Upewniamy się, że adres testowanej strony to https://demobank.jaktestowac.pl/logowanie_etap_1.html, a oczekiwany tytuł to Demobank – Bankowość Internetowa – Logowanie i efekt końcowy to:
import unittest from selenium import webdriver class MainTests(unittest.TestCase): def test_demo_login(self): driver = webdriver.Chrome(executable_path=r"C:\TestFiles\chromedriver.exe") driver.get('https://demobank.jaktestowac.pl/logowanie_etap_1.html') title = driver.title print(title) assert 'Demobank - Bankowość Internetowa - Logowanie' == title driver.quit()
Uruchamianie klasy testowej
Można już uruchomić nowy test. W tym celu należy dodać nową konfigurację uruchomieniową dla klasy testowej co jest czymś odrobinę innym od konfiguracji uruchomieniowej dla pliku, z której korzystaliśmy w poprzednim kursie (różnice i szczegóły omówimy szerzej w kolejnych lekcjach tego kursu).
Jeśli użyjesz skrótu w prawym górnym rogu do uruchomienia testu lub skrótu klawiszowego SHIFT + F10 to wykorzystana zostanie ostatnia używana konfiguracja – czyli w naszym przypadku z poprzedniego kursu. Aby dodać nową konfigurację dla naszej klasy testowej przejdź do Run->Run..->Unittest MainTests a następnie z okienka, które się wyświetliło na środku ekranu wybierz interesującyą nas konfigurację zaczynającą się od Unittestest for auto_test_2…. Na screenach poniżej znajdują się poszczególne kroki:
Uwaga: Jeśli napotkałeś problemy przejdź do lekcji https://jaktestowac.pl/lesson/pt1-mk2-03-konfiguracje-uruchomieniowe-w-pycharm/ gdzie dokładnie wyjaśniamy dlaczego taka a nie inna konfiguracja uruchomieniowa została zaproponowana na powyższym screenie.
Teraz możesz już używać skrótu SHIFT + F10 czyli uruchomisz ostatnio używaną konfigurację testową.
Dodatkowo możesz przełączać się pomiędzy konfiguracjami uruchomieniowymi klikając strzałkę z prawej strony nazwy pliku w oknie konfiguracji w prawym górnym rogu IDE (zaznaczamy to na poniższym obrazku) aby powrócić do szybkiego uruchamiania auto_test_1.py.
Na dole obrazka oznaczyliśmy jak powinien przedstawiać się wynik puszczenia testów:
Hej, po odpaleniu testów, testy się wykonują jednak dostaję ResourceWarning, jakieś wskazówki jak się go pozbyć (jestem ultra początkująca, więc może to jakiś trywialny problem) 🙂
Hej 😉
1. Jak wygląda Twój kod testów, na którym pracujesz?
2. Czy ten błąd pojawia się zawsze?
3. Czy w między czasie restartowałaś komputer i np. spowodowało to pojawienie się/zniknięcie problemu? 🤔
Błąd wskazuje, że jakiś zasób (plik/serwis/webdriver, na który wskazuje subprocess z błędu) nie został poprawnie zamknięty 🙂 Myślę, że więcej szczegółów wyczytamy z Twojego kodu 😉
Cześć!
niestety pomimo wszystkich wskazówek związanych z dodawaniem, usuwaniem, a potem ponownym dodaniem konfiguracji ostatecznie mój kod nie działa tak jak powinien. Kod jest taki jak w tutku. Proszę o pomoc 🙂
Efekt: (wybaczcie, nie wiem jak wkleić żeby było w konsoli)
już nie ważne, błędy z odstępami 🙂
Hej,
To dobrze, że udało Ci się naprawić kod 😀
Jeśli chodzi o formatowanie – nie martw się, my się tym zajmujemy 🙂
Pozdrawiam,
Hej,
Mam tu taką sytuację:
https://gist.github.com/szafka/14e6df83382b246c0bddb30147e500f6
Nie do końca rozumiem czemu kod błędu jest zerowy skoro celowo wpisałem zły tytuł strony do przyrównania.
Chyba jednak nie udało mi się załadować tekstu 😀
Rezultat:
Hej,
Czy otworzyła Ci się przeglądarka Chrome?
Czy utworzyłeś nowy plik w tej lekcji, czy re-użyłeś tego z poprzedniej?
Podejrzewam, ze może być tutaj problem z konfiguracją. Jeśli reużyłes – to PyCharm ma złą konfiguracje uruchomieniową dla tego pliku. Jak naprawić konfigurację opisujemy w kolejnych lekcjach: https://jaktestowac.pl/lesson/pt1-mk2-03-konfiguracje-uruchomieniowe-w-pycharm/
Daj proszę znać o wynikach 🙂
Pozdrawiam,
No i szafa gra!
Dziękuję bardzo za wyjaśnienie i podpowiedź.
Faktycznie nie otwierała się przeglądarka, mało tego przy użyciu funkcji Run nie zauważyłem, że powinienem zrobić to dla unittest a robiłem dla .py
Ruszam dalej 🙂
A z innej beczki..
W jaki sposób wrzucać kod aby był czytelny – a nie taki zlany w całość?
Pozdrawiam 🙂
Ciesze się, że mogłem pomóc 😀
Jeśli chodzi o kod – to może być github, albo po prostu w komentarzu – my go później przeformatujemy 🙂
Lepsze sposoby formatowania kodu mamy na liście zadań, ale jeszcze na tym nie pracowaliśmy.
Pozdrawiam,
Nie rozumiem, dlaczego linia:
from selenium import webdriver
jest u mne cała wyszarzona – tak jakby PyCharm nie rozpoznawał pakietu Selenium. To dziwne, bo przechodząc przez poprzedni kurs (pomyślnie), zainstalowałem ten pakiet.
Cały test przebiega w porządku, rezultat jest taki, jak podaliście na screenie na końcu tej lekcji. Dziwne, nie rozumiem…
Chodzi mi o drugą linię w pliku; w kolejnych liniach, gdy ta fraza się pojawia, jest już rozpoznawalna – pojawiają się kolory.
Hej,
Wyszarzona linia może oznaczać, że dane moduły lub pakiety nie są używane w dalszej części pliku. W poniższym przykładzie linia
from selenium import webdriver
powinna być wyszarzona:Spowodowane jest to faktem, iż nie używamy modułu
webdriver
w naszej klasie testowej (ani ogólnie w kodzie w tym pliku).Ale jeśli tylko wykorzystamy moduł
webdriver
, to linia z importem nabierze kolorów – tak jak w poniższym przykładzie:Wyszarzanie importów przez IDE daje znam znać, że dany moduł/import nie jest używany w danym pliku. Pomaga to przy poprawie czytelności i sprzątaniu nieużywanych fragmentów kodu 🙂
Pozdrawiam,
Hej,
Mam pewien problem. Przy próbie odpalenia testów z konfiguracją dla Unittest pojawił się błąd
“‘Error running ‘rerun failed tests’:
Can’t rerun tests since test IDs can’t be resolved. Try to delete run configuration, and create new one using right click”
jeśli dobrze rozumiem, to po usunięciu konfiguracji Unittest, muszę dodać ją ponownie tylko, że nie wiem z jaką konfiguracją?
Hej
Ciekawy problem – spróbuj powalczyć z konfiguracjami. Tak jak napisałaś trzeba usunąć i dodać nową. Opisaliśmy to dokładnie w jednej z kolejnych lekcji (https://jaktestowac.pl/lesson/pt1-mk2-03-konfiguracje-uruchomieniowe-w-pycharm/)
To dziwne zachowanie z konfiguracjami jest znanym problemem w PyCharm i ufam, że z naszymi wytycznymi z lekcji uda się Tobie go przezwyciężyć 😀
Daj znać jak poszło 🙂
Cześć,
Rozpocząłem przygodę z Pythonem i mam problem w tej lekcji z odpaleniem skryptu.
Wygląda dosłownie tak jak na screenach jednak po uruchomieniu nie zwraca błędu:
”Process finished with exit code 0” ale również nic się nie dzieje, przeglądarka nie uruchamia się.
Hej,
Jest duża szansa, że problem leży w konfiguracji uruchomieniowej w PyCharmie – ta potrafi czasem być problematyczna, szczególnie na samym początku 😉
Ogólnie rzecz ujmując, pliki zawierające klasy testowe potrzebują innej konfiguracji, niż pliki zawierające proste skrypty.
Rzuć proszę okiem na odp na forum – Testy uruchamiane z klasą nie działają a bez klasy wszystko jest ok (Podstawy Automatyzacji Cz2 Lekcja 1 Kodzimy – klasa, pierwszy test i uruchomienie), gdzie Przemek wskazuje rozwiązanie problemu. Jeśli to nie pomoże to nie krępuj się – pisz śmiało i razem podrążymy ten problem!
Powodzenia!
Jeszcze dodam od siebie, że nowa konfiguracja czasem nie chce działać do momentu usunięcia wszystkich istniejących i dodania jej ręcznie – w lekcji którą podał Krzysiek jest to opisane krok po kroku.
Nie poddawaj się i walcz 😀 No i oczywiście czekamy na informację o twoich postępach!
Działa, dziękuję bardzo 🙂
Pozdrawiam,
W poprzedniej części zapomniano o prefiksie “r” przed ścieżką do chromedrivera, w tej już jest używany a nikt nic nie wspomniał 😉
Możliwe, że gdzieś to umknęło – możesz wskazać kod/lekcje/miejsce bez tego
r
? Bo z tego co widzę jest tenr
w poprzedniej części występuje i jest nawet opisany w drugim TIP w takiej lekcji https://jaktestowac.pl/lesson/pt1-mk1-05-drugi-kod-korzystamy-z-modulu-webdriver/#Uzycie_modulu. Możliwe, że w samym wideo tego nie było – czeka ono na odświeżenie 🙂Jestem osobą, która dopiero zaczyna swoją przygodę z Pythonem. Zainstalowałam Pythona 2.7. Jeśli używam kodu zamieszczonego w tej lekcji ale bez:
“class MainTests(unittest.TestCase):
def test_demo_login(self):”
to wszystko działa poprawnie. Kiedy chcę wykorzystać kod z lekcji przeglądarka otwiera się ale nie dzieje się już nic więcej.
Co może być przyczyną?
Z góry dziękuję za podpowiedź
Witaj
Przeniosłem twoje pytanie na nasze forum i tam też znajdziesz odpowiedź – https://jaktestowac.pl/question/testy-uruchamiane-z-klasa-nie-dzialaja-a-bez-klasy-wszystko-jest-ok-podstawy-automatyzacji-pt1-mk2-01
Śmiało pisz jak Ci poszło 🙂
Fajnie by było, jakby fragment kodu podany jako przykład z def i self, tj.
‘def test_main_page(self):
pass’,
był tej samej treści co cały kod w przykładzie niżej (tam jest już wpisane:
‘def test_demo_login(self):
pass’.
Jest to trochę mylące 🙂
Dzięki za zgłoszenie uwagi, poprawione 😉
Zachęcamy do dalszego zadawania pytań, w razie gdyby było coś niejasne 🙂
Pozdrawiamy