Sự khác biệt giữa tích hợp và kiểm tra đơn vị là gì?


307

Tôi biết cái gọi là định nghĩa sách giáo khoa về kiểm tra đơn vị và kiểm tra tích hợp. Điều tôi tò mò là khi đến lúc viết bài kiểm tra đơn vị ... Tôi sẽ viết chúng để bao quát càng nhiều bộ lớp càng tốt.

Ví dụ, nếu tôi có một Wordlớp, tôi sẽ viết một số bài kiểm tra đơn vị cho Wordlớp. Sau đó, tôi bắt đầu viết Sentencelớp của mình và khi cần tương tác với Wordlớp, tôi sẽ thường viết các bài kiểm tra đơn vị của mình để chúng kiểm tra cả SentenceWord... ít nhất là ở những nơi chúng tương tác.

Các bài kiểm tra này về cơ bản đã trở thành các bài kiểm tra tích hợp bởi vì bây giờ chúng kiểm tra sự tích hợp của 2 lớp này, hay nó chỉ là một bài kiểm tra đơn vị kéo dài 2 lớp?

Nói chung, vì dòng không chắc chắn này, tôi sẽ hiếm khi thực sự viết các bài kiểm tra tích hợp ... hoặc tôi đang sử dụng sản phẩm hoàn chỉnh để xem liệu tất cả các phần có hoạt động đúng với các bài kiểm tra tích hợp thực tế hay không, mặc dù chúng là thủ công và hiếm khi lặp lại ngoài phạm vi của từng tính năng cá nhân?

Tôi có hiểu nhầm các bài kiểm tra tích hợp, hay thực sự chỉ có rất ít sự khác biệt giữa các bài kiểm tra tích hợp và bài kiểm tra đơn vị?

Câu trả lời:


300

Sự khác biệt chính đối với tôi là các thử nghiệm tích hợp tiết lộ nếu một tính năng đang hoạt động hoặc bị hỏng, vì chúng nhấn mạnh mã trong một kịch bản gần với thực tế. Họ gọi một hoặc nhiều phương pháp hoặc tính năng phần mềm và kiểm tra nếu chúng hoạt động như mong đợi.

Ngược lại, một bài kiểm tra Đơn vị kiểm tra một phương pháp duy nhất dựa trên giả định (thường sai) rằng phần còn lại của phần mềm đang hoạt động chính xác, bởi vì nó rõ ràng chế giễu mọi phụ thuộc.

Do đó, khi kiểm tra đơn vị cho một phương thức thực hiện một số tính năng có màu xanh lá cây, điều đó không có nghĩa là tính năng này đang hoạt động.

Giả sử bạn có một phương pháp ở đâu đó như thế này:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  Log.TrackTheFactYouDidYourJob();
  return someResults;
}

DoSomethingrất quan trọng đối với khách hàng của bạn: đó là một tính năng, điều duy nhất quan trọng. Đó là lý do tại sao bạn thường viết một đặc tả Cucumber khẳng định nó: bạn muốn xác minhtruyền đạt tính năng này có hoạt động hay không.

Feature: To be able to do something
  In order to do something
  As someone
  I want the system to do this thing

Scenario: A sample one
  Given this situation
  When I do something
  Then what I get is what I was expecting for

Không còn nghi ngờ gì nữa: nếu thử nghiệm vượt qua, bạn có thể khẳng định rằng bạn đang cung cấp một tính năng hoạt động. Đây là những gì bạn có thể gọi Giá trị doanh nghiệp .

Nếu bạn muốn viết một bài kiểm tra đơn vị, DoSomethingbạn nên giả vờ (sử dụng một số giả) rằng phần còn lại của các lớp và phương thức đang hoạt động (nghĩa là: tất cả các phụ thuộc mà phương thức đang sử dụng đều hoạt động chính xác) và khẳng định phương thức của bạn đang hoạt động.

Trong thực tế, bạn làm một cái gì đó như:

public SomeResults DoSomething(someInput) {
  var someResult = [Do your job with someInput];
  FakeAlwaysWorkingLog.TrackTheFactYouDidYourJob(); // Using a mock Log
  return someResults;
}

Bạn có thể thực hiện việc này với Dependency Injection, hoặc một số Phương thức xuất xưởng hoặc bất kỳ Khung Mock nào hoặc chỉ mở rộng lớp đang thử nghiệm.

Giả sử có một lỗi trong Log.DoSomething(). May mắn thay, thông số Gherkin sẽ tìm thấy nó và các bài kiểm tra đầu cuối của bạn sẽ thất bại.

Tính năng này sẽ không hoạt động, vì Logbị hỏng, không phải vì [Do your job with someInput]không hoạt động. Và, nhân tiện, [Do your job with someInput]là trách nhiệm duy nhất cho phương pháp đó.

Ngoài ra, giả sử Logđược sử dụng trong 100 tính năng khác, trong 100 phương thức khác của 100 lớp khác.

