Các trường TDD ở London và Chicago là gì?


88

Tôi đã được nghe về phong cách Luân Đôn so với phong cách Chicago (đôi khi được gọi là phong cách Detroit) của Phát triển hướng thử nghiệm (TDD).

Hội thảo của Nhóm người dùng lập trình cực đoan Utah:

TDD theo phong cách tương tác còn được gọi là phong cách mockist , hay phong cách London sau câu lạc bộ Extreme Thứ ba của London, nơi nó trở nên phổ biến. Nó thường tương phản với TDD theo phong cách Detroit hoặc cổ điển dựa trên nhà nước hơn.

Xưởng của Jason Gorman :

Hội thảo bao gồm cả trường TDD ở Chicago (kiểm tra hành vi và tam giác dựa trên tiểu bang) và trường London , nơi tập trung nhiều hơn vào kiểm tra tương tác, chế giễu và TDD từ đầu đến cuối, đặc biệt nhấn mạnh vào Thiết kế có trách nhiệmNói, Đừng hỏi cách tiếp cận với OO gần đây được phổ biến lại bởi cuốn sách Phần mềm hướng đối tượng phát triển tuyệt vời của Steve Freeman và Nat Pryce .

Bài viết TDD cổ điển hay "Trường học London"? của Jason Gorman là hữu ích, nhưng các ví dụ của anh ấy làm tôi bối rối, bởi vì anh ấy sử dụng hai ví dụ khác nhau thay vì một ví dụ với cả hai cách tiếp cận. Sự khác biệt là gì? Khi nào bạn sử dụng từng phong cách?

Câu trả lời:


76

Giả sử bạn có lớp được gọi là "sổ cái", một phương thức gọi là "tính toán" sử dụng "Máy tính" để thực hiện các loại phép tính khác nhau tùy thuộc vào các đối số được truyền cho "phép tính", ví dụ "nhân (x, y)" hoặc "trừ ( x, y) ".

Bây giờ, giả sử bạn muốn kiểm tra những gì xảy ra khi bạn gọi ledger.calculate ("5 * 7").

Trường Luân Đôn / Tương tác sẽ giúp bạn khẳng định liệu Calculator.multiply (5,7) có được gọi hay không. Các khung mô phỏng khác nhau rất hữu ích cho việc này và nó có thể rất hữu ích nếu, chẳng hạn, bạn không có quyền sở hữu đối tượng "Máy tính" (giả sử đó là một thành phần hoặc dịch vụ bên ngoài mà bạn không thể kiểm tra trực tiếp, nhưng bạn có biết bạn phải gọi theo một cách riêng).

Trường Chicago / State sẽ giúp bạn khẳng định liệu kết quả có phải là 35. Các khung jUnit / nUnit thường hướng tới việc này.

Cả hai đều là các xét nghiệm hợp lệ và quan trọng.


Ví dụ rất hay.
Sevenseacat

1
Tôi sẽ thêm một vài lý do để sử dụng mỗi lý do: Nếu điều quan trọng là xác định rằng một cái gì đó đã hoặc không thay đổi dựa trên hành động được thực hiện (ví dụ: ledger.bucket.value trở thành 35 khi ledger.calculate ("5 * 7 ") được gọi), bạn muốn sử dụng các xác nhận của tiểu bang (trường Chicago). Điều này hữu ích nhất khi bạn có toàn quyền kiểm soát trạng thái của hệ thống trước khi phương thức được gọi và khi bạn thực sự kiểm soát phương thức đó làm gì.
Matthew Flynn

1
Nếu điều quan trọng là biết rằng một phương thức thứ hai được gọi (ví dụ: Calculator.multiply (5, 7)), bạn muốn sử dụng các xác nhận hoạt động, như thông qua một đối tượng giả. Điều này hữu ích nhất nếu phương thức được gọi có tác dụng phụ mong muốn (ví dụ: lưu dữ liệu, tăng bộ đếm, gửi tin nhắn, v.v.) nếu bạn không thực sự kiểm soát phương thức làm gì, vì vậy giá trị trả về có thể không nhất quán . Ngoài ra, nếu bạn không thể dễ dàng kiểm soát trạng thái của hệ thống, điều tốt nhất bạn có thể làm là xác định những hoạt động nào xảy ra.
Matthew Flynn

Cách tiếp cận Luân Đôn rất hữu ích khi lớp Máy tính có khả năng hoạt động lâu vì một số lý do hoặc liên quan đến một mạng và do đó có thể bị lỗi trong các thiết lập dev / qa. Tức là chế giễu cho phép các bài kiểm tra của bạn nhanh và đáng tin cậy trong trường hợp không thể thực hiện được.
Kevin

1
Phương pháp Luân Đôn cũng lập luận để cung cấp tín hiệu phản hồi rõ ràng hơn, bởi vì nếu Calculatorhồi quy multiply, bạn sẽ thấy hai bài kiểm tra thất bại: kiểm tra sổ cái và kiểm tra máy tính, nhưng chỉ có một bài kiểm tra thất bại nếu bạn giả lập máy tính. Điều đó có thể giúp dễ dàng xác định nguồn gốc của lỗi, đặc biệt nếu hệ thống phức tạp.
Matthias

30

Bài viết Mocks Ar't Stub , của Martin Fowler là một giới thiệu tốt về chủ đề này.

Tùy thuộc vào phong cách thiết kế bạn chọn (và các nguyên tắc thiết kế mà bạn xây dựng chương trình của mình), có ít nhất hai cách để nhìn thấy một đối tượng:

  1. Là một đơn vị thực hiện tính toán dựa trên đầu vào. Kết quả của việc tính toán này, đối tượng có thể trả về một giá trị hoặc thay đổi trạng thái của nó.
  2. Là một yếu tố hoạt động giao tiếp với các yếu tố khác trong hệ thống bằng cách truyền tin nhắn.

Trong trường hợp đầu tiên, bạn quan tâm đến những gì phát sinh từ quá trình xử lý hoặc ở trạng thái nào đối tượng còn lại sau quá trình xử lý đó. Đây là nơi các phương thức như assertEquals()nhập hình ảnh. Trong trường hợp này, không có vấn đề gì nhiều đối tượng khác tham gia vào quá trình xử lý, phương thức nào được gọi, v.v. Loại xác minh này được gọi là xác minh dựa trên trạng thái và là kiểu "cổ điển".

Trong trường hợp thứ hai, vì hầu hết các đối tượng thậm chí không trả về bất kỳ kết quả nào (ví dụ: voidcác phương thức trong Java), bạn quan tâm nhiều hơn đến cách các đối tượng giao tiếp với nhau và nếu chúng truyền đúng thông điệp trong các trường hợp do thử nghiệm áp đặt. Những tương tác này thường được xác minh với sự trợ giúp của các khung giả. Loại xác minh này được gọi là xác minh dựa trên hành vi hoặc dựa trên tương tác. Một trong những ý nghĩa của nó là kỹ thuật có tên là Behavior Driven Development, qua đó bạn phát triển một lớp giả định rằng các cộng tác viên của nó đã tồn tại (mặc dù chúng có thể chưa tồn tại), vì vậy bạn có thể mã hóa các giao diện của chúng.

Lưu ý rằng đây không phải là một hoặc / hoặc sự lựa chọn. Bạn có thể có một phong cách thiết kế pha trộn cả hai cách tiếp cận để tận dụng tốt nhất từng phương pháp.

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.