Sự khác biệt giữa thử nghiệm đơn vị và phát triển hướng thử nghiệm


64

Từ việc đọc các mô tả, tôi hiểu rằng trong các bài kiểm tra TDD được thực hiện trước khi viết chức năng và trong Kiểm tra đơn vị, nó được thực hiện sau đó.

Đây có phải là sự khác biệt chính, hoặc hai thuật ngữ thậm chí không thể được so sánh như vậy. Có lẽ, Kiểm thử đơn vị là một phần tích hợp của TDD.

Câu trả lời:


104

Đơn vị kiểm tra đề cập đến những gì bạn đang thử nghiệm, TDD để khi bạn đang thử nghiệm.

Hai là trực giao.

Kiểm thử đơn vị có nghĩa là, tốt, kiểm tra các đơn vị hành vi cá nhân. Một đơn vị hành vi riêng lẻ là đơn vị hành vi nhỏ nhất có thể được kiểm tra riêng lẻ. (Tôi biết rằng hai định nghĩa đó là hình tròn, nhưng chúng có vẻ hoạt động khá tốt trong thực tế.)

Bạn có thể viết bài kiểm tra đơn vị trước khi bạn viết mã, sau khi bạn viết mã hoặc trong khi bạn viết mã.

TDD có nghĩa là (một lần nữa, loại rõ ràng) cho phép các bài kiểm tra của bạn thúc đẩy sự phát triển của bạn (và thiết kế của bạn). Bạn có thể làm điều đó với các bài kiểm tra đơn vị, kiểm tra chức năng và kiểm tra chấp nhận. Thông thường, bạn sử dụng cả ba.

Phần quan trọng nhất của TDD là giữa D . Bạn để cho các bài kiểm tra lái bạn. Các bài kiểm tra cho bạn biết phải làm gì, làm gì tiếp theo, khi bạn hoàn thành. Họ cho bạn biết API sẽ là gì, thiết kế là gì. .


1
Câu trả lời chính xác. sẽ thêm ... TDD là khi bạn để các bài kiểm tra thúc đẩy bạn và các tính năng để kéo các nỗ lực phát triển của bạn ...
Martin

Chúng không trực giao mặc dù. Bạn không thể có TDD mà không có bài kiểm tra đơn vị.
JacquesB

1
@JacquesB, tại sao? Các thử nghiệm của chúng tôi không phải là những gì bạn gọi là kiểm tra đơn vị theo bất kỳ định nghĩa nào, chúng phụ thuộc quá nhiều vào cơ sở hạ tầng và các thành phần khác, nhưng chúng tôi vẫn có đủ khả năng quan sát rằng chúng tôi - ít nhất là một số người trong chúng tôi - đang thực hiện TDD.
AProgrammer

3
@AndrewWillems: TDD có nghĩa là các bài kiểm tra thúc đẩy sự phát triển . Bạn không quyết định thiết kế trông như thế nào, các bài kiểm tra cho bạn biết. Bạn không quyết định làm gì tiếp theo, các bài kiểm tra cho bạn biết. Bạn không quyết định khi bạn hoàn thành, các bài kiểm tra cho bạn biết. Hoàn toàn có thể viết bài kiểm tra trước, và sau đó bỏ qua mọi thứ họ đang nói với bạn. Ví dụ: bạn có thể viết bài kiểm tra trước, nhưng sau đó tiếp tục viết mã ngay cả sau khi tất cả các bài kiểm tra có màu xanh. Vì vậy, nói cách khác: bạn viết bài kiểm tra trước, nhưng bạn coi chúng chỉ là bài kiểm tra và không để chúng thúc đẩy sự phát triển.
Jörg W Mittag

