Chúng tôi đang thực hiện nhiều thuật toán thường có nhiều tham số được chia sẻ, được biết đến công khai và liên quan đến bảo mật.
Hiện tại, chúng ta chỉ cần sử dụng một lớp chứa tất cả các tham số và hai đối tượng toàn cục được xác định trước:
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)
Các thuật toán sau đó lấy một PublicParams
đối tượng làm đối số mặc định cho năng suấtpublicParams_secure
def AlgoOne(n, publicParams = publicParams_secure):
# do stuff with publicParams.p
# ...
AlgoTwo(x, publicParams)
và
def AlgoTwo(x, publicParams= publicParams_secure):
# do stuff with publicParams.q
Bằng cách này, chúng tôi vẫn có thể tiêm các tham số công khai khác nhau để kiểm tra đơn vị dễ dàng hơn:
class AlgoOneTest(unittest.TestCase):
def test(self):
# compare with manually computed result
self.assertTrue(AlgoOne(1, publicParams_test) == 10)
Những gì tôi không thích về cách tiếp cận này:
- Đưa ra
publicParams
một giá trị mặc định làm cho nó tùy chọn khi gọi một số thuật toán. Tuy nhiên, thật dễ dàng để quên việc chuyển nó khi gọiAlgoTwo
từ bên trongAlgoOne
, điều này sẽ dẫn đến hai đối tượng khác nhau được sử dụng nếu đối tượng thử nghiệm được chuyển đếnAlgoOne
Có cách nào tốt hơn mà ít bị nhưng vẫn mang lại sự linh hoạt cho thử nghiệm đơn vị không? Đây thực sự là thực hành tốt nhất?