2013-07-26 26 views
5

Khi đọc đối tượng đang phát triển Phần mềm định hướng được hướng dẫn bằng các thử nghiệm, tôi đã học được cách ly kiểm tra và tính linh hoạt của thử nghiệm. Ý tưởng cho rằng mỗi bài kiểm tra phải rất cụ thể đối với một đoạn mã hoặc chức năng, và sự chồng chéo của phạm vi mã bằng các bài kiểm tra nên được giữ ở mức tối thiểu. Lý tưởng ngụ ý rằng mỗi thay đổi trong mã sẽ dẫn đến phá vỡ chỉ một thử nghiệm. Tránh dành thời gian trải qua nhiều lần kiểm tra bị hỏng để xác nhận rằng một thay đổi là nguyên nhân và nếu nó được sửa đổi bởi các sửa đổi kiểm tra.Điều gì sẽ được mô phỏng cho thử nghiệm tích hợp?

Bây giờ điều này có vẻ dễ dàng đủ cho các bài kiểm tra đơn vị, chúng rất cô lập bởi bản chất của chúng. Tuy nhiên khi được trình bày bởi các bài kiểm tra tích hợp, có vẻ khó để tránh có nhiều bài kiểm tra thực hiện cùng một đường dẫn mã, đặc biệt khi chạy ngoài các bài kiểm tra đơn vị.

Vì vậy, câu hỏi của tôi, là những phụ thuộc nên được chế giễu khi thực hiện thử nghiệm tích hợp? Có nên chế giễu gì không? Nên một con đường thực thi duy nhất được kiểm tra, và tất cả các tác dụng phụ không liên quan trực tiếp đến đường dẫn mã này được giả lập?

Tôi đang đùa giỡn với ý tưởng thực hiện thử nghiệm tích hợp theo từng cặp. Kiểm tra một mối quan hệ giữa hai đối tượng và giả lập mọi thứ khác. Sau đó, các thay đổi trong một trong các đối tượng này sẽ có tác động tối thiểu đối với các thử nghiệm tích hợp khác, ngoài việc tạo thành một chuỗi các bài kiểm tra đầu cuối hoàn chỉnh bằng các cặp.

Thanks cho bất kỳ thông tin ..

Sửa: Chỉ cần làm rõ, tôi đang yêu cầu cơ bản "Làm thế nào để tránh một số lượng lớn không tích hợp kiểm tra trong quá trình bình thường của sự phát triển?". Mà tôi giả định là đạt được bằng cách sử dụng mocks, và tại sao tôi hỏi về những gì để chế giễu.

Cập nhật: Tôi đã tìm thấy một bài nói chuyện rất thú vị về các bài kiểm tra tích hợp của J.B.Rainsberger, tôi nghĩ câu trả lời này khá tốt, nếu có thể gây tranh cãi một chút. Tiêu đề là "Kiểm thử tích hợp là một Scam", vì vậy bạn có thể đoán, ông không chủ trương kiểm thử tích hợp ở tất cả (kết thúc để kiểm tra kiểu kết thúc). Lập luận cho rằng các xét nghiệm tích hợp sẽ luôn luôn thấp hơn nhiều so với số tiền cần thiết để kiểm tra kỹ lưỡng các tương tác có thể xảy ra (do nổ kết hợp), và có thể đưa ra một sự tự tin sai lầm. Thay vào đó, ông đề xuất những gì ông gọi là Thử nghiệm cộng tác và Kiểm tra hợp đồng. Đó là một cuộc nói chuyện 90 phút và tiếc là bảng trắng không phải là rất rõ ràng và không có ví dụ mã, vì vậy tôi vẫn còn nhận được đầu của tôi xung quanh nó. Khi tôi có một lời giải thích rõ ràng, tôi sẽ viết nó ở đây! Trừ khi một người khác đánh tôi với nó ..

Dưới đây là tóm tắt ngắn gọn về Kiểm tra hợp đồng. Âm thanh như Thiết kế theo xác nhận loại hợp đồng, mà tôi tin rằng có thể/sẽ được triển khai trong mẫu Giao diện Phi ảo trong C++.

http://thecodewhisperer.tumblr.com/post/1325859246/in-brief-contract-tests

thử nghiệm tích hợp là một cuộc nói chuyện Scam video: http://www.infoq.com/presentations/integration-tests-scam

Tóm tắt:

