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