2010-02-11 41 views
7

Thông thường khi sử dụng tiêm phụ thuộc, kiểm tra đơn vị (và các thử nghiệm khác) chịu trách nhiệm tạo/chèn phụ thuộc vào hệ thống dưới thử nghiệm và tiêm chúng.Tiêm phụ thuộc vào các thử nghiệm

Tuy nhiên, đôi khi bản thân kiểm tra có phụ thuộc hoặc cần phải tiêm phụ thuộc vào SUT mà bản thân nó không thể tạo. Ví dụ, khi kiểm tra các lớp tương tác với cơ sở dữ liệu, kiểm thử cần biết các chuỗi kết nối và tên danh mục, vv, không thể mã hóa cứng vì chúng không nhất thiết giống với tất cả mọi người chạy thử nghiệm.

Vì vậy, làm cách nào bạn khuyên bạn nên thử nghiệm tìm ra các cài đặt này? Do một số khuôn khổ kiểm tra kiểu xUnit cung cấp một cách để cung cấp cho phụ thuộc vào một vật cố thử nghiệm? Lớp thử nghiệm có các thuộc tính tĩnh bạn cư trú trước khi chạy tất cả các thử nghiệm không? Nên thử nghiệm bỏ qua thực hành DI và chỉ cần đi và nhận được sự phụ thuộc từ một số nơi toàn cầu? Các đề xuất khác?

Trả lời

1

Khi bạn đang sử dụng khuôn khổ kiểm tra đơn vị để làm các xét nghiệm hội nhập, bạn không thực sự có một DI hay một vấn đề kiểm tra đơn vị.

Những gì bạn có là các thử nghiệm tích hợp thúc đẩy khung kiểm tra đơn vị được hỗ trợ cao.

Vì chúng là các bài kiểm tra tích hợp, chúng khác nhau bằng hiện vật từ các bài kiểm tra đơn vị. Các "độc lập-ness" không thực sự đếm nữa.

Cách tốt nhất để có được cài đặt thử nghiệm tích hợp thay đổi từ người dùng này sang người dùng khác là nhận được cùng một cách mà ứng dụng cuối cùng sẽ nhận được chúng. Nếu bạn đang làm việc trong Java, bạn có thể có một tệp thuộc tính. Trong Python, chúng tôi có các tệp cài đặt Django đặc biệt để thử nghiệm tích hợp.

3

Có nguyên tắc cho kiểm tra hoàn toàn tự động: bạn có thể kéo tất cả mã nguồn xuống khỏi kho kiểm soát nguồn và chỉ cần chạy thử nghiệm.

Do môi trường (máy) có cơ sở cài đặt chính xác (ví dụ: trình biên dịch, khung kiểm tra, công cụ cơ sở dữ liệu nếu có liên quan, v.v.) các bài kiểm tra chịu trách nhiệm thiết lập Lịch thi đấu trước khi thực hiện các trường hợp kiểm tra.

Điều đó có nghĩa rằng cho cơ sở dữ liệu, các bài kiểm tra nên

  1. tạo cơ sở dữ liệu trong câu hỏi
  2. chạy thử nghiệm của nó
  3. xóa cơ sở dữ liệu một lần nữa sau khi trường hợp thử nghiệm cuối cùng

Nếu, vì một số lý do bạn không thể làm điều đó, điều duy nhất bạn thực sự có thể làm là có một tệp cấu hình trong hệ thống kiểm soát nguồn có chứa các mục dành riêng cho máy cho tất cả các máy trong thử nghiệm của bạn invironment; ví dụ. cho máy Tst1 chuỗi kết nối là một giá trị, nhưng đối với Tst2 là một giá trị khác.

Điều này có thể trở nên cực kỳ nhanh chóng, vì vậy sẽ dễ dàng hơn khi thử nghiệm chịu trách nhiệm cho Thiết lập lịch thi đấu và Teardown, vì điều đó có nghĩa là họ chỉ có thể sử dụng giá trị được mã hóa cứng hoặc giá trị được tạo tại chỗ.

Điều này thực sự không có gì để làm với DI ...

1

DI chiến đấu với dependecies phức tạp, trong khi kiểm tra đơn vị của bạn phải là hầu hết thời gian RẤT đơn giản. Đơn vị điển hình kiểm tra sẽ kiểm tra một khía cạnh riêng biệt của một lớp cô lập. Thay vì tất cả các phụ thuộc của nó, bạn tạo các mocks và (thường) tiêm chúng thông qua hàm tạo CUT (Class Under Test). Bạn thường không cần các khung công tác DI ở đây.

Nhưng. Một số xét nghiệm cấp cao hơn vẫn có thể hỏi lại các phụ thuộc không bị chế nhạo. Ví dụ, bạn muốn thử nghiệm trên một tập dữ liệu lớn và bạn không muốn tạo một nguồn dữ liệu giả đặc biệt để bạn giữ nó trong một DB thực (có thể bạn cũng làm một số kiểm tra giao diện người dùng với dữ liệu đó). Trong trường hợp đó tôi vẫn cố gắng giữ mọi thứ càng đơn giản càng tốt, khởi tạo các bài kiểm tra trong các phương thức thiết lập lớp/thiết lập thử nghiệm.

Bạn thấy đấy, bạn cần phải cẩn thận ở đây.Bất cứ khi nào bạn thực hiện một thử nghiệm lớn, phức tạp, bạn:

  1. Tạo mã phức tạp bổ sung, yêu cầu hỗ trợ.
  2. Tạo thử nghiệm không có lý do rõ ràng để thất bại. Nó có thể thất bại do một kết nối xấu vào ngày đó. Bạn không thể dựa vào kết quả của nó.
  3. Tạo thử nghiệm không thể chạy dễ dàng và nhanh chóng, ví dụ như khi đăng ký. Ít người hơn sẽ chạy nó, nhiều lỗi sẽ đi qua.

vv ...

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