Doplňte do testové třídy následující test. Aby třída byla obecná, musíme jí při vytváření předat kódy, jimiž budeme označovat spam a korektní emaily. Následně se pokusíme získat matici ve formě slovníku a tento slovník porovnáme s očekávanými hodnotami, které by měly být hned po vytvoření objektu samozřejmě nulové.
def test_countersAreZero_afterCreation(self):
# Prepare fixture
cm = BinaryConfusionMatrix(pos_tag=SPAM_TAG, neg_tag=HAM_TAG)
# Exercise the SUT
cmdict = cm.as_dict()
# Assert
self.assertDictEqual(cmdict, {'tp': 0, 'tn': 0, 'fp': 0, 'fn': 0})
Spusťte test. Test skončí s chybou NameError
, protože nemáme definovány konstanty SPAM_TAG
a HAM_TAG
. Jelikož by tyto konstanty měly mít platnost co nejmenší, aby neovlivňovaly žádné další testy, definujme tyto konstanty přímo v modulu test_confmat
. Jejich hodnoty si pro účely testování můžete zvolit prakticky libovolně.
SPAM_TAG = 'SPAM'
HAM_TAG = 'OK'
Spusťte test. Dostanete výjimku TypeError
, protože třída BCM nemá definovanou metodu __init__
se dvěma argumenty. Doplňme ji tedy (do třídy BCM). Zapamatujme si kódy pro spam a ham a inicializujme čítače TP, TN, FP, FN.
def __init__(self, pos_tag, neg_tag):
self.tp = 0
self.tn = 0
self.fp = 0
self.fn = 0
self.pos_tag = pos_tag
self.neg_tag = neg_tag
Spusťte test. Třída teď jde instanciovat. Dostáváme ale AttributeError
, protože třída BCM nemá metodu as_dict()
. Doplňme ji do třídy BCM:
def as_dict(self):
"""Return the conf. mat. as a dictionary."""
return {'tp': self.tp, 'tn': self.tn, 'fp': self.fp, 'fn': self.fn}
Spusťte test. Měl by proběhnout bez chyby. V čem je hodnota tohoto testu? Zaručí nám, že pokud se v budoucnu budeme 'hrabat' v metodě __init__()
nebo as_dict()
a zaneseme tam nechtěně nějakou chybu, pak ji test s velkou pravděpodobností odhalí.