Đúng, 100 tính năng sẽ thất bại. Nhưng, may mắn thay, 100 bài kiểm tra đầu cuối cũng thất bại và tiết lộ vấn đề. Và, vâng: họ đang nói sự thật .

Đó là thông tin rất hữu ích: Tôi biết tôi có một sản phẩm bị hỏng. Đó cũng là thông tin rất khó hiểu: nó không cho tôi biết vấn đề là ở đâu. Nó truyền cho tôi các triệu chứng, không phải là nguyên nhân gốc rễ.

Tuy nhiên, DoSomethingbài kiểm tra đơn vị có màu xanh lá cây, bởi vì nó sử dụng giả Log, được chế tạo để không bao giờ bị hỏng. Và, vâng: rõ ràng là nói dối . Đó là truyền thông một tính năng bị hỏng đang hoạt động. Làm thế nào nó có thể hữu ích?

(Nếu DoSomething()kiểm tra đơn vị của thất bại, hãy chắc chắn: [Do your job with someInput]có một số lỗi.)

Giả sử đây là một hệ thống có lớp bị hỏng: Một hệ thống với một lớp bị hỏng

Một lỗi duy nhất sẽ phá vỡ một số tính năng và một số thử nghiệm tích hợp sẽ thất bại.

Một lỗi duy nhất sẽ phá vỡ một số tính năng và một số thử nghiệm tích hợp sẽ thất bại

Mặt khác, cùng một lỗi sẽ phá vỡ chỉ một bài kiểm tra đơn vị.

Lỗi tương tự sẽ phá vỡ chỉ một bài kiểm tra đơn vị

Bây giờ, so sánh hai kịch bản.

Các lỗi tương tự sẽ phá vỡ chỉ một bài kiểm tra đơn vị.

  • Tất cả các tính năng của bạn sử dụng bị hỏng Loglà màu đỏ
  • Tất cả các bài kiểm tra đơn vị của bạn đều có màu xanh lá cây, chỉ có bài kiểm tra đơn vị cho Logmàu đỏ

Trên thực tế, các bài kiểm tra đơn vị cho tất cả các mô-đun sử dụng một tính năng bị hỏng có màu xanh lá cây bởi vì, bằng cách sử dụng giả, chúng đã loại bỏ các phụ thuộc. Nói cách khác, họ chạy trong một thế giới lý tưởng, hoàn toàn hư cấu. Và đây là cách duy nhất để cô lập lỗi và tìm kiếm chúng. Kiểm tra đơn vị có nghĩa là chế nhạo. Nếu bạn không chế giễu, bạn không thử nghiệm đơn vị.

Sự khác biệt

Kiểm tra tích hợp cho biết những gì không hoạt động. Nhưng họ không có ích trong việc đoán xem vấn đề có thể ở đâu.

Đơn vị kiểm tra là kiểm tra duy nhất cho bạn biết nơi chính xác lỗi này là. Để rút ra thông tin này, họ phải chạy phương thức trong một môi trường bị chế giễu, trong đó tất cả các phụ thuộc khác được cho là hoạt động chính xác.

Đó là lý do tại sao tôi nghĩ rằng câu của bạn "Hoặc nó chỉ là một bài kiểm tra đơn vị kéo dài 2 lớp" bằng cách nào đó đã bị dịch chuyển. Một bài kiểm tra đơn vị không bao giờ nên kéo dài 2 lớp.

Câu trả lời này về cơ bản là một bản tóm tắt những gì tôi đã viết ở đây: Bài kiểm tra đơn vị nói dối, đó là lý do tại sao tôi yêu chúng .


6
Một câu trả lời thực sự tốt! Tuy nhiên tôi chỉ muốn thêm rằng chế độ nhạo báng không chỉ dành cho thử nghiệm đơn vị. Nó cũng có thể rất hữu ích trong rất nhiều trường hợp thử nghiệm tích hợp.
n.Stenvang

1
Câu trả lời chính xác! Tôi hoàn toàn không đồng ý với hai điểm: 1) rằng các bài kiểm tra tích hợp là "không có ích trong việc đoán vấn đề có thể xảy ra ở đâu"; và 2) rằng "một bài kiểm tra đơn vị không bao giờ nên kéo dài 2 lớp". Tôi đã tạo ra rất nhiều bài kiểm tra tích hợp và khi chúng phá vỡ, thường không khó để xác định nguồn gốc của vấn đề, miễn là bạn có được một dấu vết ngăn xếp đầy đủ hoặc một xác nhận thất bại (trong trường hợp đó có thể khó tìm nguồn hơn, nhưng không quá nhiều, vì thử nghiệm tích hợp cung cấp một bối cảnh chứa để gỡ lỗi). (tiếp theo)
Rogério

