Nous mettons en œuvre de nombreux algorithmes qui comportent généralement de nombreux paramètres partagés, connus du public et liés à la sécurité.
Actuellement, nous utilisons simplement une classe contenant tous les paramètres et deux objets globaux prédéfinis:
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)
Les algorithmes prennent ensuite un PublicParams
objet comme un argument qui par défaut est productifpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
et
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
De cette façon, nous pouvons toujours injecter différents paramètres publics pour faciliter les tests unitaires:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Ce que je n'aime pas dans cette approche:
- Donner
publicParams
une valeur par défaut la rend facultative lors de l'appel d'un algorithme. Cependant, il devient facile d'oublier de le passer lors d'un appelAlgoTwo
de l'intérieurAlgoOne
, ce qui entraînerait l'utilisation de deux objets différents si l'objet de test était passé àAlgoOne
Existe-t-il un meilleur moyen qui est moins sujet mais qui offre toujours une flexibilité pour les tests unitaires? Est-ce vraiment la meilleure pratique?