Có ba cách để tổ chức các bài kiểm tra đơn vị: Kiểm tra mỗi Lịch thi đấu, Lớp học hoặc Tính năng. Nhưng thuộc tính NUnit cho TestClass được gọi là TestFixture. Có lý do lịch sử nào cho điều đó không?Tại sao testFixture thay vì TestClass?
Trả lời
Lý do lịch sử chính là NUnit bắt đầu cuộc sống như một cổng thẳng từ JUnit và junit gọi nó là vật cố thử nghiệm.
NUnit 1.0 trước thời gian của tôi nhưng tôi đã được yêu cầu bắt đầu bằng cách đổi tên tất cả các tệp .java trong JUnit thành tệp .cs và cố gắng biên dịch. Nó đã được cố định từ đó và một giao diện người dùng đã được thêm vào. Khi tôi tham gia vào NUnit 2.0, vẫn còn một phương thức trong NUnit 1.0 được gọi là IsVisualAgeForJava
vì JUnit có hành vi đặc biệt cho điều đó vào thời điểm đó.
Trong NUnit 2.0, mục tiêu của chúng tôi là làm cho NUnit thêm .NET. Vì vậy, chúng tôi đã thêm các thuộc tính và một loạt các nội dung khác. Tất cả chúng tôi đến từ nguồn gốc java và đã làm việc với JUnit trong nhiều năm. Có vẻ như khá tự nhiên khi sử dụng [TestFixture]
.
Bây giờ bạn hỏi về nó, tôi chỉ tìm kiếm nó.
Một vật cố định là trạng thái cơ bản cố định phải được thiết lập trước khi chạy thử, sao cho kết quả có thể dự đoán và lặp lại được. Trong các khuôn khổ thử nghiệm đơn vị, chúng tôi sử dụng các thuộc tính/phương pháp SetUp và TearDown để tạo/phá hủy vật cố thử nghiệm (ví dụ: khởi tạo các biến mẫu với các đối tượng phù hợp).
Tôi tôn trọng phản ứng của Mike Two, nhưng tôi sẽ khẳng định rằng nhóm NUnit nhận được điều này rất sai, và việc sử dụng [TestFixture]
là một mụn cóc ngữ nghĩa khi đối mặt với NUnit. Lớp kiểm tra không phải là vật cố định. Từ những gì tôi đã đào tạo liên quan đến JUnit, tôi đã không tìm thấy bất kỳ tham chiếu đến một lớp thử nghiệm như một trận đấu thử nghiệm, cũng như tôi không tìm thấy nhiều cuộc thảo luận về "thử nghiệm đồ đạc" đề cập đến các lớp học thử nghiệm. Thay vào đó, tất cả các cuộc thảo luận JUnit/xUnit về đồ đạc liên quan đến thiết lập và teardown, mà, tất nhiên, là những phương pháp phổ biến được sử dụng để thiết lập đồ đạc thử nghiệm thực tế.
Lưu ý rằng trong NUnit 2.5, bạn có thể xóa chú thích [TestFixture].
Cập nhật: (July 2012)
Tôi chỉ đọc Sách dưa chuột và trên trang 99, tác giả Matt Wynne giải thích nguồn gốc của việc sử dụng "vật cố." Tôi trích dẫn:
Có một truyền thống lâu đời (đến từ thế giới phần cứng, nơi thử nghiệm thiết bị bắt nguồn) gọi liên kết giữa hệ thống kiểm tra và hệ thống đang thử nghiệm. Đây là vai trò "mã keo" mà chúng tôi đã đề cập trong cuốn sách này là mã tự động hóa. Khung kiểm tra FIT sử dụng ý nghĩa của thuật ngữ này. Một số công cụ kiểm tra đơn vị (chẳng hạn như NUnit) đã làm rối loạn thêm vấn đề bằng cách tham khảo chính lớp vỏ thử nghiệm như một vật cố định. Rất nhiều cho một ngôn ngữ phổ biến! (Wynne & Hellesoy, 2012)
- 1. Tại sao darcs thay vì git?
- 2. Tại sao NDEBUG thay vì RELEASE?
- 3. Tại sao nhập javax.swing. * Thay vì java.swing. *
- 4. Tại sao FloatBuffer thay vì phao []?
- 5. Tại sao chặn thay vì lặp?
- 6. Tại sao CHỌN 0, ... thay vì CHỌN
- 7. Tại sao sử dụng tăng :: ice_or thay vì || và tăng :: ice_and thay vì && trong enable_if?
- 8. Tại sao Arrays.sort lấy Object [] thay vì Comparable []?
- 9. Tại sao nên sử dụng Function.prototype.bind thay vì Function.prototype.call?
- 10. Tại sao sử dụng registerDefaults: thay vì setValue: forKey :?
- 11. tại sao nó sử dụng movl thay vì đẩy?
- 12. Tại sao Matlab được viết bằng C thay vì Fortran?
- 13. Tại sao null == myVar thay vì myVar == null?
- 14. Tại sao RTP sử dụng UDP thay vì TCP?
- 15. Tại sao trả lại NotImplemented thay vì nâng NotImplementedError
- 16. Tại sao sử dụng singleton thay vì lớp tĩnh?
- 17. Tại sao CompositionTarget.Rendering lấy EventArgs thay vì RenderingEventArgs?
- 18. Tại sao sử dụng tai thay vì chiến tranh?
- 19. Tại sao sử dụng ROLAP thay vì MySQL đơn giản?
- 20. Tại sao sử dụng Enums thay vì Constants?
- 21. Tại sao frame-> pts tăng 20, thay vì 1?
- 22. Tại sao tạo serialVersionUID dài thay vì 1L đơn giản?
- 23. Tại sao nosql với cassandra thay vì mysql?
- 24. Tại sao nên sử dụng GWT.create() thay vì mới?
- 25. Tại sao sử dụng singleton thay vì phương pháp tĩnh?
- 26. Tại sao tôi nên POST dữ liệu thay vì GET?
- 27. Tại sao `this.synchronized` thay vì chỉ` đồng bộ` trong Scala?
- 28. Tại sao sử dụng jQuery trên() thay vì nhấp chuột()
- 29. Tại sao UnderscoreJS sử dụng toString.call() thay vì typeof?
- 30. Tại sao memo.Lines sử dụng TStrings thay vì TStringList?
Tôi đồng ý với bạn. Đó là một sai lầm. Một khi nó là có nó rất khó để lấy lại. Tuy nhiên tôi nghĩ rằng có hành vi tương tự trong JUnit vào thời điểm đó. Tôi có thể hoàn toàn sai. Đây là tất cả vào đầu năm 2002 và tôi có thể nhớ nó không chính xác. Dù bằng cách nào bạn cũng chính xác trong khẳng định của bạn rằng một lớp kiểm tra và một vật cố định là những thứ khác nhau. –
Cảm ơn Mike Two, tôi luôn bị cuốn hút bởi lịch sử tầng hầm đằng sau các dự án trong thủ công của chúng tôi. Tôi cũng nhận ra rằng nếu tôi không thích nó, tôi không nên rên rỉ nhưng gửi một bản vá. Tôi tự hỏi liệu tôi có quá đáng kể vì không ai khác đã thực hiện thay đổi này với NUnit cho đến nay. – ybakos
Tôi đã xem xét thay đổi nó một vài lần. Tôi đã đánh một bức tường các vấn đề với khả năng tương thích ngược.Tôi đã ngừng hoạt động NUnit thường xuyên nhiều năm trước vì vậy tôi không có ý định thay đổi nó trong tương lai. –