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 PublicParamsoggetto 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
publicParamsun valore predefinito lo rende facoltativo quando si chiama un algoritmo. Tuttavia, diventa facile dimenticare di averlo passato quando si chiamaAlgoTwodall'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?