2010-06-08 25 views
8

Ví dụ:Ý tưởng tồi là tạo các xét nghiệm dựa vào nhau trong một trận thi đấu?

// NUnit-like pseudo code (within a TestFixture) 

Ctor() 
{ 
m_globalVar = getFoo(); 
} 

[Test] 
Create() 
{ 
a(m_globalVar) 
} 

[Test] 
Delete() 
{ 
// depends on Create being run 
b(m_globalVar) 
} 

... hoặc ...

// NUnit-like pseudo code (within a TestFixture) 

[Test] 
CreateAndDelete() 
{ 
Foo foo = getFoo(); 
a(foo); 

// depends on Create being run 
b(foo); 
} 

... Tôi đi với sau này, và giả định rằng câu trả lời cho câu hỏi của tôi là:

Không, ít nhất là không với NUnit, bởi vì according to the NUnit manual:

Nhà xây dựng không nên có bất kỳ tác dụng phụ nào, vì NUnit có thể xây dựng nhiều lớp học es trong quá trình phiên.

... ngoài ra, tôi có thể giả định thực tiễn không tốt nói chung không? Vì các thử nghiệm thường có thể được chạy riêng. Vì vậy, kết quả của Tạo có thể không bao giờ bị xóa bởi Xóa.

Trả lời

6

Vâng, thực tiễn không tốt. Trong tất cả các khung kiểm thử đơn vị tôi biết, thứ tự thực hiện của các phương thức thử nghiệm không được đảm bảo, do đó việc viết các kiểm thử phụ thuộc vào thứ tự thực hiện được ngăn cản một cách rõ ràng. Như bạn cũng lưu ý, nếu kiểm tra B phụ thuộc vào (bên) tác dụng của thử nghiệm A, hoặc kiểm tra A có chứa một số mã khởi tạo chung (sau đó nên được chuyển vào một phương pháp thiết lập chung để thay thế), hoặc hai thử nghiệm là một phần của cùng một câu chuyện, vì vậy họ có thể thống nhất (IMHO - một số người dính vào việc có một khẳng định cho mỗi phương pháp thử nghiệm, vì vậy họ sẽ không đồng ý với tôi về điều này), hoặc thử nghiệm B nếu không được thực hiện hoàn toàn độc lập với thử nghiệm A liên quan đến lịch thi đấu thiết lập.

+0

Tôi đồng ý với điều này nhưng không phải tất cả đều thấy TestNG http://testng.org/doc/index.html là một cải tiến về jUnit theo nhiều cách nhưng cũng cho phép kiểm tra phụ thuộc - đặc biệt là xem http: // beust.com/weblog/2004/02/08/junit-pain/vì lý do của authour – Mark

+0

@Mark, tôi không quen thuộc với TestNG, cảm ơn vì liên kết. –

+1

@Mark: Lý do được đưa ra trong liên kết thứ hai thực sự là quan trọng. Đối với các bài kiểm tra đơn vị, cơ sở dữ liệu nên được giả lập và vì vậy chi phí thiết lập và rách tài nguyên sẽ bị bỏ qua, và để kiểm tra tích hợp, bạn có thể chi trả chi phí (bạn cũng phải làm những việc như đặt cơ sở dữ liệu vào một trạng thái đã biết và những thứ như thế, có thể có tác động khá lớn đến bản thân họ). –

0

Nói chung, thực hành tốt là làm cho mỗi bài kiểm tra của bạn kiểm tra chính xác một điều hoặc một chuỗi thứ. (Chúng là các kiểu kiểm tra khác nhau, nhưng ngay cả như vậy.) Trừ khi bạn đang thử nghiệm hàm tạo hoặc trình tự hủy, chúng nên được thực hiện như một phần của việc thiết lập thử nghiệm và mã rách, chứ không phải bản thân các bài kiểm tra. Không sao nếu không hiệu quả về điều này; điều quan trọng với một thử nghiệm là nó được rõ ràng chính xác những gì đang được thử nghiệm, không phải là bạn giảm thiểu số lượng các hành động phụ trợ thực hiện trong quá trình này.

Nhiều lần khai thác thử nghiệm cũng cho phép bạn chỉ chạy một tập hợp con các thử nghiệm (tối thiểu chỉ là một). Điều này thật tuyệt vời khi bạn tập trung vào một lỗi cụ thể! Nhưng nó có nghĩa là các bài kiểm tra cần phải được viết để không có sự phụ thuộc hoặc mọi thứ sẽ là vô nghĩa.

Cá nhân, tôi sẽ thử nghiệm các nhà thầu và trình phá hủy sớm hơn trong bộ thử nghiệm của tôi hơn là kiểm tra hành vi của các trường hợp được xây dựng, nhưng YMMV.

1

Chắc chắn là một ý tưởng tồi. Các bài kiểm tra đơn vị phải nhẹ, không có quốc tịch và không phụ thuộc vào những thứ như hệ thống tệp, đăng ký, v.v. Điều này cho phép chúng chạy nhanh và ít bị giòn.

Nếu các bài kiểm tra của bạn yêu cầu thi hành theo một thứ tự nhất định, thì bạn không bao giờ có thể chắc chắn (ít nhất là không có điều tra) xem thử nghiệm có thất bại hay không.

Điều này cuối cùng sẽ dẫn đến sự thiếu tự tin phát triển liên quan đến bộ thử nghiệm của bạn và sự từ bỏ cuối cùng.

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