2010-09-28 38 views
18

Tôi đang viết các trường hợp kiểm tra đơn vị cho một trò chơi mà tôi đang làm việc. Khi trò chơi bắt đầu, người chơi được định vị ngẫu nhiên và tôi có hai vấn đề với điều đó:Đơn vị thử nghiệm một phương pháp có hành vi ngẫu nhiên

  1. Vì người chơi được định vị ngẫu nhiên, tôi không thể chắc chắn rằng một trường hợp thử qua một lần sẽ lại xuất hiện. Ví dụ, nó có thể vượt qua hầu hết thời gian, nhưng thất bại nếu người chơi xảy ra được đặt ở phía trước của một chướng ngại vật.
  2. Tôi phải kiểm tra tất cả các tình huống trong một trường hợp thử nghiệm. Ví dụ, khi kiểm tra xem người chơi có di chuyển chính xác hay không, tôi phải kiểm tra xem có một chướng ngại vật nào không và nếu nó được thuật toán xem xét.

Tôi không thực sự hài lòng với điều đó, nhưng tôi không thấy lối thoát. Có thể chấp nhận các phương pháp thử nghiệm với hành vi ngẫu nhiên một phần không?

+0

Bản sao có thể có của [Kiểm tra đơn vị một phương pháp có thể có hành vi ngẫu nhiên] (https://stackoverflow.com/questions/88007/unit-testing-a-method-that-can-have-random-behaviour) –

Trả lời

23

Tôi đề nghị bạn đối xử với nguồn ngẫu nhiên của bạn (trình tạo số ngẫu nhiên hoặc bất kỳ thứ gì) như một sự phụ thuộc. Sau đó, bạn có thể kiểm tra nó với các đầu vào đã biết bằng cách cung cấp RNG giả hoặc một với một hạt giống đã biết. Điều đó loại bỏ sự ngẫu nhiên từ thử nghiệm, trong khi vẫn giữ nó trong mã thực.

Nếu bạn giả mạo RNG, bạn có thể kiểm tra điều gì sẽ xảy ra nếu nó tự động định vị người chơi trên chướng ngại vật - cách nó di chuyển người chơi ra khỏi đường đi, vv Tất nhiên dựa vào việc biết cách sử dụng RNG , nhưng cá nhân tôi đủ hạnh phúc với các bài kiểm tra đơn vị hoạt động như "kiểm tra hộp trắng" với một số kiến ​​thức nội bộ.

+0

Vì vậy, điều đó có nghĩa là bạn đề nghị tôi cung cấp trò chơi của tôi với một trình tạo số ngẫu nhiên mà tôi có thể tạo ra việc triển khai thử? – forceal

+0

@forceal: Yup, đúng vậy. –

+0

Hm. Nhưng bộ tạo số ngẫu nhiên sẽ được sử dụng cho nhiều thứ, vì vậy sẽ rất khó để giả mạo nó. Ví dụ, nó cũng được sử dụng cho màu của người chơi (một thứ không ảnh hưởng đến bất kỳ khía cạnh nào khác của trò chơi, vì vậy tôi bỏ qua nó). Cách duy nhất tôi thấy là tạo một lớp máy phát có chứa các phương thức như "getRandomPlayerPosition()" và "getRandomPlayerColor()", sau đó tôi có thể giả mạo nó. Đó sẽ là tốt? – forceal

5

Một cách tiếp cận bạn có thể thực hiện là tách ra thế hệ vị trí ngẫu nhiên thành một lớp/giao diện riêng biệt để bạn có thể ghi đè nó trong thử nghiệm và do đó kiểm soát nó.

3

Làm cho nguồn ngẫu nhiên là đầu vào cho thử nghiệm và định cấu hình nó thành giống nhau mỗi lần.

Hầu như tất cả các trình tạo số ngẫu nhiên đều có giá trị 'hạt'. Bằng cách cung cấp cùng một giá trị giống nhau mỗi lần, bạn có thể biết rằng bạn sẽ nhận được cùng một chuỗi các số ngẫu nhiên và do đó đầu ra của ứng dụng của bạn phải giống hệt nhau.

Tôi phải kiểm tra tất cả các tình huống trong một trường hợp thử nghiệm.

Tại sao? Bạn có thể có nhiều trường hợp kiểm tra. Bạn có thể chọn bất kỳ số lượng hạt giống ngẫu nhiên khác nhau và tùy ý để tạo điều kiện bạn muốn kiểm tra. Hoặc chỉ cần thay thế vị trí ngẫu nhiên bằng một vị trí cụ thể cho mục đích của thử nghiệm.

1

Có hai điều khác nhau để kiểm tra ở đây, và bạn nên kiểm tra chúng một cách riêng biệt:

  • Liệu các công việc chương trình logic cho tất cả các vị trí khởi đầu có thể? Kiểm tra điều này bằng cách định vị trình phát không ngẫu nhiên tại một số vị trí, cố gắng bao gồm tất cả "trường hợp đặc biệt".
  • Vị trí ngẫu nhiên có thực sự ngẫu nhiên không? Kiểm tra điều này bằng cách chỉ gọi logic định vị nhiều lần và thực hiện một số phân tích thống kê.
0

Theo lý thuyết thử nghiệm không thể kiểm tra hành vi ngẫu nhiên :) Mặt khác, như trong các câu trả lời trước đây, cho các thử nghiệm của bạn, bạn có thể tạo các hoạt động giả ngẫu nhiên bằng cách nào đó.

1

Như các câu trả lời khác cho biết, các thuật toán ngẫu nhiên là xác định. bạn có thể tái tạo một chuỗi nếu bạn sử dụng cùng một hạt giống.

Các tình huống duy nhất mà tôi phải đối phó với mã không xác định, là khi đa luồng được tham gia. Sau đó, bạn phụ thuộc vào bộ lập lịch của hệ điều hành.

Trong những trường hợp đó, tôi viết kiểm tra đơn vị làm vòng lặp, lặp lại hàng ngàn lần mã thử nghiệm.

Các vấn đề liên quan