Raspberry Pi w testach embedded (Cz. 5) – fixtury w praktyce

Raspberry Pi w testach embedded (Cz. 5) – podstawy fixture w praktyce

Poziom trudności
3/5

W artykule dotyczącym fixur pokrótce wyjaśniłem ich działanie. Teraz chciałem przybliżyć ich przydatność w praktyce, rozbudowując wątek z czwartej części serii o Raspberry Pi w testach embedded. 

Przygotowanie środowiska

W pierwszej kolejności powinniśmy przygotować i sprawdzić nasze środowisko do testów. Stwórz klasę srodowisko_testowe, która będzie zawierać konfigurację GPIO i z której stworzymy fixture st.

  1. from gpiozero import LED, Button
  2. from time import sleep
  3. import pytest
  4. class srodowisko_testowe:
  5. def __init__(self):
  6. # Dodaj możliwość zmiany stanu z niskiego na wysoki i odwrotnie
  7. self.stan_1 = LED(17)
  8. # Dodaj funkcjonalność przycisku
  9. self.przycisk_1 = Button(27)
  10. @pytest.fixture
  11. def st():
  12. return srodowisko_testowe()

Warunki wstępne

Tworzymy fixture, która przed testem zmieni stan przekaźnika na „off”, dla testów które tego wymagają. Dodałem funkcję „sleep” aby przekaźnik zdążył się przełączyć, zanim wykonamy kolejne kroki testów.

  1. @pytest.fixture
  2. def wyczysc_stany(st):
  3. st.stan_1.off()
  4. sleep(0.1)

Jeżeli w jakimś teście zajdzie potrzeba rozpoczęcia testu od przeciwnego stanu przekaźnika (w tym przypadku stan ustawiony na „on”), będziemy potrzebowali kolejnej fixtury:

  1. @pytest.fixture
  2. def stan_on(st):
  3. st.stan_1.on()
  4. sleep(0.1)

Czyszczenie po teście

Do fixtury wyczysc_stany dodajemy czyszczenie stanu przekaźnika po teście.

  1. @pytest.fixture
  2. def wyczysc_stany(request, st):
  3. st.stan_1.off()
  4. sleep(0.1)
  5. def na_zakonczenie():
  6. st.stan_1.off()
  7. sleep(0.1)
  8. request.addfinalizer(na_zakonczenie)

Testujemy

W poniższym przykładzie wykorzystamy stworzone fixutry. Dodamy dwa testy zmieniające stan przekaźnika i zweryfikujemy czy jest on zwarty (test_zien_stan_on) lub rozwarty (test_zien_stan_off).

  1. from gpiozero import LED, Button
  2. from time import sleep
  3. import pytest
  4. class srodowisko_testowe:
  5. def __init__(self):
  6. self.stan_1 = LED(17)
  7. self.przycisk_1 = Button(27)
  8. @pytest.fixture
  9. def st():
  10. return srodowisko_testowe()
  11. @pytest.fixture
  12. def wyczysc_stany(request, st):
  13. st.stan_1.off()
  14. sleep(0.1)
  15. def na_zakonczenie():
  16. st.stan_1.off()
  17. sleep(0.1)
  18. request.addfinalizer(na_zakonczenie)
  19. @pytest.fixture
  20. def stan_on(st):
  21. st.stan_1.on()
  22. sleep(0.1)
  23. def test_zien_stan_on(st, wyczysc_stany):
  24. st.stan_1.on()
  25. sleep(0.1)
  26. assert st.przycisk_1.is_pressed is True
  27. def test_zien_stan_off(st, wyczysc_stany, stan_on):
  28. st.stan_1.off()
  29. sleep(0.1)
  30. assert st.przycisk_1.is_pressed is False

Teraz można pisać kolejne testy oparte o ten przekaźnik używając stworzonych fixtur. Dzięki wykorzystaniu fixtur nie musimy się martwić kolejnością wykonywania testów gdyż zawsze mamy wyczyszczone i gotowe do pracy środowisko.

Dodaj komentarz