kiểm tra tích hợp là một scam. Có thể bạn đang viết 2-5% trong số các bài kiểm tra tích hợp bạn cần kiểm tra kỹ lưỡng. Bạn có thể là kiểm tra đơn vị trùng lặp trên toàn bộ địa điểm. Kiểm tra tích hợp của bạn có thể trùng lặp nhau trên toàn bộ địa điểm. Khi thử nghiệm tích hợp không thành công, ai biết được những gì bị hỏng?Tìm hiểu về cuộc tấn công hai hướng mà giải quyết vấn đề: kiểm tra cộng tác và kiểm tra hợp đồng.

+1

Trong khi tôi chưa đọc GOOS (xấu hổ với tôi), tôi khá chắc chắn rằng nó không nói về các bài kiểm tra tích hợp khi nó nói rằng chỉ có một bài kiểm tra sẽ thất bại cho mỗi một thay đổi. –

+0

Tôi hiểu, vì vậy bạn cho rằng sự mong manh thử nghiệm áp dụng nhiều hơn cho các bài kiểm tra đơn vị hơn là các bài kiểm tra tích hợp? Tôi thử nghiệm tích hợp sẽ được coi là vốn mong manh hơn và dự kiến ​​sẽ thất bại thường xuyên hơn? – NitrousUK

+1

Không, hoàn toàn ngược lại. Các bài kiểm tra tích hợp kiểm tra một bức tranh lớn hơn, miễn là chức năng mà chúng kiểm tra không thay đổi, chúng không được phép thất bại. –

Trả lời

1

Đối với các bài kiểm tra tích hợp, bạn nên thử số tiền tối thiểu phụ thuộc để có được những hoạt động kiểm tra, nhưng không ít :-)

Kể từ sự tích hợp của các thành phần trong hệ thống của bạn rõ ràng là điều bạn muốn kiểm tra trong quá trình thử nghiệm tích hợp, bạn nên sử dụng các triển khai thực sự càng nhiều càng tốt. Tuy nhiên, có một số compontents bạn rõ ràng muốn giả lập, vì bạn không muốn các bài kiểm tra tích hợp của bạn bắt đầu gửi thư cho người dùng của bạn chẳng hạn. Khi bạn không chế nhạo những phụ thuộc này, bạn rõ ràng là chế nhạo quá ít.

Điều đó không có nghĩa là btw bạn không nên cho phép kiểm tra tích hợp gửi thư, nhưng ít nhất bạn muốn thay thế thành phần thư bằng thành phần thư sẽ chỉ gửi thư đến một hộp thư kiểm tra nội bộ.

+0

Vấn đề tôi có là về mặt lý thuyết, tôi có thể thử mọi thứ và thử nghiệm có thể hoạt động. Chẳng hạn như một thử nghiệm cho một số đối tượng để cộng tác để tính toán một giá trị, tôi chỉ có thể có một mô hình trả về giá trị đó. Có thể sử dụng một số kiểu tiếp cận TDD để giả lập mọi thứ, sau đó mở rộng kiểm thử tích hợp cho đến khi mock không đủ và yêu cầu mã thực, với tổng số mã là mục tiêu cuối cùng? Tôi donno ... cho tôi một nhức đầu suy nghĩ về nó đôi khi – NitrousUK

+1

Không, vận chuyển, phần mềm làm việc là mục tiêu cuối cùng. :) Mức độ mã bảo mật cao hợp lý có thể giúp bạn “làm việc”. Nhắm đến 100% không giúp được vận chuyển và có thể gây hại "làm việc". –

+0

Nếu có một mục tiêu như tổng phạm vi phủ sóng, nó không phải là tổng số * mã * phạm vi phủ sóng nhưng tổng * tính năng * phủ sóng, tức là mọi tính năng đều được kiểm tra của bạn. –

1

Kiểm thử đơn vị phải có đối tượng giả, nhưng thử nghiệm tích hợp sẽ có ít nếu có bất kỳ phần mềm nào (nếu không tích hợp gì?) Tôi nghĩ rằng quá mức cần phải thực hiện ghép đôi; nó sẽ dẫn đến một sự bùng nổ của các xét nghiệm mà mỗi người có thể mất một thời gian dài và rất nhiều bản sao và dán mã sẽ là một nỗi đau để thay đổi nếu yêu cầu thay đổi hoặc các tính năng mới được thêm vào sau này.

Tôi nghĩ rằng không có bất kỳ mocks nào trong các bài kiểm tra tích hợp. Bạn nên có tất cả mọi thứ chế giễu trong các bài kiểm tra đơn vị để biết rằng mỗi đơn vị cá nhân hoạt động như mong đợi trong sự cô lập. Bài kiểm tra tích hợp kiểm tra mọi thứ hoạt động với nhau.

+0

