Při testování složitějších systémů často docházím do stavu, kdy potřebuji porovnávat hodnoty před a po provedení určité operace. Současně si také chci vypsat kompletní stav systému a ověřit, že provedená operace neovlivnila i něco dalšího.
Moje představa byla nechat si vypsat všechny hodnoty parametrů do přehledné tabulky a barevně označit ty, u kterých došlo ke změně.
Pro účely tohoto článku jsem potřeboval nějakou ukázkovou aplikaci, která by se podobala mému použití při testování aplikace pro elektronový mikroskop. Napadlo mě API pro ovládání digitálního fotoaparátu — je to sice něco jiného než mikroskop, ale nějaké čočky se zde najdou také. A protože jsem líný, nechal jsem ChatGPT, ať mi takové API vytvoří.
Klasický výpis hodnot
Jednoduché vypsání hodnot parametrů vypadá následovně. Při velkém počtu parametrů může být ale takový výpis nepřehledný.
Kompletní ukázkový skript najdete zde: test1.py
from dslr import DSLRCamera # dummy app
camera1 = DSLRCamera("Canon")
rint('Before:')
print(f'camera1.iso: {camera1.iso}')
...
camera1.iso = 700
...
print('After:')
print(f'camera1.iso: {camera1.iso}')
Tabulkový výpis
Pro zlepšení přehlednosti můžeme data vypsat formou ASCII tabulky. K tomu použijeme Python modul PrettyTable. Jeho použití je jednoduché:
from prettytable import PrettyTable
table = PrettyTable()
table.field_names = ["Column A", "Column B"]
table.add_row(["Value A1", "Value B1"])
table.add_row(["Value A2", "Value B2"])
print(table)
Už tedy umíme vypsat tabulku, a výsledek je hned o něco přehlednější: test2.py
Porovnávání hodnot
Teď už zbývá jen porovnat obě tabulky a zvýraznit hodnoty, u kterých došlo ke změně. Protože tabulka PrettyTable je vlastně dvourozměrné pole, stačí projít jednotlivé buňky první tabulky a zjistit, zda se jejich hodnota liší od hodnoty odpovídající pozici v druhé tabulce.
for x, row in enumerate(data_before):
for y, cell in enumerate(row):
if data_before[x][y] != data_after[x][y]:
data_after[x][y] = ...
Pro zvýraznění použijeme modul Colorama, který nám do výstupu přidá barvičky:
print(Fore.GREEN + 'this is green text')
Výsledkem je přehledná tabulka změn: test3.py
Všechny použité skripty a funkci pro porovnávání tabulek tables_diff() najdete na našem Githubu.