Wir implementieren viele Algorithmen, die normalerweise viele gemeinsame, öffentlich bekannte und sicherheitsrelevante Parameter aufweisen.
Derzeit verwenden wir einfach eine Klasse, die alle Parameter und zwei vordefinierte globale Objekte enthält:
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)
Die Algorithmen nehmen dann ein PublicParams
Objekt als Argument, das standardmäßig produktiv istpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
und
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
Auf diese Weise können wir immer noch verschiedene öffentliche Parameter einfügen, um das Testen von Einheiten zu vereinfachen:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Was ich an diesem Ansatz nicht mag:
- Wenn Sie
publicParams
einen Standardwert angeben, ist dieser beim Aufrufen eines Algorithmus optional. Es wird jedoch leicht vergessen, das Übergeben zu vergessen, wennAlgoTwo
von innen aufgerufen wirdAlgoOne
, was dazu führen würde, dass zwei verschiedene Objekte verwendet werden, wenn das Testobjekt an übergeben wirdAlgoOne
Gibt es einen besseren Weg, der weniger anfällig ist, aber dennoch Flexibilität für Unit-Tests bietet? Ist das wirklich die beste Praxis?