2012-06-11 14 views
5

Có một số miền ứng dụng (ví dụ: GameDev), trong đó có rất nhiều hàm nên được tạo bằng cách sử dụng các giá trị ngẫu nhiên để tạo đầu ra của chúng. Một trong các ví dụ được trình bày bên dưới:Làm cách nào để xác nhận tính chính xác của các chức năng sử dụng ngẫu nhiên?

def generate_key(monster_key_drop_coef): 
    key_letters = string.ascii_uppercase 
    rand = random.random() 
    if monster_key_drop_coef < rand: 
     return None 

    button = {} 
    button["type"] = random.choice([1,2,3]) 
    button["letter"] = random.choice(key_letters) 
    return button 

Chức năng này tạo ra sự sụt giảm của mặt hàng dựa trên một số hoạt động ngẫu nhiên. Sự cố xuất hiện nếu bạn muốn xác thực tính chính xác của chức năng này. Các giá trị được tạo ra không xác định và viết các phép thử hồi quy có vẻ là không thể.

Câu hỏi của tôi là:

  1. phải là có thể này để viết bài kiểm tra hồi quy hữu ích cho loại chức năng?
  2. Có cách tiếp cận chung nào để tạo một số loại thử nghiệm khác trong trường hợp này không?
+4

Có toàn bộ sách được viết về chủ đề này. Ví dụ: http://www.johndcook.com/Beautiful_Testing_ch10.pdf –

+1

Trích xuất RNG để phân phối các kết quả đã biết (và sau đó thử nghiệm với các đầu ra cụ thể mà kết quả mong muốn được biết) là một cách tiếp cận. –

Trả lời

3

Một trong những đơn vị xét nghiệm hữu ích được trình bày dưới đây:

def test_generate_key(): 
    button_list = [] 
    for _ in range(1, 1000): 
     button_list.append(generate_key(0.2)) 

    is_all_none = True 
    is_not_none = False 
    for key in button_list: 
     is_all_none &= (key is None) 
     is_not_none |= (key is not None) 

    assert is_all_none == False 
    assert is_not_none == True 

Nó xác nhận chức năng chữ ký, bao gồm tất cả các dòng mã (xác suất tốt) chức năng và sẽ vượt qua trong 99,999 trường hợp%. Cũng xác nhận rằng chức năng tạo ra một số thả ít nhất một từ 1000 và đôi khi không tạo ra thả. 0,2 là xác suất sụt giảm của một mục.

2

Tôi sẽ viết lại hàm để sử dụng phép chèn phụ thuộc (trình tạo số ngẫu nhiên được chuyển thành tham số cho hàm). Sau đó, bạn có thể truyền mô phỏng một trình tạo số ngẫu nhiên để kiểm tra hàm của bạn với các đầu vào "ngẫu nhiên" xác định khác nhau.

Tất nhiên bạn cũng có thể kiểm tra các xác nhận của bạn mà không phụ thuộc vào kết quả của cuộc gọi đến ngẫu nhiên. Chẳng hạn như:

  • Chức năng trả về Không có hoặc một lệnh có khóa "loại" và "chữ cái".
  • Nếu từ điển được trả về, các giá trị thuộc loại và phạm vi thích hợp.

Tôi sẽ không bao giờ viết unittest có kết quả không xác định, thậm chí 1 trong một nghìn. Tôi quan tâm đến mọi thất bại kiểm tra, và kết quả ngẫu nhiên sẽ gây bất ổn. Bạn sẽ được tốt hơn off đóng gói ngẫu nhiên của bạn, để các chức năng có thể được kiểm tra độc lập của máy phát điện số ngẫu nhiên.