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 PublicParamsobjet 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
publicParamsune 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 appelAlgoTwode 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?