Estamos implementando muchos algoritmos que generalmente tienen muchos parámetros compartidos, conocidos públicamente y relevantes para la seguridad.
Actualmente, simplemente usamos una clase que contiene todos los parámetros y dos objetos globales predefinidos:
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)
Los algoritmos luego toman un PublicParams
objeto como argumento que por defecto es productivopublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
y
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
De esta manera, todavía podemos inyectar diferentes parámetros públicos para una prueba de unidad más fácil:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Lo que no me gusta de este enfoque:
- Darle
publicParams
un valor predeterminado lo hace opcional al llamar a algún algoritmo. Sin embargo, se hace fácil olvidar pasarlo cuando se llamaAlgoTwo
desde dentroAlgoOne
, lo que daría como resultado que se utilicen dos objetos diferentes si el objeto de prueba se pasó aAlgoOne
¿Existe una mejor manera que sea menos propensa pero que aún ofrezca flexibilidad para las pruebas unitarias? ¿Es esta realmente la mejor práctica?