Stiamo implementando molti algoritmi che in genere hanno molti parametri condivisi, noti pubblicamente e rilevanti per la sicurezza.
Attualmente, utilizziamo semplicemente una classe che contiene tutti i parametri e due oggetti globali predefiniti:
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)
Gli algoritmi quindi prendono un PublicParams
oggetto come argomento che per impostazione predefinita è produttivopublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
e
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
In questo modo possiamo ancora iniettare diversi parametri pubblici per un più semplice test dell'unità:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Cosa non mi piace di questo approccio:
- Dare
publicParams
un valore predefinito lo rende facoltativo quando si chiama un algoritmo. Tuttavia, diventa facile dimenticare di averlo passato quando si chiamaAlgoTwo
dall'internoAlgoOne
, il che comporterebbe l'utilizzo di due oggetti diversi se l'oggetto test fosse passato aAlgoOne
Esiste un modo migliore che è meno incline ma offre comunque flessibilità per i test unitari? È davvero questa la migliore pratica?