Spis treści:

Kurs z zatrudnieniem: „Profesjonalny programista Python”
Dowiedz się więcejStworzenie działającego kodu to dopiero połowa sukcesu. Ważne jest nie tylko zaimplementowanie funkcjonalności, ale także zapewnienie dokładnych i poprawnych wyników. Wysokiej jakości kod musi być testowalny i niezawodny, aby zapewnić bezbłędne wykonywanie zamierzonych zadań.
Testowanie oprogramowania można przeprowadzić ręcznie, wielokrotnie uruchamiając aplikację w różnych warunkach i sprawdzając jej poprawność. Jednak bardziej efektywnym podejściem jest automatyzacja tego procesu za pomocą specjalistycznych narzędzi. Jednym z takich narzędzi jest Pytest, który umożliwia tworzenie testów kodu, upraszczając proces weryfikacji jego funkcjonalności. Pytest oferuje wygodny i wydajny interfejs do pisania testów, co czyni go idealnym wyborem dla programistów chcących poprawić jakość swojego kodu. Automatyczne testowanie z użyciem Pytest nie tylko przyspiesza proces identyfikacji błędów, ale także przyczynia się do zwiększenia niezawodności i stabilności oprogramowania.
W tym artykule znajdziesz informacje na temat różnych aspektów interesującego Cię tematu. Omówimy kluczowe punkty i udzielimy przydatnych wskazówek i trików, które pomogą Ci lepiej zrozumieć temat. Czytaj dalej, aby zgłębić temat i zdobyć cenną wiedzę.
- Czym jest Pytest?
- Jakie są jego zalety i wady?
- Jak zainstalować Pytest?
- Jak pisać testy?
- Czym są fixtures w Pytest?
- Jakie etykiety testów znajdują się w Pytest?
Czym jest Pytest?
Pytest to potężne środowisko do testowania kodu Pythona, opracowane w 2004 roku i stale aktualizowane. To narzędzie umożliwia programistom nie tylko pisanie testów, ale także tworzenie środowisk testowych i dostosowywanie ich parametrów wykonania. Pytest obsługuje prostą i zrozumiałą strukturę testów, co czyni go popularnym wyborem wśród programistów. Dzięki swojej elastyczności i rozszerzalności, Pytest pozwala na integrację różnych wtyczek i dostosowanie procesu testowania do indywidualnych potrzeb projektu. Korzystanie z Pytest pomaga poprawić jakość kodu i uprościć proces testowania, dzięki czemu jest to niezbędne narzędzie w arsenale programistów Pythona.
Według badania JetBrains, co drugi programista Pythona używa Pytest w swojej pracy.

