Sprawdźmy jak ChatGPT poradzi sobie z realnym zadaniem testerskim, czyli z przygotowaniem Przypadków Testowych.
Testy czarnoskrzynkowe
W pierwszym podejściu mamy bardzo uproszczone wymagania biznesowe, do niewielkiej funkcjonalności:
Aplikacja do zarządzania kompetencjami.
Kompetencje zbudowane w postaci drzewa taksonomii.
Kompetencje zapisane w relacyjnej bazie danych.
Jako administrator mogę:
- dodać kompetencję,
- usunąć kompetencję,
- przesunąć kompetencję w inne miejsce drzewa,
- wyedytować nazwę kompetencji i jej opis.
I dajemy zadanie ChatGPT:
Podaj przypadki testowe do sprawdzenia wymienionej funkcjonalności
Przykładowe przypadki testowe do sprawdzenia funkcjonalności aplikacji do zarządzania kompetencjami:
- Dodanie nowej kompetencji:
- Sprawdzenie, czy nowa kompetencja została poprawnie dodana do bazy danych
- Sprawdzenie, czy nowa kompetencja została poprawnie wyświetlona w drzewie taksonomii
- Sprawdzenie, czy nowa kompetencja posiada unikalne identyfikatory
- Usunięcie istniejącej kompetencji:
- Sprawdzenie, czy istniejąca kompetencja została poprawnie usunięta z bazy danych
- Sprawdzenie, czy istniejąca kompetencja nie jest już widoczna w drzewie taksonomii
- Sprawdzenie, czy nie ma problemów związanych z usunięciem kompetencji, które mogą wpłynąć na funkcjonowanie innych elementów aplikacji
- Przesunięcie istniejącej kompetencji w inne miejsce drzewa:
- Sprawdzenie, czy istniejąca kompetencja została poprawnie przesunięta w drzewie taksonomii
- Sprawdzenie, czy wszystkie powiązania z innymi kompetencjami są poprawne po przesunięciu
- Edycja nazwy i opisu istniejącej kompetencji:
- Sprawdzenie, czy istniejąca kompetencja posiada poprawną nazwę i opis po edycji
- Sprawdzenie, czy zmiany w nazwie i opisie zostały poprawnie zapisane w bazie danych
- Sprawdzenie, czy zmiany są widoczne w drzewie taksonomii
- Sprawdzenie poprawności relacji między kompetencjami:
- Sprawdzenie, czy wszystkie kompetencje są prawidłowo powiązane w drzewie taksonomii
- Sprawdzenie, czy istnieją jakieś niepoprawne lub błędne powiązania między kompetencjami
- Testowanie wydajności:
- Sprawdzenie, jak długo trwa dodawanie, usuwanie, edycja i przesuwanie kompetencji w drzewie taksonomii
- Sprawdzenie, jak szybko aplikacja ładuje się i działa dla dużych drzew taksonomii
Powinno się także przetestować, jak aplikacja obsługuje błędy, takie jak próba dodania kompetencji z istniejącym identyfikatorem lub próba usunięcia kompetencji, która ma przypisane zadania lub osoby odpowiedzialne.
Podsumowanie – TC w testach czarnoskrzynkowych
Warto skorzystać z ChatGPT do generowania przypadków testowych. Przyśpiesza to pracę, szczególnie na samym początku, dając jakiś zbiór przypadków, który warto dalej rozwijać.
Testy białoskrzynkowe
Mamy poniższy fragment kodu w Python:
def szukaj(igly, stogi): """ szukanie igły w stosie siana, czyli część wspólna zbiorów :param igly: zbiór wyszukiwanych elementów (np. lista kompetencji) :param stogi: zbiór w którym szukamy elementów (np. cv) :return znalezione: elementy będące częścią wspólną zbiorów :return ilosc: ilość elementów w części wspólnej """ # usuwamy duplikaty ze stogi # igły powinny być już wyczyszczone z duplikatów stogi = list(dict.fromkeys(stogi)) # szukamy części wspólnej znalezione= list(set(stogi).intersection(igly)) ilosc = len(znalezione) return znalezione, ilosc
Poprosimy teraz ChatGPT o przygotowanie testów w pytest.
Przygotuj przypadki testowe w pytest dla podanej funkcji
Oto kilka przypadków testowych, które można przetestować w pytest dla powyższej funkcji:
Testuj zbiór pusty:
def test_szukaj_dla_pustych_zbiorow(): igly = set() stogi = set() wynik, ilosc = szukaj(igly, stogi) assert wynik == [] assert ilosc == 0
Testuj zbiór igieł i stogu zawierające tylko jedno takie samo wyrażenie:
def test_szukaj_dla_zbiorow_z_tym_samym_wyrazeniem(): igly = set(["test1"]) stogi = set(["test1"]) wynik, ilosc = szukaj(igly, stogi) assert wynik == ["test1"] assert ilosc == 1
Testuj zbiór igieł i stogu zawierające wiele takich samych wyrażeń:
def test_szukaj_dla_zbiorow_z_wieloma_takimi_samymi_wyrazeniami(): igly = set(["test1", "test2"]) stogi = set(["test1", "test2", "test2"]) wynik, ilosc = szukaj(igly, stogi) assert wynik == ["test1", "test2"] assert ilosc == 2
Testuj zbiór igieł i stogu zawierające różne wyrażenia:
def test_szukaj_dla_zbiorow_z_roznymi_wyrazeniami(): igly = set(["test1", "test2"]) stogi = set(["test3", "test4"]) wynik, ilosc = szukaj(igly, stogi) assert wynik == [] assert ilosc == 0
Testuj, czy funkcja usuwa duplikaty ze stogu:
def test_szukaj_czy_usuwa_duplikaty_ze_stogu(): igly = set(["test1", "test2"]) stogi = set(["test1", "test1", "test2"]) wynik, ilosc = szukaj(igly, stogi) assert wynik == ["test1", "test2"] assert ilosc == 2
Teraz testy trzeba przerzucić do pliku, zaimportować niezbędne biblioteki (tego ChatGPT już nie podpowiedział), w tym wypadku:
import pytest from dyskryminator import szukaj
I Już można wywołać polecenie pytest.
Zaskakujący rezultat
Powiem szczerze, tego się nie spodziewałem. ChatGPT znalazł błąd w moim kodzie 🙂
I to w kodzie, którego z powodzeniem używam od wielu miesięcy. Błąd jest subtelny i w zastosowaniach, do których używam tej funkcji nie ma znaczenia. Ale w innym przypadku użycia, mógłbym pewnie całe godziny spędzić, zastanawiając się gdzie tkwi błąd. Nie podejrzewałbym tego fragmentu, wielokrotnie przeze mnie używanego.
=========================== short test summary info ============================ FAILED test_dyskryminator.py::test_szukaj_dla_zbiorow_z_wieloma_takimi_samymi_wy razeniami - AssertionError: assert ['test2', 'test1'] == ['test1', 'test2'] FAILED test_dyskryminator.py::test_szukaj_czy_usuwa_duplikaty_ze_stogu - Asserti onError: assert ['test2', 'test1'] == ['test1', 'test2'] ========================= 2 failed, 3 passed in 0.06s ==========================
Na czym polega? Czyszczenie duplikatów z listy z wykorzystaniem „dict” nie zachowuje ich kolejności, a ChatGPT założył, że wrócą w takiej samej kolejności, tylko z usuniętymi duplikatami. Z jednej strony to wiem, tak działa „dict” w python, ale z drugiej, nie pomyślałem jakie może mieć to praktyczne znaczenie. Kodu nie będę poprawiał, bo w zastosowaniu, do którego go używam to nie przeszkadza, ale dopiszę komentarz do docstringa w tej funkcji, tak na zaś, na przyszłość, jak kiedyś przyjdzie mi do głowy reużyć ten kod i będę się głowił, dlaczego nie działa 🙂