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.

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

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


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.

close

Newsletter