5
Các bài kiểm tra đơn vị có thể thực hiện nhiều lớp, với điều kiện chúng không phải là các lớp công khai nên có các bài kiểm tra đơn vị riêng. Một trường hợp là khi một lớp được thử nghiệm công khai sử dụng các lớp trợ giúp ngoài công lập khác chỉ tồn tại để hỗ trợ lớp công khai; trong trường hợp này, "đơn vị" bao gồm hai hoặc nhiều lớp. Một trường hợp khác là hầu hết các lớp sử dụng các lớp của bên thứ ba (lớp Chuỗi / chuỗi, lớp tập hợp, v.v.) không có nghĩa là bị chế giễu hoặc tách biệt khỏi; chúng tôi chỉ đơn giản coi chúng là các phụ thuộc ổn định và đáng tin cậy nằm ngoài phạm vi thử nghiệm.
Rogério

2
Với các bài kiểm tra tích hợp, việc tìm ra vấn đề gốc khó hơn một chút, nhưng bạn vẫn có thể gỡ lỗi và tìm ra vấn đề gốc. Giả sử các bài kiểm tra đơn vị không thất bại thường xuyên, thì có lẽ hiếm khi bạn sẽ mất thêm một chút thời gian để sửa lỗi nếu bạn chỉ kiểm tra tích hợp, nhưng sau đó bạn cũng nhận được giá trị gia tăng của tích hợp các thành phần kiểm tra và bạn tiết kiệm thời gian viết các bài kiểm tra đơn vị. Tôi nghĩ rằng tuyên bố này (xuất phát từ ông chủ của tôi) là sai, nhưng tôi không chắc làm thế nào tôi có thể thuyết phục anh ta, bất kỳ ý tưởng?
Sinh ra ToCode

1
Bằng lý do trong câu trả lời này, người ta có thể lập luận rằng việc bỏ qua các bài kiểm tra đơn vị sẽ hiệu quả hơn và dành thời gian tiết kiệm bằng cách xác định nguồn gốc của các bài kiểm tra tích hợp khi chúng thất bại.

62

Khi tôi viết các bài kiểm tra đơn vị, tôi giới hạn phạm vi của mã được kiểm tra cho lớp mà tôi hiện đang viết bằng cách phụ thuộc chế giễu. Nếu tôi đang viết một lớp Sentence và Sentence có sự phụ thuộc vào Word, tôi sẽ sử dụng một Word giả. Bằng cách chế nhạo Word, tôi chỉ có thể tập trung vào giao diện của nó và kiểm tra các hành vi khác nhau của lớp Câu của tôi khi nó tương tác với giao diện của Word. Bằng cách này, tôi chỉ kiểm tra hành vi và việc thực hiện Câu và không đồng thời kiểm tra việc triển khai Word.

Khi tôi đã viết các bài kiểm tra đơn vị để đảm bảo Sentence hoạt động chính xác khi nó tương tác với Word dựa trên giao diện của Word, sau đó tôi viết bài kiểm tra tích hợp để đảm bảo rằng các giả định của tôi về các tương tác là chính xác. Để làm điều này, tôi cung cấp các đối tượng thực tế và viết một bài kiểm tra thực hiện một tính năng sẽ kết thúc bằng cả Sentence và Word.


43

10 bit của tôi: D

Tôi luôn được thông báo rằng Bài kiểm tra đơn vị là bài kiểm tra của một thành phần riêng lẻ - cần được thực hiện đến mức tối đa. Bây giờ, điều này có xu hướng có nhiều cấp độ, vì hầu hết các thành phần được làm từ các bộ phận nhỏ hơn. Đối với tôi, một đơn vị là một phần chức năng của hệ thống. Vì vậy, nó phải cung cấp một cái gì đó có giá trị (nghĩa là không phải là một phương pháp để phân tích chuỗi, nhưng có lẽ là một HtmlSanitizer ).

Kiểm thử Tích hợp là bước tiếp theo, nó lấy một hoặc nhiều thành phần và đảm bảo chúng hoạt động cùng nhau như bình thường .. Bạn đang lo lắng về cách các thành phần hoạt động riêng lẻ, nhưng khi bạn nhập html vào HtmlEditControl , thì nó bằng cách nào đó kỳ diệu biết thời tiết của nó có hợp lệ hay không ..

Đây là một dòng có thể di chuyển thực sự .. Tôi muốn tập trung hơn vào việc làm cho mã chết tiệt hoạt động hoàn toàn ^ _ ^


23

Kiểm tra đơn vị sử dụng giả

Điều bạn đang nói đến là các bài kiểm tra tích hợp thực sự kiểm tra toàn bộ tích hợp hệ thống của bạn. Nhưng khi bạn thực hiện kiểm tra đơn vị, bạn thực sự nên kiểm tra riêng từng đơn vị. Mọi thứ khác nên bị chế giễu. Vì vậy, trong trường hợp của bạn về Sentencelớp, nếu nó sử dụng Wordlớp, thì Wordlớp của bạn sẽ bị chế giễu. Bằng cách này, bạn sẽ chỉ kiểm tra Sentencechức năng lớp học của bạn .