1
@ JörgWMittag Bạn có thể đúng theo cách nhìn thuần túy, nhưng bạn cũng biết rằng TDD không phải là màu đen và trắng. Bất kỳ việc sử dụng TDD lành mạnh nào cũng sẽ không để các thử nghiệm thúc đẩy sự phát triển hoàn toàn và các thử nghiệm chắc chắn không phải lúc nào cũng quyết định thiết kế trông như thế nào (có thể các thử nghiệm đơn vị có thể thực hiện một phần điều này, nhưng không thử nghiệm ở mức độ trừu tượng cao hơn). Còn tái cấu trúc thì sao? Đó là một khía cạnh rất quan trọng của TDD. Ngoài ra trong thế giới thực, không có thứ gọi là 'bỏ qua mọi thứ mà bài kiểm tra đang nói với bạn'. Theo định nghĩa, nếu bạn viết bài kiểm tra trước, bạn sử dụng 'một số dạng TDD'.
NickL

21

Kiểm thử đơn vị là một thành phần của Phát triển hướng thử nghiệm

Bạn có thể thực hiện kiểm tra đơn vị mà không cần thực hiện phát triển theo hướng kiểm tra. Tuy nhiên, bạn không thể thực hiện phát triển theo hướng kiểm tra mà không sử dụng kiểm tra đơn vị.

Khi bạn thực hiện kiểm tra đơn vị truyền thống , bạn viết kiểm tra sau khi bạn viết mã.

Phương pháp tiếp cận phát triển theo hướng thử nghiệm là viết thử nghiệm đơn vị trước khi viết mã.

Ưu điểm thú vị nhất của TDD (IMHO) so với Kiểm tra đơn vị đơn giản:

  • Mã được kiểm tra đầy đủ mã trả trước. Đó là thử nghiệm không đau.
  • Nó buộc bạn phải thiết kế các lớp học của bạn một cách chính xác.
  • Nó cũng buộc bạn phải giữ nó đơn giản ngu ngốc .
  • Chu kỳ của Red-Green-Refactor là kẻ giết người chần chừ tuyệt đối!

Bạn đã bỏ lỡ "đơn vị" về mục đích trong quy định: "Tuy nhiên, bạn không thể thực hiện phát triển theo hướng kiểm tra mà không sử dụng thử nghiệm." ?
ratkok

@ratkok: không, đó không phải là mục đích. Hãy để tôi sửa nó.

Tôi thích định nghĩa này là tốt nhất. Nó tốt hơn nên đặt cùng nhau trong các từ hơn các câu trả lời khác.
Tek

2
Có thể cho rằng, bạn có thể thực hiện TDD bằng cách sử dụng kiểm tra mô-đun hoặc kiểm tra hệ thống thay vì kiểm tra đơn vị thực sự. Tôi sẽ không khuyên điều đó, vì bạn sẽ mất rất nhiều lợi ích nếu các bài kiểm tra mất quá nhiều thời gian để chạy, nhưng điều đó không phải là không thể.
Toby Speight

13

TDD và Kiểm thử đơn vị là hai thuật ngữ rất cụ thể thường bị sử dụng sai.

TDD đang viết một bài kiểm tra sẽ thất bại, sau đó viết số lượng mã tối thiểu cần thiết để làm cho nó chạy, sau đó cấu trúc lại mã để làm cho nó sạch. Điều này được thực hiện theo chu kỳ, thất bại -> vượt qua -> tái cấu trúc, thêm một thử nghiệm mới cho mỗi yêu cầu đã biết đối với mã. Gần đây, TDD thậm chí còn trở nên cụ thể hơn về việc viết các bài kiểm tra đơn vị trong chu trình đó, để phân biệt với ATDD (một tập hợp con của BDD) đang viết các bài kiểm tra chấp nhận trong một chu kỳ tương tự.

