Мы реализуем множество алгоритмов, которые обычно имеют много общих, общеизвестных и важных для безопасности параметров.
В настоящее время мы просто используем класс, содержащий все параметры и два предопределенных глобальных объекта:
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
Есть ли лучший способ, который менее подвержен, но все же предлагает гибкость для модульного тестирования? Это действительно лучшая практика?