Tôi biết đây là một bài viết cũ nhưng tôi chỉ đi qua nó. Điều gì sẽ xảy ra nếu bạn có một lớp thứ ba được gọi là Font mà lớp Sentence tương tác và bạn muốn kiểm tra chức năng giữa lớp Word và Sentence, thì bạn phải giả định lớp Font nhưng điều này sẽ không biến nó thành một bài kiểm tra đơn vị. Vì vậy, điều tôi đang nói là việc sử dụng các giả không nhất thiết phải biến nó thành một bài kiểm tra đơn vị, các giả cũng có thể được sử dụng trong các bài kiểm tra tích hợp.
n.Stenvang

2
Tất nhiên mocks có thể được sử dụng trong các thử nghiệm hội nhập, nhưng trật tự cho một thử nghiệm đơn vị để thực sự được như tất cả mọi thứ như vậy từ bên ngoài đến đơn vị nên được mô phỏng . Nếu kiểm tra tích hợp sử dụng giả, thì có khả năng chúng là kiểm tra tích hợp một phần (nếu thuật ngữ đó tồn tại). Tất nhiên đây là các bài kiểm tra tích hợp một phần là các bài kiểm tra từ trên xuống hoặc từ dưới lên. Latter thường không yêu cầu giả trong khi trước đây làm.
Robert Koritnik

17

Tôi nghĩ khi bạn bắt đầu nghĩ về các bài kiểm tra tích hợp, bạn đang nói nhiều hơn về sự giao thoa giữa các lớp vật lý hơn là các lớp logic.

Ví dụ: nếu các kiểm tra của bạn liên quan đến việc tạo nội dung, thì đó là kiểm tra đơn vị: nếu kiểm tra của bạn liên quan đến việc chỉ ghi vào đĩa, thì đó vẫn là kiểm tra đơn vị, nhưng một khi bạn kiểm tra cả I / O VÀ nội dung của tệp, sau đó bạn có cho mình một bài kiểm tra tích hợp. Khi bạn kiểm tra đầu ra của một chức năng trong một dịch vụ, đó là kiểm tra đơn vị, nhưng một khi bạn thực hiện cuộc gọi dịch vụ và xem kết quả chức năng có giống nhau không, thì đó là kiểm tra tích hợp.

Về mặt kỹ thuật, bạn không thể kiểm tra đơn vị chỉ một lớp. Điều gì nếu lớp của bạn được sáng tác với một số lớp khác? Điều đó tự động làm cho nó một bài kiểm tra tích hợp? Tôi không nghĩ vậy.


8
"Về mặt kỹ thuật, bạn không thể kiểm tra đơn vị chỉ một lớp. Nếu lớp của bạn được sáng tác với một số lớp khác thì sao?" Chà, một bài kiểm tra đơn vị "nghiêm ngặt" sẽ chỉ chế giễu / sơ khai tất cả các phụ thuộc. Tuy nhiên, điều gây tranh cãi là liệu điều này có luôn thực tế không ...
sleske

2
Đó là sieske thực sự - điều quan trọng là có thể giữ cho sự phụ thuộc ở mức tối thiểu.
Jon Limjap

-1, một bài kiểm tra đơn vị không kiểm tra một tính năng đơn lẻ, mà là một chức năng hoặc lớp phần mềm duy nhất, tức là nó kiểm tra một đơn vị phần mềm logic.
CharlesB

12

sử dụng thiết kế trách nhiệm duy nhất, màu đen và trắng của nó. Hơn 1 trách nhiệm, đó là một bài kiểm tra tích hợp.

Bằng cách kiểm tra vịt (ngoại hình, quạ, lạch bạch, vịt của nó), nó chỉ là một thử nghiệm đơn vị với hơn 1 đối tượng mới trong đó.

Khi bạn vào mvc và kiểm tra nó, các kiểm tra bộ điều khiển luôn được tích hợp, bởi vì bộ điều khiển chứa cả đơn vị mô hình và đơn vị xem. Kiểm tra logic trong mô hình đó, tôi sẽ gọi một bài kiểm tra đơn vị.


10

Bản chất của các bài kiểm tra của bạn

Một thử nghiệm đơn vị của mô-đun X là một thử nghiệm chỉ mong đợi (và kiểm tra) các vấn đề chỉ trong mô-đun X.

Một thử nghiệm tích hợp của nhiều mô-đun là một thử nghiệm mong đợi các vấn đề phát sinh từ sự hợp tác giữa các mô-đun để những vấn đề này khó tìm thấy khi chỉ sử dụng các thử nghiệm đơn vị.

