我们正在实现许多算法,这些算法通常具有许多共享的,众所周知的和与安全性相关的参数。
当前,我们仅使用一个包含所有参数和两个预定义全局对象的类:
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
,如果将测试对象传递给,则会导致使用两个不同的对象。AlgoOne
有没有一种更好的方法,它不那么容易使用,但仍然为单元测试提供了灵活性?这真的是最佳做法吗?