2010-10-01 30 views
20

Làm thế nào để bạn làm thử nghiệm đơn vị khi bạn cóUnit-thử nghiệm với sự phụ thuộc giữa các xét nghiệm

  • một số đơn vị tổng kiểm tra
  • xét nghiệm phức tạp hơn việc kiểm tra các trường hợp cạnh, tùy thuộc vào những người chung

Để đưa ra ví dụ, hãy tưởng tượng thử nghiệm trình đọc CSV (Tôi vừa tạo ký hiệu để minh họa),

def test_readCsv(): ... 

@dependsOn(test_readCsv) 
def test_readCsv_duplicateColumnName(): ... 

@dependsOn(test_readCsv) 
def test_readCsv_unicodeColumnName(): ... 

Tôi mong đợi các bài kiểm tra phụ chỉ được chạy nếu thử nghiệm cha mẹ của họ thành công. Lý do đằng sau việc này là chạy các kiểm tra này cần có thời gian. Nhiều báo cáo thất bại mà quay trở lại một lý do duy nhất sẽ không được nhiều thông tin. Tất nhiên, tôi có thể xé tất cả các trường hợp cạnh vào bài kiểm tra chính, nhưng tôi tự hỏi liệu có cách nào có cấu trúc hơn để làm điều này không.

tôi đã tìm thấy những liên quan nhưng câu hỏi khác nhau,

UPDATE:

tôi đã tìm thấy TestNG trong đó có vĩ đại được xây dựng trong hỗ trợ cho kiểm tra phụ thuộc. Bạn có thể viết các bài kiểm tra như thế này,

@Test{dependsOnMethods = ("test_readCsv")) 
public void test_readCsv_duplicateColumnName() { 
    ... 
} 

Trả lời

10

Cá nhân, tôi sẽ không phải lo lắng về việc tạo ra phụ thuộc giữa các đơn vị xét nghiệm. Điều này nghe có vẻ như một chút mùi mã với tôi. Một vài điểm:

  • Nếu kiểm tra không thành công, hãy để những người khác không hiểu ý kiến ​​của quy tắc mà mã bất lợi thay đổi.
  • Lỗi kiểm tra phải là ngoại lệ thay vì tiêu chuẩn, vậy tại sao lại lãng phí công sức và tạo ra sự phụ thuộc khi phần lớn thời gian (hy vọng!) Không có lợi ích nào được bắt nguồn? Nếu thất bại xảy ra thường xuyên, vấn đề của bạn không phải là với phụ thuộc kiểm tra đơn vị nhưng với thất bại kiểm tra thường xuyên.
  • Kiểm tra đơn vị phải chạy rất nhanh. Nếu chúng chạy chậm, hãy tập trung nỗ lực của bạn vào việc tăng tốc độ của các thử nghiệm này thay vì ngăn chặn các lỗi tiếp theo. Làm điều này bằng cách tách mã của bạn nhiều hơn và sử dụng tiêm phụ thuộc hoặc chế nhạo.
+20

Có, NHƯNG: nếu bạn có một điều không thành công và gây ra một loạt các lỗi, bạn không được đảm bảo nhận được các thông báo lỗi theo đúng thứ tự để sửa chúng (đặc biệt là nếu bạn tự động khám phá các thử nghiệm). Ví dụ, chúng tôi có một tập hợp các bài kiểm tra đơn vị kiểm tra xem liệu môi trường web có được thiết lập đúng hay không, cái nào (trong số những thứ khác) có ích cho nhân viên mới. Nếu bạn thiếu tệp X và tệp đó được liên kết tượng trưng ở 3 vị trí, trước tiên bạn muốn sửa tệp bị thiếu. Điều đó có thể không hiển nhiên đối với một newbie và do đó bạn làm giảm tính hữu ích của bộ thử nghiệm. –

+0

Có một số trường hợp phụ thuộc * cần * giữa các bài kiểm tra. Ví dụ: Kiểm tra trình bao bọc API đăng nhập vào máy chủ bên ngoài. Phiên đăng nhập đó cần phải được chia sẻ giữa các lần kiểm tra. –

2

Tôi không chắc chắn những gì ngôn ngữ mà bạn đang đề cập đến (như bạn không đặc biệt đề cập đến nó trong câu hỏi của bạn) nhưng đối với một cái gì đó giống như PHPUnit có một thẻ @depends rằng sẽ chỉ chạy thử nếu phụ thuộc vào thử nghiệm đã trôi qua.

Tùy thuộc vào ngôn ngữ hoặc kiểm tra đơn vị bạn sử dụng cũng có thể có một cái gì đó tương tự có sẵn

+0

Mã ví dụ là python;) – naught101

0

Theo nguyên tắc kiểm tra đơn vị và nguyên tắc kiểm tra đơn vị tốt nhất, kiểm tra đơn vị không được phụ thuộc vào các nguyên tắc khác.

Mỗi trường hợp kiểm tra nên kiểm tra hành vi cô lập cụ thể.

Sau đó, nếu một số trường hợp thử nghiệm không thành công, bạn sẽ biết chính xác điều gì đã xảy ra với mã của chúng tôi.

+3

Tôi có cùng vấn đề với OP. Tôi có một bài kiểm tra để kiểm tra hàm tạo. Một bài kiểm tra khác để kiểm tra một phương thức trên lớp. Rõ ràng, nếu các nhà xây dựng thất bại, cả hai bài kiểm tra sẽ thất bại, mà HIDES những gì là sai với mã của tôi. Kiểm tra hàm tạo nên thất bại, kiểm tra phương thức nên bỏ qua. – Oddthinking

+0

Điều này bỏ lỡ điểm của câu hỏi. Các thử nghiệm thứ hai có thể chạy trên riêng của mình, độc lập của người đầu tiên, và kiểm tra cụ thể, hành vi cô lập. Tuy nhiên, nếu thử nghiệm đầu tiên thất bại, kiểm tra thứ hai được đảm bảo không thành công, do đó, không có điểm nào chạy nó. – Oddthinking

5

Ống dẫn là phiên bản python TestNG (là thư viện Java).

Xem packages.python.org/proboscis/

Nó hỗ trợ các phụ thuộc, ví dụ:

@test(depends_on=[test_readCsv]) 
public void test_readCsv_duplicateColumnName() { 
    ... 
} 
+0

Không chắc chắn nếu tôi bỏ sót điều gì đó nhưng tôi không thể tìm thấy cách hỗ trợ cả setup_class() và setup() với proboscis. Dường như nó có '@ before_class' nhưng không có' @ before'. – Zitrax

2

Tôi đã triển khai plugin cho Nose (Python) để thêm hỗ trợ cho các phụ thuộc kiểm tra và kiểm tra mức độ ưu tiên.

Như đã đề cập trong các câu trả lời/nhận xét khác thường là ý tưởng tồi, tuy nhiên có thể có ngoại lệ mà bạn muốn thực hiện điều này (trong trường hợp của tôi là hiệu suất cho các bài kiểm tra tích hợp) trạng thái có thể kiểm tra, số phút so với giờ).

Bạn có thể tìm thấy ở đây: nosedep.

Một ví dụ nhỏ là:

def test_a: 
    pass 

@depends(before=test_a) 
def test_b: 
    pass 

Để đảm bảo rằng test_b luôn chạy trước test_a.

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