Kiểm thử đơn vị là về kiểm tra mã trong các đơn vị nhỏ, bị cô lập. Sự nhầm lẫn phổ biến ở đây là nghĩ rằng nếu bạn đang sử dụng một công cụ kiểm tra đơn vị, chẳng hạn như xUnit hoặc Rspec, để chạy các bài kiểm tra mà bạn đang viết bài kiểm tra đơn vị. Điều này không thực sự đúng. Những công cụ đó có thể được sử dụng để chạy các bài kiểm tra nói bằng cách sử dụng khung Selenium - trong trường hợp đó bạn đang viết bài kiểm tra chấp nhận bằng cách sử dụng trình chạy thử đơn vị. Các bài kiểm tra đơn vị là các bài kiểm tra rất cụ thể tập trung vào một đoạn logic nhỏ, tách biệt với mọi thứ khác vì mục đích tốc độ (để bạn có thể chạy chúng thường xuyên và nhận phản hồi nhanh về các lỗi mới).


1
Các bài kiểm tra JUnit cho chính JUnit là một ví dụ điển hình: một phần đáng kể trong số đó là các bài kiểm tra chức năng và kiểm tra chấp nhận, không phải kiểm tra đơn vị, mặc dù chúng được viết bằng JUnit. Ngoài ra, người tạo ra JUnit cũng là người tạo ra TDD và JUnit được phát triển bằng TDD bằng cách sử dụng một số lượng đáng kể các bài kiểm tra chức năng và kiểm tra chấp nhận. Kiểm tra chấp nhận là một phần không thể thiếu của TDD.
Jörg W Mittag

6

TDD là cách tiếp cận viết các trường hợp thử nghiệm trước khi phát triển như bạn đã nói và sau đó nhà phát triển viết mã để vượt qua các trường hợp thử nghiệm. Kiểm thử đơn vị là một thuật ngữ được sử dụng để mô tả một loại thử nghiệm phạm vi hẹp khác với thử nghiệm hệ thống, thử nghiệm tích hợp và thử nghiệm chấp nhận.


3

TDD là một cách tiếp cận triết học để viết mã: viết các bài kiểm tra trước. Các bài kiểm tra bạn viết là bài kiểm tra đơn vị.


1

Cách tôi tách hai người là xem xét rằng TDD ít về thử nghiệm và nhiều hơn về thiết kế mã. Các thử nghiệm đơn vị sau đó được sử dụng để đặt kỳ vọng cho mã kết thúc. Khi mã kết thúc được viết và vượt qua các bài kiểm tra (thông số kỹ thuật), bạn có mã được thiết kế bằng các bài kiểm tra.


1

Tất cả các câu trả lời tuyệt vời. Tôi sẽ chỉ thêm rằng thử nghiệm đơn vị có xu hướng coi "đơn vị" là một thành phần nhỏ, trong khi TDD mở rộng để bao gồm các thử nghiệm tích hợp và chấp nhận.

(Một số biến thể TDD coi 'đơn vị' là bước tăng nhỏ nhất đối với chức năng mong muốn ...)


họ nên, nhưng theo kinh nghiệm của tôi trong thực tế thì không. Các công ty / nhóm nói rằng họ làm TDD, khi tất cả những gì họ làm là buộc các lập trình viên phải kiểm tra trước tiên bằng các bài kiểm tra jUnit, sau đó sử dụng thực tế là mọi thứ đã được kiểm tra trong quá trình phát triển để loại bỏ (hoặc giảm đáng kể) QA và kiểm tra tích hợp.
jwenting

1
@jwenting đừng đổ lỗi cho phương pháp luận về những thiếu sót của những người tuyên bố thực hành nó. bất kỳ công cụ nào cũng có thể bị sử dụng sai
Steven A. Lowe

1
Tôi không, nhưng bạn phải nhận ra rằng có một sự khác biệt lớn giữa lý thuyết TDD là gì và thực tế nó là gì. Và vì hầu hết mọi người (bao gồm OP) có lẽ chỉ nhìn thấy thực tế, sự khác biệt nên được chỉ ra cho họ.
jwenting

Xem xét rằng TDD là về thiết kế - tại sao nó sẽ bao gồm thử nghiệm chấp nhận? Làm thế nào nó sẽ "lái" thiết kế?
Vitalii Isaenko

Các thử nghiệm chấp nhận @VitaliiIsaenko cung cấp phạm vi mức cao nhất cho các thiết kế
Steven A. Lowe
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.