Vấn đề chính tôi đang cố gắng giải quyết, là khi có thay đổi hợp lệ, làm thế nào để tránh được số lượng lớn các kiểm tra tích hợp không thành công? Không có mocks, mọi thứ chạm vào sự thay đổi sẽ thất bại và cần được chú ý. – NitrousUK

+0

Tùy thuộc vào những gì đã thay đổi Tôi nghĩ rằng đó là một điều tốt mà các bài kiểm tra tích hợp sẽ thất bại. Nếu một giao diện cho một trong những thay đổi phụ thuộc, kiểm tra tích hợp NÊN thất bại vì chúng tôi đang thử nghiệm rằng chúng tôi đang giao tiếp chính xác với các phụ thuộc của chúng tôi. – dkatzel

+0

Nhưng câu hỏi của tôi cho bạn sẽ là, bao nhiêu nên thất bại? Một số có thể chấp nhận được là gì?Về lý thuyết, nếu có hàng trăm bài kiểm tra, và tất cả đều dựa vào một số thành phần thiết yếu, như cơ sở dữ liệu, thì nếu cơ sở dữ liệu đó thay đổi, có thể hàng trăm bài kiểm tra có thể thất bại. – NitrousUK

1

Để kiểm tra tích hợp, tôi nghiêng về chế độ nhạo dịch vụ thay vì biểu diễn ví dụ sử dụng mirage thay vì REST API của bên thứ 3 và Dumpster thay vì máy chủ SMTP thực.

Điều này có nghĩa là tất cả các lớp mã của bạn đã được kiểm tra, nhưng không có bên thứ ba nào được kiểm tra để bạn có thể tự do tái cấu trúc mà không lo lắng rằng các thử nghiệm sẽ thất bại.

0

Thảo luận về Hợp đồng/Cộng tác viên mẫu thử (được mô tả bởi JB Rainsberger trong "Kiểm tra tích hợp là một Scam" được đề cập trong câu hỏi ở trên). Liên quan đến câu hỏi ở đây - tôi giải thích bài nói chuyện của anh ta có nghĩa là khi bạn sở hữu mã cho cả phía dịch vụ và phía máy khách, thì bạn không cần bất kỳ kiểm thử tích hợp nào cả. Thay vào đó bạn sẽ có thể dựa vào mocks mà thực hiện một hợp đồng.

Cuộc nói chuyện là một tham chiếu tốt cho mô tả cấp cao về mẫu nhưng không đi sâu vào chi tiết (ít nhất là đối với tôi) về cách xác định hoặc tham chiếu hợp đồng từ cộng tác viên.

Một ví dụ phổ biến về nhu cầu cho Hợp đồng/Cộng tác viên mẫu nằm giữa máy chủ/ứng dụng khách API (bạn sở hữu mã của cả hai). Đây là cách tôi đã thực hiện nó:

Xác định hợp đồng:

Đầu tiên xác định Schema API, nếu API của bạn sử dụng JSON bạn có thể xem xét JSONSchema. Định nghĩa lược đồ có thể được coi là "Hợp đồng" của API.(Và như một mặt lưu ý, nếu bạn sắp làm điều đó, chắc chắn rằng bạn biết về RAML hay Swagger vì họ chủ yếu làm bằng văn bản JSONSchema API rất nhiều dễ dàng hơn)

Tạo đồ đạc mà thực hiện hợp đồng:

  • Ở phía máy chủ, mô phỏng yêu cầu của khách hàng để cho phép kiểm tra đơn vị các yêu cầu/phản hồi. Để làm điều này, bạn sẽ tạo ra các thiết bị yêu cầu khách hàng (hay còn gọi là mocks). Khi bạn đã xác định API của mình, hãy xác thực các đồ đạc đối với JSONSchema để đảm bảo rằng chúng tuân thủ. Có một loạt các trình xác nhận lược đồ - tôi hiện đang sử dụng AJV (Javascript) và jsonschema (Python), nhưng hầu hết các ngôn ngữ nên có một triển khai thực hiện.

  • Trên (các) khách hàng, bạn có khả năng sẽ loại bỏ các phản hồi của máy chủ để cho phép kiểm tra đơn vị các yêu cầu. Thực hiện theo cùng một mẫu với máy chủ, xác nhận hợp lệ yêu cầu và các phản hồi thông qua JSONSchema.

Nếu cả hai Client và Server được xác nhận đồ đạc của họ chống lại các hợp đồng, sau đó bất cứ khi nào những thay đổi hợp đồng API, ra khỏi hiện thực ngày trên cả hai bên sẽ không xác nhận JSONSchema và bạn sẽ biết đó là thời gian để cập nhật đồ đạc của bạn và có thể là mã dựa trên những đồ đạc đó.

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