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 PublicParamsObjekt 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
publicParamseinen Standardwert angeben, ist dieser beim Aufrufen eines Algorithmus optional. Es wird jedoch leicht vergessen, das Übergeben zu vergessen, wennAlgoTwovon 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?