Panel informacyjno-kontrolny #4: Status pytest’a
W tym artykule stworzymy stronę, na której będziesz mógł sprawdzić status puszczonych testów, za pomocą logowania na stronie w czasie rzeczywistym.
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:
import pytest
from time import sleep
def test_one():
sleep(12)
def test_two():
sleep(12)
def test_three():
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. W zmiennej variable dane sczytane z logów:
from flask import Flask, render_template
import os
class TestLogger:
def __init__(self):
elf.info_list = self.get_info()
@staticmethod
def get_info():
return os.popen('cat logs/pytest.logs').read()
def list_of_lines(self):
return self.info_list.splitlines()
app = Flask(__name__)
@app.route("/")
def hello():
test_logger = TestLogger()
return render_template('index.html', variable=test_logger.list_of_lines(),
len=len(test_logger.list_of_lines()))
if __name__ == "__main__":
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:
{%for i in range(0, len)%}
{{variable[i]}}
{%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.