Hãy nghĩ về bản chất của các bài kiểm tra của bạn trong các điều khoản sau đây:

  • Giảm thiểu rủi ro : Đó là những gì xét nghiệm dành cho. Chỉ có sự kết hợp giữa kiểm tra đơn vị và kiểm tra tích hợp mới có thể giúp bạn giảm thiểu rủi ro, bởi vì một mặt kiểm tra đơn vị không thể kiểm tra sự tương tác thích hợp giữa các mô-đun và mặt khác, các thử nghiệm tích hợp chỉ có thể thực hiện chức năng của mô-đun không tầm thường ở một mức độ nhỏ
  • Kiểm tra nỗ lực viết : Kiểm tra tích hợp có thể tiết kiệm nỗ lực vì sau đó bạn có thể không cần phải viết sơ khai / giả / giả. Nhưng các bài kiểm tra đơn vị cũng có thể tiết kiệm công sức, khi thực hiện (và duy trì!) Những cuống / giả / giả này xảy ra dễ dàng hơn so với việc định cấu hình thiết lập thử nghiệm mà không có chúng.
  • Kiểm tra độ trễ thực thi : Các kiểm tra tích hợp liên quan đến các hoạt động nặng (như truy cập vào các hệ thống bên ngoài như DB hoặc máy chủ từ xa) có xu hướng chậm (er). Điều này có nghĩa là các bài kiểm tra đơn vị có thể được thực hiện thường xuyên hơn, điều này làm giảm nỗ lực gỡ lỗi nếu có bất cứ điều gì thất bại, bởi vì bạn có ý tưởng tốt hơn về những gì bạn đã thay đổi trong thời gian này. Điều này trở nên đặc biệt quan trọng nếu bạn sử dụng phát triển dựa trên thử nghiệm (TDD).
  • Nỗ lực gỡ lỗi : Nếu thử nghiệm tích hợp không thành công, nhưng không có thử nghiệm đơn vị nào thực hiện, điều này có thể rất bất tiện, vì có quá nhiều mã liên quan có thể chứa vấn đề. Đây không phải là một vấn đề lớn nếu trước đây bạn chỉ thay đổi một vài dòng - nhưng khi các bài kiểm tra tích hợp chạy chậm, có lẽ bạn đã không chạy chúng trong những khoảng thời gian ngắn như vậy ...

Hãy nhớ rằng một bài kiểm tra tích hợp có thể vẫn còn sơ khai / giả / giả một số phụ thuộc của nó. Điều này cung cấp nhiều cơ sở giữa thử nghiệm đơn vị và thử nghiệm hệ thống (thử nghiệm tích hợp toàn diện nhất, thử nghiệm tất cả hệ thống).

Cách tiếp cận thực dụng để sử dụng cả hai

Vì vậy, một cách tiếp cận thực tế sẽ là: Linh hoạt dựa vào các bài kiểm tra tích hợp nhiều nhất có thể và sử dụng các bài kiểm tra đơn vị trong trường hợp điều này quá rủi ro hoặc bất tiện. Cách suy nghĩ này có thể hữu ích hơn một số phân biệt đối xử giáo điều của các bài kiểm tra đơn vị và kiểm tra tích hợp.


10

Trong bài kiểm tra đơn vị, bạn kiểm tra từng phần bị cô lập: nhập mô tả hình ảnh ở đây

trong kiểm tra tích hợp, bạn kiểm tra nhiều mô-đun của hệ thống:

nhập mô tả hình ảnh ở đây

và điều này xảy ra khi bạn chỉ sử dụng các bài kiểm tra đơn vị (nói chung cả hai cửa sổ đều hoạt động, rất tiếc là không cùng nhau):

nhập mô tả hình ảnh ở đây

Nguồn: source1 source2


Bạn có ba hình ảnh nhưng chỉ có hai nguồn.
gerrit

1
@gerrit hãy xem nguồn đầu tiên - hai hình ảnh từ đó
Michu93

1
Thích câu trả lời này
Dzenis H.

8

Theo tôi câu trả lời là "Tại sao nó lại quan trọng?"

Có phải vì kiểm tra đơn vị là thứ bạn làm và kiểm tra tích hợp là thứ bạn không làm? Hoặc ngược lại? Tất nhiên là không, bạn nên cố gắng làm cả hai.

Có phải vì các bài kiểm tra đơn vị cần phải nhanh, cách ly, lặp lại, tự kiểm chứng và kiểm tra tích hợp kịp thời không? Tất nhiên là không, tất cả các bài kiểm tra nên là những thứ này.

Có phải vì bạn sử dụng giả trong các bài kiểm tra đơn vị nhưng bạn không sử dụng chúng trong các bài kiểm tra tích hợp? Dĩ nhiên là không. Điều này có nghĩa là nếu tôi có một bài kiểm tra tích hợp hữu ích, tôi không được phép thêm một bản giả cho một phần nào đó, sợ rằng tôi sẽ phải đổi tên bài kiểm tra của mình thành "bài kiểm tra đơn vị" hoặc giao nó cho một lập trình viên khác để làm việc.

Có phải vì kiểm tra đơn vị kiểm tra một đơn vị và kiểm tra tích hợp kiểm tra một số đơn vị? Dĩ nhiên là không. Điều quan trọng thực tế là gì? Các cuộc thảo luận lý thuyết về phạm vi của các bài kiểm tra bị phá vỡ trong thực tế vì thuật ngữ "đơn vị" hoàn toàn phụ thuộc vào ngữ cảnh. Ở cấp độ lớp, một đơn vị có thể là một phương thức. Ở cấp độ lắp ráp, một đơn vị có thể là một lớp và ở cấp độ dịch vụ, một đơn vị có thể là một thành phần. Và thậm chí các lớp sử dụng các lớp khác, vậy đó là đơn vị nào?

