Wdrażamy wiele algorytmów, które zazwyczaj mają wiele wspólnych, znanych publicznie i istotnych dla bezpieczeństwa parametrów.
Obecnie używamy po prostu klasy zawierającej wszystkie parametry i dwa predefiniowane obiekty globalne:
class PublicParams(object):
p = q = 0
def __init__(self, p, q):
self.p = p
self.q = q
# used for tests
publicParams_test = PublicParams(15,7)
# Some 2048 bit numbers for example
publicParams_secure = PublicParams(128378947298374928374,128378947298374928374)
Algorytmy przyjmują następnie PublicParams
obiekt jako argument domyślnie produktywnypublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
i
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
W ten sposób możemy nadal wprowadzać różne parametry publiczne, aby ułatwić testowanie jednostek:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Czego nie lubię w tym podejściu:
- Podanie
publicParams
wartości domyślnej czyni ją opcjonalną podczas wywoływania jakiegoś algorytmu. Łatwo jednak zapomnieć o przekazaniu go podczas wywoływaniaAlgoTwo
od wewnątrzAlgoOne
, co spowodowałoby użycie dwóch różnych obiektów, gdyby obiekt testowy został przekazany doAlgoOne
Czy istnieje lepszy sposób, który jest mniej podatny, ale nadal oferuje elastyczność w testowaniu jednostkowym? Czy to naprawdę najlepsza praktyka?