Stiamo implementando molti algoritmi che in genere hanno molti parametri condivisi, noti pubblicamente e rilevanti per la sicurezza.
Attualmente, usiamo 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 prendono quindi un oggetto PublicParams come argomento che assume come valore predefinito publicParams_secure produttivo
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 semplificare i test unitari:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Ciò che non mi piace di questo approccio:
- Assegnare il
publicParamsa un valore predefinito lo rende facoltativo quando si chiama un algoritmo. Tuttavia, diventa facile dimenticare di passarlo quando si chiamaAlgoTwodaAlgoOne, il che comporterebbe l'utilizzo di due oggetti diversi se l'oggetto test è stato passato aAlgoOne
C'è un modo migliore che è meno incline ma offre comunque flessibilità per il test delle unità? È davvero una buona pratica?