Nó không quan trọng.

Kiểm tra là quan trọng, FIRST là quan trọng, chia tóc về định nghĩa là một sự lãng phí thời gian mà chỉ gây nhầm lẫn cho người mới đến thử nghiệm.


5
-1 Định nghĩa là những gì làm cho mọi người có thể sử dụng các thuật ngữ tương tự mà không phải luôn giải thích ý nghĩa của chúng và là điều cần thiết để hợp tác. Vì vậy, điều cần thiết là phải hiểu sự khác biệt giữa cả hai khái niệm.
CharlesB

Như @CharlesB đã đề cập, nó rất quan trọng vì vậy không cần phải giải thích mỗi lần hoặc tìm mọi người có một định nghĩa khác nhau gây ra nhầm lẫn. Các thử nghiệm sẽ được viết khác nhau và chạy khác nhau, nhưng điều này không cho thấy cả hai không nên được thực hiện bằng cách muốn xác định sự khác biệt.
Shane

Kết luận của câu trả lời có thể là cực đoan, nhưng hầu hết các điểm của nó là khá hợp lệ: Đơn vị kiểm tra và thử nghiệm hội nhập chủ yếu được điều tương tự , ngoại trừ chi tiết của họ - và nó không phải là rõ ràng nơi một dòng nên được rút ra giữa chúng.
Lutz Prechelt

Điều này không giúp ích gì khi tạo một ngôn ngữ chung trong môi trường chuyên nghiệp. Mặc dù hầu hết, bạn nói đúng, điều đó không quan trọng lắm, không có ngôn ngữ chung sẽ tạo ra sự hiểu lầm và nhầm lẫn giữa các đội. Tôi nghĩ rằng lựa chọn tốt nhất là để nhóm đồng ý về các điều khoản và định nghĩa của họ.
dùng924272

4

Tôi nghĩ rằng tôi vẫn sẽ gọi một vài lớp tương tác là một bài kiểm tra đơn vị với điều kiện là các bài kiểm tra đơn vị cho class1 đang kiểm tra các tính năng của class1 và các bài kiểm tra đơn vị cho class2 đang kiểm tra các tính năng của nó và chúng cũng không đánh vào cơ sở dữ liệu.

Tôi gọi một bài kiểm tra là một bài kiểm tra tích hợp khi nó chạy qua hầu hết ngăn xếp của tôi và thậm chí đánh vào cơ sở dữ liệu.

Tôi thực sự thích câu hỏi này, bởi vì đôi khi thảo luận về TDD cảm thấy hơi quá thuần túy đối với tôi và thật tốt khi tôi thấy một số ví dụ cụ thể.


4

Tôi cũng làm như vậy - tôi gọi chúng là tất cả các bài kiểm tra đơn vị, nhưng tại một số thời điểm tôi có một "bài kiểm tra đơn vị" bao gồm rất nhiều, tôi thường đổi tên nó thành "..IntegrationTest" - chỉ thay đổi tên, không có gì thay đổi.

Tôi nghĩ rằng có sự tiếp nối từ "kiểm tra nguyên tử" (kiểm tra một lớp nhỏ hoặc phương pháp) đến kiểm tra đơn vị (cấp độ lớp) và kiểm tra tích hợp - và sau đó kiểm tra chức năng (thường bao gồm nhiều thứ hơn từ trên xuống) - dường như không có một vết cắt sạch.

Nếu thử nghiệm của bạn thiết lập dữ liệu và có thể tải cơ sở dữ liệu / tệp, v.v. thì có lẽ đó là thử nghiệm tích hợp (thử nghiệm tích hợp tôi thấy sử dụng ít giả hơn và nhiều lớp thực hơn, nhưng điều đó không có nghĩa là bạn không thể giả mạo một số của hệ thống).


4

Kiểm thử đơn vị là một phương pháp kiểm tra để xác minh các đơn vị mã nguồn riêng lẻ đang hoạt động đúng.

Kiểm thử tích hợp là giai đoạn kiểm thử phần mềm trong đó các mô-đun phần mềm riêng lẻ được kết hợp và kiểm tra thành một nhóm.

Wikipedia định nghĩa một đơn vị là phần có thể kiểm tra nhỏ nhất của một ứng dụng, trong Java / C # là một phương thức. Nhưng trong ví dụ của bạn về lớp Word và Sentence, có lẽ tôi sẽ chỉ viết các bài kiểm tra cho câu vì tôi có thể thấy nó quá mức cần thiết để sử dụng một lớp từ giả để kiểm tra lớp câu. Vì vậy, câu sẽ là đơn vị của tôi và từ là một chi tiết thực hiện của đơn vị đó.


4

Kiểm tra tích hợp: Sự kiên trì của cơ sở dữ liệu được kiểm tra.
Kiểm tra đơn vị: Truy cập cơ sở dữ liệu bị chế giễu. Phương pháp mã được thử nghiệm.


3

