Last modified: September 21, 2024

This article is written in: 🇵🇱

Testy

Testy w kontekście inżynierii oprogramowania odnoszą się do procesu weryfikacji i walidacji kodu, aby zapewnić, że działa on zgodnie z oczekiwaniami i spełnia określone wymagania. Testy pomagają w wykrywaniu błędów i niespójności, które mogą prowadzić do nieprawidłowego działania oprogramowania.

Klasyfikacja testów

W zależności od zakresu i celu testowania można wyróżnić różne rodzaje testów:

Testy jednostkowe (Unit Tests)

Testy integracyjne (Integration Tests)

Testy systemowe (System Tests)

Testy akceptacyjne (Acceptance Tests)

Przykłady bugów prowadzących do katastrof

Błędy w oprogramowaniu mogą prowadzić do poważnych konsekwencji, zwłaszcza gdy dotyczą krytycznych systemów, takich jak lotnictwo czy obrona.

Ostatecznie testy mają kluczowe znaczenie dla jakości i bezpieczeństwa oprogramowania. Dlatego inwestowanie w solidne praktyki testowania jest niezbędne dla każdej firmy zajmującej się tworzeniem oprogramowania.

Proces testowania

Testowanie jest kluczowym etapem w cyklu życia oprogramowania. Oto podstawowe kroki procesu testowania:

I. Zdefiniuj cel testu:

II. Przygotuj dane:

III. Wykonaj test:

IV. Walidacja:

V. Raportowanie:

Testy jednostkowe

Przykład Testu

Załóżmy, że chcemy przetestować funkcję znajdz_klucz(lista, klucz), która zwraca indeks pierwszego wystąpienia klucza w liście lub -1, jeśli klucz nie występuje.

Przeprowadzamy następujące testy:

  1. Podstawowe zachowanie: Sprawdzenie, czy funkcja zwraca oczekiwany indeks dla przypadku, gdy klucz znajduje się w liście.
  2. Skrajne przypadki: Sprawdzenie, czy funkcja zwraca -1, gdy klucz nie znajduje się w liście.

def test_find_key():
    assert find_key([1,2,3,4,5], 3) == 2  # Podstawowe zachowanie
    assert find_key([1,2,3,4,5], 6) == -1  # Skrajny przypadek

Pamiętaj, aby testować różne przypadki, w tym przypadki skrajne oraz możliwe błędy na poziomie brzegowym, aby zapewnić skuteczność testów.

Pokrycie kodu produkcyjnego (code coverage)

Pokrycie kodu to wskaźnik ilustrujący, jaki procent kodu źródłowego został uruchomiony podczas testów. Choć wysoki wskaźnik pokrycia jest pożądany, nie zawsze gwarantuje pełną jakość testów.

Przykład:

# 1. def fun(a, b):
# 2.   a += 1
# 3.   b += 2
# 4.   if a + b > 22:
# 5.     a += 1
# 6.   return a + b

Przeprowadzając testy fun(a,b), jeżeli pominiemy dane powodujące spełnienie warunku w linii #4#, nie osiągniemy 100% pokrycia. Dodając odpowiednie przypadki testowe, zbliżymy się do pełnego pokrycia.

Czy zielone testy są gwarancją poprawności?

Samo istnienie zielonych testów (testy, które zakończyły się sukcesem) nie gwarantuje oprogramowania wolnego od błędów.

Test Driven Development (TDD)

Test Driven Development (TDD) to metoda tworzenia oprogramowania, w której programista najpierw tworzy testy jednostkowe opisujące oczekiwaną funkcjonalność, a następnie pisze kod, który te testy spełnia. TDD pomaga zapewnić wysoką jakość kodu oraz wcześnie wykrywać potencjalne błędy.

Proces TDD:

Korzyści z TDD:

Potencjalne wyzwania:

Spis Treści

    Testy
    1. Klasyfikacja testów
      1. Testy jednostkowe (Unit Tests)
      2. Testy integracyjne (Integration Tests)
      3. Testy systemowe (System Tests)
      4. Testy akceptacyjne (Acceptance Tests)
    2. Przykłady bugów prowadzących do katastrof
    3. Proces testowania
    4. Testy jednostkowe
    5. Przykład Testu
    6. Pokrycie kodu produkcyjnego (code coverage)
    7. Czy zielone testy są gwarancją poprawności?
    8. Test Driven Development (TDD)