Panel informacyjno-kontrolny (#4) – Status pytest’a

Panel informacyjno-kontrolny (#4) - Status pytest'a

Poziom trudności
2/5

Mając wiedzę z poprzednich części tej serii, wiesz, że możesz wyświetlić w panelu wszystko, co jest dostępne z poziomu konsoli. Czas więc wykorzystać tę wiedzę w testach. W tym artykule stworzymy stronę, na której będziesz mógł sprawdzić status wykonywanych testów, za pomocą logowania na stronie w czasie rzeczywistym.

Informacja o wykonywanych testach

Na początek stwórz plik z testami, możesz oczywiście korzystać też z już istniejących testów. Na potrzeby tej instrukcji każdy z nich powinien trwać co najmniej kilkanaście sekund, abyś mógł zaobserwować ich postęp na stronie. Poniższy kod zawiera trzy testy, z których każdy kończy się sukcesem po 12 sekundach. Umieściłem je w pliku test_pytest.py:

  1. import pytest
  2. from time import sleep
  3. def test_one():
  4. sleep(12)
  5. def test_two():
  6. sleep(12)
  7. def test_three():
  8. sleep(12)

Po uruchomieniu testów otrzymujemy ich wyniki, ale nie do końca satysfakcjonujące: 

pi@raspberrypi:~/test$ pytest test_pytest.py
============================================ test session starts =============================================
platform linux -- Python 3.5.3, pytest-4.6.3, py-1.8.0, pluggy-0.12.0
rootdir: /home/pi/test, inifile: pytest.ini
collected 3 items
test_pytest.py ... [100%]
========================================= 3 passed in 36.53 seconds ==========================================

Choć w pełni spodziewaliśmy się takiego przebiegu testów, to jednak jest on jednak mało czytelny. Brakuje informacji o nazwach wykonywanych aktualnie testów, a także ile procent testów już się wykonało. Aby takie informacje uzyskiwać na bieżąco podczas testów, w folderze z którego uruchamiasz testy, stwórz plik pytest.ini i umieść w nim poniższy kod:

[pytest]
log_cli = True

Po uruchomieniu testów uzyskujemy w czasie rzeczywistym informację o tym, jaki aktualnie test jest wykonywany. Po zakończeniu każdego kolejnego testu otrzymujemy wynik testu oraz informacje o ich postępie wyrażone w procentach:

pi@raspberrypi:~/test$ pytest test_pytest.py
============================================ test session starts =============================================
platform linux -- Python 3.5.3, pytest-4.6.3, py-1.8.0, pluggy-0.12.0
rootdir: /home/pi/test, inifile: pytest.ini
collected 3 items
test_pytest.py::test_one PASSED [ 33%]
test_pytest.py::test_two PASSED [ 66%]
test_pytest.py::test_three PASSED [100%]
========================================= 3 passed in 36.53 seconds ==========================================

Wyświetlenie przydatnych informacji w panelu

Aby mieć dostęp do informacji generowanych przez testy, wystarczy przekierować strumień danych do pliku. Folder z logami najlepiej umieścić w tej samej lokalizacji gdzie plik app.py:

pytest test_pytest.py > logs/pytest.logs

Wykorzystując kod z poprzedniej części tej serii wyświetlisz informacje o wykonywanych aktualnie testach. Aby to zrobić użyj w kodzie app.py komendy cat, w metodzie get_info() (linijka 11) bezpośrednio odczytujemy plik z logami zapisywanymi podczas testów. Następnie odczytany string podzielimy na listę zawierającą kolejne linijki odczytanego pliku. Do strony index.html, za pomocą metody render_template(), przekazujemy wielkość listy lan i a w zmiennej variable dane sczytane z logów:

  1. from flask import Flask, render_template
  2. import os
  3. class TestLogger:
  4. def __init__(self):
  5. elf.info_list = self.get_info()
  6. @staticmethod
  7. def get_info():
  8. return os.popen('cat logs/pytest.logs').read()
  9. def list_of_lines(self):
  10. return self.info_list.splitlines()
  11. app = Flask(__name__)
  12. @app.route("/")
  13. def hello():
  14. test_logger = TestLogger()
  15. return render_template('index.html', variable=test_logger.list_of_lines(),
  16. len=len(test_logger.list_of_lines()))
  17. if __name__ == "__main__":
  18. app.run(host='0.0.0.0', port=5000)

Plik w index.html (znajdujący się w folderze templates) będzie zawierał pętlę for, iterowaną liczbą linii pliku (lan), w której będą wyświetlane kolejno właśnie te linie:

  1. {%for i in range(0, len)%}
  2. {{variable[i]}}
  3. {%endfor%}

Chciałbyś pewnie by wszystko wyświetlało się płynnie i kolorowo (w zależności od przebiegu testów). A może nawet chciałbyś znać szacowany czas zakończenia testów? To wszystko już w następnym artykule poświęconym tej serii. Ale nawet bez tego możesz spokojnie wyjść na kawę podczas testów i w trakcje sprawdzić postęp testów.

Dodaj komentarz