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