私たちは多くのアルゴリズムを実装していますが、それらは通常、多くの共有され、公に知られており、セキュリティ関連のパラメーターを持っています。
現在、すべてのパラメーターと2つの定義済みグローバルオブジェクトを保持するクラスを使用しています。
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)
その後、アルゴリズムはPublicParams
オブジェクトを引数として受け取り、デフォルトで生産的になりますpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
そして
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
このようにして、ユニットテストを簡単にするために、さまざまなパブリックパラメータを注入できます。
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
私はこのアプローチについて好きではないもの:
- 与える
publicParams
デフォルト値は、いくつかのアルゴリズムを呼び出すとき、それはオプションになります。ただし、AlgoTwo
内部から呼び出すときに渡すことを忘れがちになりAlgoOne
ます。テストオブジェクトが渡された場合、2つの異なるオブジェクトが使用されます。AlgoOne
発生しにくいが、単体テストに柔軟性を提供するより良い方法はありますか?これは本当にベストプラクティスですか?