Làm thế nào có bài kiểm tra đơn vị ổi được tạo ra tự động?


31

Quả ổi có các trường hợp kiểm tra đơn vị được tạo tự động :

Quả ổi có số lượng thử nghiệm đơn vị đáng kinh ngạc: tính đến tháng 7 năm 2012, gói thử nghiệm ổi bao gồm hơn 286.000 trường hợp thử nghiệm riêng lẻ. Hầu hết trong số này được tạo tự động , không được viết bằng tay, nhưng phạm vi kiểm tra của Guava cực kỳ kỹ lưỡng, đặc biệt là đối với com.google.common.collect.

Chúng được tạo ra như thế nào? Những kỹ thuật và công nghệ đã được sử dụng để thiết kế và tạo ra chúng?


Tôi nhớ đã thấy một cuộc nói chuyện của một số anh chàng google đã chạm vào chủ đề này. Mặc dù không có manh mối nào về cái tên, cuộc nói chuyện đã diễn ra tại một số hội nghị java mà tôi nghĩ
Zavior

3
gói com.google.common.collect.testing có rất nhiều lớp với "Trình tạo" trong tên của chúng - làm cho nó trông giống như một khung để tạo thử nghiệm. Ngoài ra còn có các gói phụ với các lớp được ghi nhận là "bộ xương" hoặc "lớp cơ sở" để kiểm tra ...
gnat

1
@gnat Vâng, tôi chắc chắn tôi đã nhìn thấy nó ở đâu đó. Ví dụ, com.google.common.collect.testing.features hiển thị các tfeatures / ràng buộc mà một lớp bộ sưu tập cần đáp ứng và một trường hợp thử nghiệm là sự kết hợp của chúng. Bằng cách này, họ có thể tham gia thử nghiệm
dzieciou


Câu hỏi đã nhận được nhiều sự quan tâm của cộng đồng nhưng cho đến nay vẫn chưa có câu trả lời hợp lý, vì vậy tôi đã làm theo gợi ý của Martin và đặt nó ở đây: sqa.stackexchange.com/questions/5214/ .
dzieciou

Câu trả lời:


8

Một phần lớn của khối lượng thử nghiệm này là dành cho việc triển khai bộ sưu tập ổi. Họ đã viết các bài kiểm tra chung để kiểm tra toàn diện các giao diện bộ sưu tập và điều này tạo ra một bộ cho mỗi lần thực hiện. Xem, ví dụ, các lớp học được gọi là CollectionAddAllTester, ListIndexOfTester.

Tất cả được hỗ trợ bởi một thư viện có tên testlib, được vận chuyển như một phần của Guava. Điều này khá chung chung. Nó hỗ trợ viết các bài kiểm tra chung cho bất kỳ giao diện nào (không chỉ các bộ sưu tập). Bạn có thể chỉ định Featurecác triển khai có thể và kiểm tra các triển khai đó (ví dụ: nếu bộ của bạn không thể thay đổi được, bạn mong đợi một kết quả khác set.add()) và khi bạn chạy thử nghiệm, bạn chỉ định các tính năng triển khai của bạn hỗ trợ.

Nó dựa trên JUnit 3, không phải 4. Thông thường, bạn có một lớp mở rộng TestCaseđầy đủ các phương thức được đặt tên testSomething()và JUnit chạy chúng một cách phản xạ. Thư viện testlib nối vào việc chạy các thử nghiệm này để vòng đời trông như thế này:

  • Đối với mỗi triển khai bạn muốn kiểm tra
  • Đối với mỗi phương pháp thử nghiệm (áp dụng)
  • Tạo TestCaseví dụ
  • Khởi tạo TestSubjectGenerator- đây là giao diện testlib mà bạn mở rộng nơi bạn thực sự tạo đối tượng thử nghiệm
  • Phản xạ chạy phương pháp thử. Trong phương pháp này, getSubjectGenerator()cung cấp quyền truy cập vào đối tượng thử nghiệm

Bit chính là bước khởi tạo thêm cho phép họ đưa một đối tượng thử nghiệm cụ thể vào trường hợp thử nghiệm chung.

Tôi đã viết một bài về cách viết bộ tạo testlib cho giao diện của riêng bạn.

(Cũng được đăng lên cùng một câu hỏi trên trang web sqa .)


6

Có máy phát điện thử nghiệm đơn vị. Ví dụ, trong thế giới .NET, một cái gì đó như Microsoft Pex có thể làm điều này.

Ví dụ: Microsoft Pex cố gắng dựa trên phân tích mã tất cả các giá trị có thể làm đối số cho một phương thức. Một số đối số dự kiến ​​sẽ để phương thức đưa ra một ngoại lệ. Những thứ như vậy có thể tự động kiểm tra được tạo ra cho. Các giá trị tĩnh như một chuỗi rỗng được trả về trong một số trường hợp nhất định cũng có thể được kiểm tra tự động.


2
Đó là một thử nghiệm ngẫu nhiên chỉ hữu ích cho thử nghiệm đường dẫn âm (ngoại lệ, đầu vào không hợp lệ, sự cố, hết thời gian chờ). Tôi tin rằng họ đã tạo ra các thử nghiệm cũng cho đường dẫn hạnh phúc và điều này đòi hỏi thiết kế nhiều hơn, không chỉ là khởi chạy công cụ phân tích tĩnh.
dzieciou

Và tôi biết có nhiều cách và công cụ để tạo thử nghiệm cho đường dẫn hạnh phúc (ví dụ: xem câu trả lời này ), nhưng tôi quan tâm đến cách thức này được thực hiện trong trường hợp cụ thể của Guava
dzieciou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.