Kiểm thử đơn vị là kiểm tra đối với một đơn vị công việc hoặc một khối mã nếu bạn muốn. Thường được thực hiện bởi một nhà phát triển duy nhất.

Kiểm thử tích hợp đề cập đến kiểm tra được thực hiện, tốt nhất là trên máy chủ tích hợp, khi nhà phát triển cam kết mã của họ vào kho lưu trữ kiểm soát nguồn. Kiểm tra tích hợp có thể được thực hiện bởi các tiện ích như Cruise Control.

Vì vậy, bạn thực hiện kiểm tra đơn vị của mình để xác thực rằng đơn vị công việc bạn đã xây dựng đang hoạt động và sau đó kiểm tra tích hợp xác thực rằng bất cứ điều gì bạn đã thêm vào kho lưu trữ sẽ không phá vỡ thứ gì khác.


2

Tôi gọi đơn vị kiểm tra những bài kiểm tra mà hộp trắng kiểm tra một lớp. Bất kỳ phụ thuộc nào mà lớp yêu cầu được thay thế bằng giả (giả).

Kiểm thử tích hợp là những kiểm tra trong đó nhiều lớp và tương tác của chúng được kiểm tra cùng một lúc. Chỉ một số phụ thuộc trong những trường hợp này là giả mạo / chế giễu.

Tôi sẽ không gọi các kiểm tra tích hợp của Bộ điều khiển trừ khi một trong các phụ thuộc của chúng là thực tế (nghĩa là không bị làm giả) (ví dụ: IFormsAuthentication).

Việc tách hai loại thử nghiệm rất hữu ích để thử nghiệm hệ thống ở các cấp độ khác nhau. Ngoài ra, các bài kiểm tra tích hợp có xu hướng tồn tại lâu, và các bài kiểm tra đơn vị được cho là nhanh chóng. Sự phân biệt tốc độ thực thi có nghĩa là chúng được thực hiện khác nhau. Trong các quy trình phát triển của chúng tôi, các bài kiểm tra đơn vị được chạy khi nhận phòng (điều này rất tốt vì chúng siêu nhanh) và các bài kiểm tra tích hợp được chạy một lần / hai lần mỗi ngày. Tôi thử và chạy các kiểm tra tích hợp thường xuyên nhất có thể, nhưng thường nhấn cơ sở dữ liệu / ghi vào tệp / làm cho rpc's / etc chậm lại.

Điều đó làm tăng một điểm quan trọng khác, các bài kiểm tra đơn vị nên tránh nhấn IO (ví dụ: đĩa, mạng, db). Nếu không họ làm chậm rất nhiều. Phải mất một chút nỗ lực để thiết kế các phụ thuộc IO này - tôi không thể thừa nhận rằng tôi đã trung thành với quy tắc "kiểm tra đơn vị phải nhanh", nhưng nếu bạn, các lợi ích trên một hệ thống lớn hơn rất nhanh chóng trở nên rõ ràng .


2

Giải thích đơn giản với các tương tự

Các ví dụ trên làm rất tốt và tôi không cần lặp lại chúng. Vì vậy, tôi sẽ tập trung vào việc sử dụng các ví dụ để giúp bạn hiểu.

Kiểm tra tích hợp

Kiểm tra tích hợp kiểm tra nếu mọi thứ đang làm việc cùng nhau. Hãy tưởng tượng một loạt các bánh răng làm việc cùng nhau trong một chiếc đồng hồ. Một bài kiểm tra tích hợp sẽ là: chiếc đồng hồ có cho biết thời gian chính xác không? Có phải nó vẫn nói đúng thời gian trong 3 ngày?

Tất cả những gì nó nói với bạn là liệu phần tổng thể đang hoạt động. Nếu thất bại: nó không cho bạn biết chính xác nơi nó đang thất bại.

Bài kiểm tra đơn vị

Đây là những loại thử nghiệm thực sự cụ thể. Họ cho bạn biết liệu một điều cụ thể đang làm việc hay thất bại. Chìa khóa của loại thử nghiệm này là nó chỉ kiểm tra một điều cụ thể trong khi giả định rằng mọi thứ khác đều hoạt động tốt. Đó là điểm mấu chốt.

Ví dụ: Chúng ta hãy giải thích về điểm này bằng một ví dụ:

  • Hãy lấy một chiếc xe làm ví dụ.
  • Hội nhậpKiểm tra cho một chiếc xe: ví dụ như chiếc xe lái đến Woop Woop và trở lại? Nếu nó làm điều này, bạn có thể nói rằng một chiếc xe đang làm việc từ một quan điểm tổng thể một cách an toàn. Đây là một bài kiểm tra tích hợp. Nếu nó thất bại, bạn không biết nó thực sự thất bại ở đâu: đó là bộ tản nhiệt, truyền động, động cơ hay bộ chế hòa khí? Bạn không có ý tưởng. Nó có thể là bất cứ điều gì.
  • Kiểm tra đơn vị cho một chiếc xe: Động cơ có hoạt động không? Thử nghiệm này giả định rằng mọi thứ khác trong xe đều hoạt động tốt. Bằng cách đó, nếu thử nghiệm đơn vị cụ thể này thất bại: bạn có thể rất tự tin rằng vấn đề nằm ở động cơ - vì vậy bạn có thể nhanh chóng cách ly và khắc phục sự cố.

