Kami menerapkan banyak algoritma yang biasanya memiliki banyak parameter yang dibagikan, diketahui publik, dan relevan dengan keamanan.
Saat ini, kami cukup menggunakan kelas yang menampung semua parameter dan dua objek global yang telah ditentukan:
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)
Algoritme kemudian mengambil PublicParams
objek sebagai argumen yang default ke produktifpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
dan
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
Dengan cara ini kami masih dapat menyuntikkan parameter publik yang berbeda untuk pengujian unit yang lebih mudah:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Apa yang saya tidak suka tentang pendekatan ini:
- Memberikan nilai
publicParams
default menjadikannya opsional ketika memanggil beberapa algoritma. Namun, menjadi mudah untuk melupakannya ketika memanggilAlgoTwo
dari dalamAlgoOne
, yang akan menghasilkan dua objek yang berbeda digunakan jika objek uji dilewatkan keAlgoOne
Apakah ada cara yang lebih baik yang kurang rentan tetapi masih menawarkan fleksibilitas untuk pengujian unit? Apakah ini benar-benar praktik terbaik?