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:

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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 🙂