Zalety i wady Pytest
Zalety Pytest w porównaniu z konkurencją, taką jak Unittest, czynią go skutecznym narzędziem testowym. Pytest oferuje łatwość obsługi i wygodną składnię, umożliwiając programistom szybkie rozpoczęcie pisania testów. Dzięki swojej elastyczności Pytest obsługuje zarówno proste, jak i złożone scenariusze testowe, dzięki czemu nadaje się do projektów dowolnej wielkości. Ponadto Pytest posiada potężny system wtyczek, który rozszerza jego funkcjonalność i pozwala dostosować testowanie do konkretnych potrzeb. Warto również zwrócić uwagę na możliwość równoległego uruchamiania testów, co znacznie przyspiesza proces testowania. Te cechy sprawiają, że Pytest jest popularnym wyborem wśród programistów i przyczyniają się do jego sukcesu na rynku narzędzi testowych.
- Zwięzły kod. Składnia Pytesta nie zawiera uciążliwych konstrukcji, w przeciwieństwie do Unittesta. Prosty test może składać się z zaledwie dwóch wierszy.
- Szczegółowe raportowanie błędów. Jeśli test się nie powiedzie, Pytest wyjaśni problem.
- Uniwersalne polecenie assert. Nie trzeba pamiętać jego różnych typów, jak w Unittest.
- Fixtures. Umożliwiają utworzenie kontekstu dla grupy testów naraz.
- Etykiety. Można dostosować zachowanie testu: ustawić warunki uruchomienia, przekazać różne dane wejściowe do tego samego testu itd.
- Możliwość uruchamiania testów z innych frameworków. Unittest, Doctest i Nose są kompatybilne z Pytest.
- Wiele wtyczek. Jeśli brakuje jakiejś gotowej funkcji, dla Pytest napisano ponad tysiąc wtyczek. Co więcej, 180 z nich zostało zaktualizowanych w 2023 roku, a kolejne 360 w 2022 roku.
Pomimo swoich zalet, framework ma również pewne wady. Jedną z głównych wad jest trudność w nauce, zwłaszcza dla początkujących. Może to prowadzić do znacznego przyspieszenia procesu uczenia się. Ponadto frameworki czasami nakładają ograniczenia na elastyczność rozwoju, co może utrudniać wdrażanie niestandardowych rozwiązań. Niektórzy programiści zauważają również, że wydajność frameworków może być niższa w porównaniu z czystym kodem, szczególnie w projektach wymagających dużej szybkości. Ważne jest, aby wziąć te aspekty pod uwagę przy wyborze frameworka programistycznego, aby optymalnie spełnić potrzeby projektu.
- Niejasność i magia. Prostota i zwięzłość mają swoją wadę: wiele procesów zachodzi „pod maską”. Aby zrozumieć je szczegółowo, należy zapoznać się z dokumentacją.
- Nie wchodzi w skład biblioteki standardowej. Pytest należy zainstalować osobno. Jeśli posiadasz starszą wersję Pythona (poniżej 3.7), musisz połączyć się z odpowiednią wersją frameworka. Listę znajdziesz tutaj.
- Inne frameworki są niekompatybilne z Pytest. Nieunikniona konsekwencja jego wiodącej, niemal królewskiej pozycji: Pytest może uruchamiać testy z innych frameworków, ale żaden inny framework nie może uruchamiać testów Pytest. To współczesna interpretacja starożytnego rzymskiego przysłowia: „Co wolno Jowiszowi, nie wolno bykowi”.
Jak zainstalować Pytest
Pytest to jedno z najpopularniejszych narzędzi do testowania w Pythonie. Jego najnowsza wersja obsługuje Pythona 3.7 i nowsze, a także PyPy 3. Aby zainstalować Pytest w środowisku wirtualnym, użyj następującego polecenia:
Aby zainstalować najnowszą wersję pytest, uruchom polecenie pip install -U pytest. To polecenie aktualizuje pakiet pytest do najnowszej wersji, zapewniając dostęp do najnowszych funkcji i poprawek. pytest to potężne narzędzie do testowania w Pythonie, które pozwala programistom łatwo pisać i uruchamiać testy. Regularne aktualizowanie pytest zapewnia korzystanie z najnowszych funkcji i ulepszeń, co przekłada się na wyższą jakość kodu i mniejszą liczbę błędów. Ważne jest, aby być na bieżąco z aktualizacjami i używać polecenia pip install -U pytest, aby utrzymać aktualność zestawu narzędzi testowych.
Alternatywnie, pytest można zainstalować za pomocą menedżera pakietów zintegrowanego środowiska programistycznego (IDE). W tym narzędziu znajdź moduł pytest i pobierz go do wykorzystania w swoich projektach.
Jak pisać testy
Najpierw musisz przygotować kod, który będzie używany do testowania. Utwórz plik o nazwie main.py i zaimplementuj funkcję sum2. Funkcja ta będzie przyjmować dwa argumenty i zwracać ich sumę.
Teraz sprawdźmy, jak działa ta funkcja. Aby to zrobić, utwórz plik tests.py, zaimportuj funkcję sum2, a następnie napisz test test_sum2. Pomoże to upewnić się, że funkcja działa poprawnie i zidentyfikować możliwe błędy.
Aby uruchomić testy, użyj polecenia pytest w konsoli. Możesz również skorzystać z interfejsu swojego IDE; na przykład PyCharm ma możliwość uruchomienia całego pliku lub pojedynczej funkcji testowej. Upraszcza to proces testowania i pozwala szybko sprawdzić poprawność kodu.
Aby osiągnąć pożądany rezultat, musisz wykonać pewne kroki. Przede wszystkim ważne jest zdefiniowanie celów i zadań, które chcesz rozwiązać. Następnie należy zgromadzić wszystkie niezbędne zasoby i narzędzia. Następnie należy rozpocząć wdrażanie planu, pamiętając o monitorowaniu procesu i wprowadzaniu niezbędnych korekt. W rezultacie otrzyma się produkt końcowy, który spełni Państwa oczekiwania i wymagania. Prawidłowa organizacja i kolejność działań to kluczowe czynniki sukcesu.
Teraz zmieńmy nasz test tak, aby oczekiwał 0 zamiast 23. Pozwoli nam to sprawdzić, jak system obsługuje wartości inne niż oczekiwane. Takie podejście pomoże zidentyfikować ewentualne błędy i poprawić stabilność aplikacji. Sprawdzanie wartości zerowych jest ważne dla zapewnienia poprawnego działania oprogramowania i jego adaptacji do różnych scenariuszy.
Użytkownik otrzyma powiadomienie o niepowodzeniu testu.
Aby Pytest rozpoznawał funkcje jako testy, należy przestrzegać pewnych zasad dotyczących nazewnictwa plików i samych testów. Pliki zawierające testy muszą mieć nazwy zaczynające się od ‘test_’ lub kończące się na ‘_test’. Funkcje przeznaczone do testowania powinny być nazywane podobnie — zaczynając od ‘test_’. Przestrzeganie tych zasad zapewnia poprawne działanie Pytest i upraszcza proces uruchamiania testów.
- nazwa pliku musi zaczynać się od test lub kończyć na test.py;
- nazwa funkcji musi być napisana małymi literami i zaczynać się od test_.
Słowo kluczowe «assert» pozwala na przekazanie dowolnego warunku do sprawdzenia. Jeśli warunek jest prawdziwy (zwraca True), test jest uznawany za zaliczony. W przeciwnym razie, jeśli warunek jest fałszywy (zwraca False), test kończy się niepowodzeniem. Użycie assert pomaga w automatyzacji testów i zapewnia niezawodność kodu, umożliwiając szybką identyfikację błędów i niespójności.
Minimalne testy można utworzyć w następujący sposób:
Podczas korzystania z Pytest można dodać komunikaty debugowania po warunkach. Komunikaty te zostaną wyświetlone, jeśli test zakończy się niepowodzeniem. Upraszcza to proces diagnostyki błędów i pomaga szybko znaleźć przyczyny niepowodzeń testów.
Test bez instrukcji assert jest uznawany za pomyślny.
Oczywiście, prosimy o podanie tekstu, który należy przepisać i dostosować do SEO.
Notatka to ważny element, który może zawierać dodatkowe informacje lub wyjaśnienia do tekstu głównego. W kontekście pisania artykułów lub prac badawczych, notatki służą do wyjaśnienia terminów, cytowania źródeł lub dostarczania dodatkowych informacji, które mogą być przydatne dla czytelnika. Korzystanie z notatek pomaga uniknąć zaśmiecania tekstu głównego i czyni go bardziej czytelnym, zachowując jednocześnie wszystkie niezbędne szczegóły. Prawidłowo sformatowane notatki poprawiają również optymalizację pod kątem wyszukiwarek (SEO), ponieważ wyszukiwarki biorą pod uwagę strukturę i kompletność prezentowanych informacji. Należy pamiętać, że notatki powinny być zwięzłe i jasne, aby nie odwracać uwagi czytelnika od głównej idei.
Pojedynczy test może zawierać wiele instrukcji assert, ale takie podejście nie jest optymalne. Zaleca się przestrzeganie zasady „Jeden test – jedna jednostka, jedna funkcja – jedna asercja”. Poprawia to czytelność testów, upraszcza proces debugowania i zwiększa stabilność zestawu testowego. Użycie jednej asercji w każdym teście sprawia, że wyniki są bardziej zrozumiałe i ułatwia identyfikację przyczyn potencjalnych błędów.
Polecenie terminala pytest umożliwia uruchomienie wszystkich testów znajdujących się w bieżącym katalogu. Aby uzyskać dokładniejszą kontrolę nad procesem testowania, można określić ścieżkę do konkretnego pliku, a nawet wybranej funkcji. Pozwala to dostosować wykonywanie testów do własnych potrzeb i upraszcza proces debugowania. Użycie pytest do uruchamiania testów sprawia, że proces testowania jest bardziej elastyczny i wydajny.
- Polecenie do uruchomienia pliku tests.py to pytest tests.py.
- Polecenie do uruchomienia funkcji test_sum2 i tylko ona to pytest tests.py: test_sum2.
Aby wydajniej uruchamiać testy w Pytest, można użyć dodatkowych flag. Pełną listę dostępnych flag można znaleźć w dokumentacji Pytest. Umożliwi Ci to dostosowanie wykonywania testów do Twoich wymagań i usprawnienie procesu testowania.
Możesz również korzystać z graficznego interfejsu IDE wraz z poleceniami terminala. W tym artykule pokażemy uruchamianie testów za pomocą narzędzi PyCharm. Takie podejście upraszcza proces testowania i czyni go bardziej wizualnym dla programistów.
Fixtures w Pytest
Fixtures to funkcje służące do tworzenia środowiska testowego. Są one szczególnie przydatne, gdy musisz dostarczyć te same dane wejściowe dla wielu testów. Korzystanie z Fixtures pozwala ulepszyć strukturę testów i zwiększyć ich czytelność, a także zmniejszyć duplikację kodu. Dzięki temu proces testowania jest bardziej wydajny i łatwiejszy w zarządzaniu.
Plik main.py może definiować różne funkcje, z których każda wykonuje określone zadania. Funkcje te mogą obejmować przetwarzanie danych, obliczenia lub interakcję z użytkownikiem. Strukturyzacja kodu w postaci funkcji sprzyja czytelności oraz ułatwia jego konserwację i modyfikację. Optymalizacja i prawidłowa organizacja funkcji w pliku main.py pomaga również innym programistom lepiej zrozumieć Twój kod i poprawia SEO Twojego projektu, jeśli zostanie on opublikowany online. Upewnij się, że każda funkcja ma jasny cel i opis, co pomoże nie tylko podczas tworzenia, ale także w przyszłej promocji Twojego produktu.
Utworzymy testy dla każdego przypadku w pliku tests.py. Użyjemy listy liczb pierwszych z zakresu od 1 do 50 jako tablicy testowej. Do wygenerowania tej listy użyjemy pętli for-else.
We wszystkich funkcjach testowych używamy tej samej uciążliwej konstrukcji do generowania listy liczb pierwszych. Aby poprawić czytelność kodu i uprościć jego konserwację, przeniesiemy tę konstrukcję do osobnego fixture. Aby to zrobić, musisz jawnie zaimportować moduł pytest. To nie tylko uprości testowanie, ale także zwiększy wydajność pracy z kodem.
Aby zdefiniować funkcję jako fixture w pytest, musisz użyć dekoratora @pytest.fixture(). Ten dekorator umożliwia tworzenie funkcji pomocniczych w testach, zapewniając przygotowanie niezbędnych danych lub stanu przed uruchomieniem testów. Fixtures można wykorzystać do skonfigurowania środowiska testowego, co czyni je niezbędnym narzędziem do wydajniejszego i bardziej ustrukturyzowanego testowania w Pythonie. Korzystanie z Fixtures pomaga uniknąć duplikacji kodu i upraszcza proces testowania, umożliwiając łatwe zarządzanie zależnościami między testami.
Teraz musisz używać tego Fixture'a we wszystkich testach, które go wymagają. Odwołując się do Fixture'a, nie używaj nawiasów, ponieważ jest on traktowany jako zmienna, a nie funkcja.
Uruchamiane przez nas testy wyglądają następująco:
Jeśli chcesz, aby po zakończeniu testu uruchomiono dodatkowy skrypt, możesz to zrobić za pomocą funkcji „fixtures”. Zamiast słowa kluczowego return użyj funkcji „yield”. Kod po funkcji „yield” zostanie wykonany po zakończeniu testu. Pozwala to kontrolować sekwencję wykonywania i dodać niezbędną logikę do ukończenia testu. W ten sposób możesz efektywnie zorganizować proces testowania i upewnić się, że wszystkie wymagane działania zostaną wykonane.
W naszym przykładzie z liczbami pierwszymi modyfikujemy funkcję „get_prime_nums()”, dodając do niej finalizator. Ta zmiana usprawni zarządzanie zasobami i uprości proces czyszczenia po uruchomieniu testów. Dodając finalizator, możemy zapewnić, że wszystkie niezbędne działania po zakończeniu funkcji „fixtures” zostaną wykonane poprawnie. W rezultacie testowanie liczb pierwszych stanie się bardziej wydajne i niezawodne.
Po uruchomieniu testu otrzymujemy następujący wynik:
Jeśli test zakończy się niepowodzeniem, a asercja zwróci wartość False, kod w bloku finalizatora nadal zostanie wykonany. Zapewnia to, że operacje czyszczenia, takie jak czyszczenie zasobów lub rejestrowanie, są wykonywane nawet w przypadku niepowodzenia testu.
Fixtures umożliwiają dostosowanie zakresu, w którym działają. Domyślnie ten zakres to zakres funkcji. Oznacza to, że po zakończeniu funkcji testowej, fixtures jest uzupełniany i niszczony. Przy następnym wywołaniu fixtures jest tworzony ponownie. Mechanizm ten jest dobrze zilustrowany przykładem finalizatora. Ustawienie zakresu fixtures odgrywa ważną rolę w zarządzaniu zasobami i utrzymywaniu czystości środowiska testowego.
Zakres fixtures jest ustawiany w jego dekoratorze za pomocą argumentu scope=’scope’. Istnieje pięć różnych poziomów zakresu fixtures.
- ‘function’ — dla funkcji;
- ‘class’ — dla klasy;
- ‘module’ — dla modułu (tj. pliku py);
- ‘package’ — dla pakietu;
- ‘session’ — dla całej sesji testowej.
Dostosujmy zakres funkcji get_prime_nums, zmieniając go na modularny. Spowoduje to ograniczenie dostępu do tej funkcji tylko w obrębie określonego modułu, co zwiększy poziom hermetyzacji i sprawi, że kod będzie łatwiejszy w zarządzaniu. Modularny zakres funkcji pomaga zmniejszyć prawdopodobieństwo konfliktów nazw i uprości testowanie.
Przeanalizujmy, jak zmieni się proces testowania.
W tym przykładzie funkcja jest wywoływana tylko raz, przy pierwszym dostępie do niej w funkcji. Następnie wynik jej wykonania jest buforowany, co pomaga uniknąć powtarzających się wywołań. Finalizator jest wykonywany tylko raz, na końcu przetwarzania pliku. Optymalizuje to wydajność i oszczędza zasoby, ponieważ unika się powtarzających się obliczeń.
Do jednego testu można przekazać nieograniczoną liczbę obiektów testowych (fixtures), oddzielając je przecinkami. Obiekty testowe można również przekazywać do innych obiektów testowych w dowolnej liczbie, co zapewnia elastyczność i wygodę podczas testowania.
Obiekt testowy get_prime_nums można podzielić na kilka części, choć w tym przypadku nie byłoby to praktyczne. Podzielenie funkcji na mniejsze komponenty może ułatwić testowanie i konserwację, ale w tym konkretnym przypadku takie podejście nie przyniesie znaczących korzyści. Należy pamiętać, że optymalizacje kodu powinny być uzasadnione i spełniać określone wymagania projektu.
Należy wyraźnie wskazać, które obiekty testowe są używane w funkcji lub innych obiektach testowych. Ułatwia to śledzenie i zarządzanie zależnościami danych. Prawidłowa dokumentacja obiektów testowych sprzyja efektywniejszemu testowaniu i poprawia zrozumienie kodu, co jest szczególnie ważne podczas pracy w zespole.
Uwaga:
Ten tekst stanowi ważny punkt odniesienia dla zrozumienia kluczowych aspektów omawianego tematu. Zawiera istotne informacje i zalecenia, które pomogą Ci lepiej przyswoić materiał. Zwróć uwagę na główne punkty, które mogą wpłynąć na Twoje postrzeganie i działania. Efektywne wykorzystanie dostarczonych danych pozwoli Ci pogłębić zrozumienie tematu i poprawić umiejętności. Pamiętaj, że informacje wymagają ciągłej analizy i rewizji, aby zachować aktualność w szybko zmieniającym się świecie.
Fixmenty o szerszym zakresie nie mogą być osadzane w fixturach o mniejszym poziomie. Ważne jest, aby pamiętać o tym ograniczeniu podczas projektowania i używania fixturów, aby zapewnić prawidłowe działanie systemu i uniknąć potencjalnych konfliktów. Prawidłowe przestrzeganie tej praktyki pomoże zachować integralność danych i usprawnić zarządzanie projektem.
W niektórych przypadkach może być konieczne automatyczne wykonanie fixturu, nawet jeśli odpowiadająca mu funkcja go nie wywołuje. Jest to szczególnie ważne przed uruchomieniem testów, gdy wymagana jest autoryzacja w systemie. Automatyczna inicjalizacja fixturów pomaga zapewnić spójność środowiska testowego i wyeliminować potencjalne błędy związane z brakiem niezbędnych warunków testowych.
W takich sytuacjach można użyć parametru autouse w dekoratorze @pytest.fixture, ustawiając jego wartość na True. Spowoduje to automatyczne zastosowanie fixtury do wszystkich testów bez konieczności ich jawnej specyfikacji. Dzięki temu podejściu można znacznie uprościć strukturę testów i poprawić ich czytelność.
Należy zachować ostrożność podczas używania parametru autouse w fixturach. Fixtury te mogą wprowadzać niejawne zależności i modyfikować dane w nieprzewidywalny sposób, co może negatywnie wpłynąć na wynik testu. Jest to szczególnie ważne, jeśli projekt wykorzystuje dużą liczbę fixturów w złożonej hierarchii. Zaleca się dokładną analizę struktury i wzajemnych powiązań fixturów, aby uniknąć potencjalnych problemów i zapewnić bardziej przewidywalne testowanie.
Etykiety testów
Pytest umożliwia dostosowywanie wykonywania testów za pomocą etykiet. Etykiety te można stosować zarówno do pojedynczych funkcji testowych, jak i całych klas testów. Aby dodać etykietę, należy użyć dekoratora: @pytest.mark.*nazwa etykiety*. Pozwala to na bardziej elastyczną organizację i zarządzanie testami, a także ułatwia ich wybieranie podczas wykonywania. Używanie etykiet w Pytest pomaga ulepszyć strukturę testów i zoptymalizować proces testowania.
Pytest pozwala uruchamiać tylko testy oznaczone określonymi etykietami. Aby to zrobić, użyj polecenia w terminalu z argumentem -m, na przykład: pytest -m «nazwa etykiety». Możliwe jest również uruchomienie wszystkich testów z wyjątkiem tych z określoną etykietą. W takim przypadku polecenie będzie wyglądać następująco: pytest -m «not label name». Używanie etykiet w Pytest pozwala na elastyczne zarządzanie procesem testowania, co jest szczególnie przydatne w dużych projektach wymagających selektywnego wykonywania testów.
Każdy test lub klasa w pytest może mieć nieograniczoną liczbę etykiet. Aby zobaczyć pełną listę znaczników, użyj polecenia pytest —markers— i zapoznaj się z dokumentacją. W tym artykule omówimy podstawowe znaczniki, które pomogą Ci lepiej organizować i zarządzać testami.
Aby pominąć test, ustaw znacznik pominięcia. Opcjonalnie możesz dodać parametr reason=’skip reason’, aby określić konkretny powód. Na przykład:
Znacznik skipif przyjmuje dwa argumenty. Pierwszy argument to warunek: jeśli jest prawdziwy (True), test zostanie pominięty; w przeciwnym razie (False), test zostanie wykonany normalnie. Drugi argument, podobnie jak znacznik skip, pozwala określić ciąg znaków z powodem pominięcia testu. Użycie tego znacznika pomaga kontrolować wykonywanie testu w oparciu o określone warunki, co może poprawić wydajność testowania i uniknąć niepotrzebnych błędów w trakcie procesu.
Wynik pozostaje niezmieniony, tak jak w poprzednim przypadku.
Testy oznaczone jako xfail w Pytest mogą mieć dwa wyniki. Jeśli test zakończy się pomyślnie, zostanie oznaczony jako XPASS. Jeśli test zakończy się niepowodzeniem, co jest zgodne z oczekiwanym wynikiem, zostanie oznaczony jako XFAIL. Należy pamiętać, że żaden z tych wyników nie wpływa na ogólny stan zestawu testów.
Xfail oferuje kilka funkcji podobnych do skipif. Można określić warunek, w którym test ma zakończyć się niepowodzeniem, i określić parametr „reason”, aby wyjaśnić przyczynę. Dodatkowo xfail udostępnia następujące funkcje:
- dodaj wyjątek do raises=*exception name*;
- nie uruchamiaj testu w ogóle z run=False (wtedy zostanie on automatycznie uznany za XFAIL);
- spraw, aby niepowodzenie testu spowodowało niepowodzenie całego zestawu testów z strict=True.
Dowiedz się więcej o możliwościach xfail w oficjalnej dokumentacji.
Etykieta parametrize została zaprojektowana do uruchamiania tego samego testu z różnymi danymi wejściowymi. Jest to niezbędne narzędzie do sprawdzania wielu różnych scenariuszy, co jest szczególnie ważne w testowaniu oprogramowania. Użycie tej etykiety może znacznie zmniejszyć ilość kodu i poprawić jego czytelność, ponieważ jeden test można sprawdzić na wielu zestawach danych. Poprawia to jakość testowania i pomaga identyfikować potencjalne błędy i wady w aplikacji.
W tym artykule omówimy funkcję, która określa, czy liczba jest dodatnia, czy ujemna. Funkcja ta pomaga szybko i skutecznie klasyfikować wartości liczbowe, co może być przydatne w różnych aplikacjach i programowaniu. Określanie znaku liczby jest fundamentalnym elementem pracy z obliczeniami matematycznymi i analizą danych. Przeanalizujemy prostą implementację tej funkcji i wyjaśnimy, jak wykorzystać ją w swoich projektach.
Najpierw sprawdzimy, jak system obsługuje liczby dodatnie, w tym liczby całkowite, ułamki i bardzo małe wartości. Bez parametryzacji musielibyśmy utworzyć trzy oddzielne testy dla każdej kategorii liczb.
Aby zoptymalizować testowanie funkcji, musimy opracować trzy testy dla liczb ujemnych i jeden dla zera, co łącznie da siedem testów dla jednej małej funkcji. Może się to wydawać nieefektywnym podejściem. W takich przypadkach parametryzacja przychodzi z pomocą, zmniejszając ilość kodu i czyniąc testowanie bardziej zarządzalnym i ustrukturyzowanym. Parametryzacja pomaga testerom łatwo dodawać nowe scenariusze bez konieczności duplikowania kodu, co znacznie poprawia czytelność i łatwość utrzymania testów.
Etykieta parametrize akceptuje dwa argumenty: nazwę zmiennej i listę wartości dla tej zmiennej. Nazwa zmiennej jest przekazywana do testu w taki sam sposób, jak w przypadku fixture'ów. Dzięki tej etykiecie można dynamicznie przekazywać różne zestawy danych do testów, co znacznie upraszcza proces testowania i czyni go bardziej elastycznym.
Wiele zmiennych można przekazać w jednym wierszu, używając przecinków. Każdy element listy jest reprezentowany jako krotka, w której wartości odpowiadających im zmiennych są sekwencyjnie określone. Pozwala to na wygodną i zwartą organizację danych, co upraszcza ich przetwarzanie i wykorzystywanie w dalszych operacjach.
Podczas przekazywania wielu etykiet do parametryzacji pojedynczego testu, zostaną wykonane wszystkie możliwe kombinacje tych etykiet. Pozwala to na efektywniejsze testowanie różnych scenariuszy. Rozważmy na przykład następujący przypadek:
Oprócz wbudowanych etykiet możesz tworzyć własne. Jest to szczególnie przydatne do organizowania testów, umożliwiając ich podział na grupy i uruchamianie osobno. Korzystanie z niestandardowych etykiet upraszcza zarządzanie testami i zwiększa ich wydajność, zapewniając elastyczność w procesie testowania.
Aby utworzyć własną etykietę, użyj tylko jej nazwy. Pozwoli to na efektywne uporządkowanie treści i poprawę jej widoczności w wyszukiwarkach. Prawidłowe użycie etykiet pomoże uporządkować informacje i ułatwi nawigację w witrynie.
Aby uruchomić tylko testy oznaczone etykietą my_mark, użyj polecenia pytest —no-summary -m my_mark tests.py. Pozwoli to na wyizolowanie i przetestowanie konkretnych fragmentów kodu, co znacznie uprości proces debugowania i zwiększy wydajność testowania. Polecenie zwróci dane wyjściowe zawierające tylko wyniki testów pasujących do określonej etykiety.
Spośród pięciu plików aktywowane były tylko trzy, które miały ustawioną wymaganą etykietę.
Otrzymaliśmy trzy ostrzeżenia od Pytest. Jedno z nich wskazuje, że etykieta my_mark nie jest zarejestrowana w pliku pytest.ini. Pytest wyjaśnia, czy faktycznie użyliśmy własnej etykiety i czy nie popełniliśmy literówki podczas pisania wbudowanej etykiety. To ostrzeżenie jest ważne dla prawidłowego działania testów i pozwala uniknąć potencjalnych błędów podczas testowania. Rejestrowanie etykiet w pliku konfiguracyjnym pytest.ini pomoże zapewnić niezawodność i dokładność wykonywania testów.
Dokumentacja zawiera informacje na temat procesu rejestrowania własnej etykiety. Znajdziesz tam wszystkie niezbędne kroki i zalecenia dotyczące pomyślnego ukończenia tej procedury.
Podsumowanie
Pytest to najpopularniejszy framework testowy w społeczności programistów Pythona. Oferuje możliwość pisania bardziej zwięzłych i czytelnych testów w porównaniu z wbudowanym modułem Unittest i nie wymaga użycia klas testowych, co upraszcza proces testowania. Główne narzędzia Pytest obejmują obsługę parametryzacji testów, narzędzia do przygotowania środowiska testowego oraz wygodny mechanizm organizacji i uruchamiania testów. Dzięki tym funkcjom Pytest znacznie poprawia wydajność testowania i promuje wyższą jakość tworzenia oprogramowania.
- Słowo kluczowe assert odpowiada za wynik testu. Jeśli warunek określony po nim jest prawdziwy, test kończy się powodzeniem; Jeśli jest fałszywe, test kończy się niepowodzeniem.
- Fixtures to dodatkowe funkcje, które pozwalają określić środowisko testowe. Mogą one korzystać z innych Fixtures, tworząc całe hierarchie.
- Etykiety to dekoratory, które pozwalają dostosować zachowanie testu: pominąć je, poczekać na określone wyniki, przekazać różne dane wejściowe itd. Możesz tworzyć własne, niestandardowe etykiety.
Dowiedz się więcej o programowaniu i kodowaniu na naszym kanale Telegram. Subskrybuj, aby być na bieżąco z przydatnymi materiałami i najnowszymi wiadomościami ze świata technologii.
Przerób tekst, zachowując główny temat. Zoptymalizuj go pod kątem SEO i dodaj niezbędne informacje, ale unikaj zbędnych szczegółów. Unikaj emotikonów i zbędnych symboli oraz nie wprowadzaj sekcji z liczbami. Tekst powinien być jasny i informacyjny.
Przeczytaj także:
- Ból testera: z jakimi problemami borykają się inżynierowie ds. zapewnienia jakości?
- Testowanie: jakim typem testera jesteś?
- Tworzenie pierwszej gry w Pythonie i Pygame