Sử dụng sơ khai

  • Giả sử thử nghiệm tích hợp xe của bạn không thành công. Nó không lái thành công đến Echuca. Vấn đề ở đâu?

  • Bây giờ hãy giả sử rằng động cơ của bạn sử dụng hệ thống phun nhiên liệu đặc biệt và thử nghiệm đơn vị động cơ này cũng đã thất bại. Nói cách khác, cả thử nghiệm tích hợp và thử nghiệm đơn vị động cơ đều thất bại. Vấn đề là ở đâu? (Cho mình 10 giây để có câu trả lời.)

  • Là vấn đề với động cơ, hoặc với hệ thống phun nhiên liệu?

Bạn thấy vấn đề ở đây? Bạn không biết chính xác những gì đang thất bại. Nếu bạn sử dụng các phụ thuộc bên ngoài khác nhau, thì mỗi một trong số 10 điều đó có thể đã gây ra sự cố - và bạn sẽ không biết bắt đầu từ đâu. Đó là lý do tại sao các bài kiểm tra đơn vị sử dụng sơ khai để cho rằng mọi thứ khác đều hoạt động tốt.


1

Một chút hàn lâm câu hỏi này, phải không? ;-) Quan điểm của tôi: Đối với tôi, một bài kiểm tra tích hợp là bài kiểm tra toàn bộ phần, không phải nếu hai phần trong số mười phần đi cùng nhau. Thử nghiệm tích hợp của chúng tôi cho thấy, nếu bản dựng chính (chứa 40 dự án) sẽ thành công. Đối với các dự án, chúng tôi có hàng tấn thử nghiệm đơn vị. Điều quan trọng nhất liên quan đến các bài kiểm tra đơn vị đối với tôi là, một bài kiểm tra đơn vị không được phụ thuộc vào bài kiểm tra đơn vị khác. Vì vậy, đối với tôi cả hai bài kiểm tra mà bạn mô tả ở trên là bài kiểm tra đơn vị, nếu chúng độc lập. Đối với các bài kiểm tra tích hợp, điều này không cần phải quan trọng.


1

Các bài kiểm tra này về cơ bản có trở thành các bài kiểm tra tích hợp bởi vì bây giờ chúng kiểm tra sự tích hợp của 2 lớp này? Hay nó chỉ là một bài kiểm tra đơn vị kéo dài 2 lớp?

Tôi nghĩ Có và Có. Bài kiểm tra đơn vị của bạn kéo dài 2 lớp đã trở thành một bài kiểm tra tích hợp.

Bạn có thể tránh nó bằng cách kiểm tra lớp Sentence với triển khai giả - lớp MockWord, điều này rất quan trọng khi các phần đó của hệ thống đủ lớn để được các nhà phát triển khác nhau triển khai. Trong trường hợp đó, Word được kiểm tra đơn vị, Sentence là đơn vị được kiểm tra với sự trợ giúp của MockWord và sau đó Sentence được kiểm tra tích hợp với Word.

Exaple của sự khác biệt thực sự có thể được theo sau 1) Mảng gồm 1.000.000 phần tử dễ dàng được kiểm tra đơn vị và hoạt động tốt. 2) BubbleSort dễ dàng được kiểm tra đơn vị trên mảng giả gồm 10 yếu tố và cũng hoạt động tốt 3) Kiểm tra tích hợp cho thấy có gì đó không ổn.

Nếu những phần này được phát triển bởi một người, rất có thể vấn đề sẽ được tìm thấy trong khi đơn vị kiểm tra BubbleSoft chỉ vì nhà phát triển đã có mảng thực và anh ta không cần thực hiện giả.


1

Ngoài ra, điều quan trọng cần nhớ là cả kiểm tra đơn vị và kiểm tra tích hợp đều có thể được tự động hóa và viết bằng cách sử dụng, ví dụ, JUnit. Trong các thử nghiệm tích hợp JUnit, người ta có thể sử dụng org.junit.Assumelớp để kiểm tra tính khả dụng của các yếu tố môi trường (ví dụ: kết nối cơ sở dữ liệu) hoặc các điều kiện khác.


0

Nếu bạn là người theo chủ nghĩa thuần túy TDD, bạn viết các bài kiểm tra trước khi viết mã sản xuất. Tất nhiên, các bài kiểm tra sẽ không được biên dịch, vì vậy trước tiên bạn thực hiện các bài kiểm tra biên dịch, sau đó thực hiện các bài kiểm tra.

Bạn có thể làm điều này với các bài kiểm tra đơn vị, nhưng bạn không thể với các bài kiểm tra tích hợp hoặc chấp nhận. Nếu bạn đã thử với một bài kiểm tra tích hợp, sẽ không có gì được biên dịch cho đến khi bạn hoàn thành!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.