2010-11-12 19 views
12

Tôi có vấn đề để hiểu sự tiến hóa của mã khi bạn đã sử dụng phương pháp TDD "Giả mạo cho đến khi bạn làm cho CNTT".Ai đó có thể giải thích cách tiếp cận "Giả mạo nó cho đến khi bạn thực hiện" trong Phát triển theo hướng thử nghiệm?

Ok, bạn đã giả mạo nó, giả sử bạn trả về một hằng số để kiểm tra bị hỏng có màu xanh ở đầu. Sau đó, bạn lại xác thực mã của bạn. Sau đó, bạn chạy thử nghiệm tương tự mà sẽ vượt qua rõ ràng bởi vì bạn đã giả mạo nó!

Nhưng nếu một bài kiểm tra đang trôi qua thì bạn có thể dựa vào điều đó như thế nào, đặc biệt là khi bạn biết rằng bạn đã giả mạo điều đó?

Làm cách nào để thử nghiệm giả được tái cấu trúc với việc tái cấu trúc mã thực sự của bạn để nó vẫn có thể đáng tin cậy?

Cảm ơn

+1

FWIW nếu bạn áp dụng chiến lược này, tôi khuyên bạn nên sử dụng công cụ năng suất của nhà phát triển như Jetbrains Resharper vì nó sẽ tăng tốc khả năng thực hiện điều này. –

+1

Một hằng số duy nhất được trả về từ một phương pháp về mặt kỹ thuật là cách đơn giản nhất để thực hiện một thử nghiệm thành công. Tuy nhiên, bạn có nhiều khả năng sẽ có nhiều thử nghiệm corroborating cho bất kỳ phương pháp nào, và nó sẽ mất nhiều hơn một hằng số để vượt qua tất cả. – mellamokb

Trả lời

6

Trước tiên, bạn tạo thử nghiệm đơn vị kiểm tra chức năng mới không tồn tại.

Bây giờ, bạn có một thử nghiệm đơn vị cho một phương pháp không tồn tại. Sau đó, bạn tạo ra phương thức mà không làm bất cứ điều gì và biên dịch thử nghiệm đơn vị của bạn, nhưng tất nhiên, thất bại.

Sau đó, bạn sẽ xây dựng phương pháp, chức năng cơ bản, v.v. cho đến khi thử nghiệm đơn vị của bạn thành công.

Đó là (loại) phát triển theo thử nghiệm.

Lý do bạn có thể tin tưởng vào điều này là bạn nên thực hiện bài kiểm tra đơn vị của mình để nó thực sự kiểm tra chức năng của bạn. Tất nhiên, nếu nó chỉ trả về một hằng số và bạn chỉ cần kiểm tra trên đó, bạn có một vấn đề. Nhưng sau đó, kiểm tra đơn vị của bạn chưa hoàn thành.

Bài kiểm tra đơn vị của bạn nên (theo lý thuyết) kiểm tra mọi dòng. Và nếu bạn đã làm điều đó OK, điều này sẽ làm việc.

+1

Kiểm tra đơn vị không được kiểm tra từng dòng. Một phương pháp có điều kiện thất bại sẽ có một bài kiểm tra chỉ cho điều kiện đó và các kiểm tra bổ sung cho từng điều kiện thành công/lỗi bổ sung. Vì vậy, một vài thử nghiệm, thậm chí trong lý thuyết, sẽ bao giờ kiểm tra mọi dòng. –

+1

Điều tôi muốn nói với "mọi dòng" là phạm vi mã. Tôi biết những gì bạn có ý nghĩa, nhưng tôi nghĩ rằng tất cả các điều khoản này là tương đối bởi vì 100% mã vùng phủ sóng kỹ thuật có nghĩa là mọi dòng. Tất nhiên không thể kiểm tra sự tồn tại của mọi dòng mã trong mã của bạn, nhưng bạn đang kiểm tra xem mã bạn mong đợi có ở đó không, có ở đó không. Thay đổi "test" thành "tests" :). –

+0

@PietervanGinkel Có rất nhiều loại số liệu cho phạm vi mã, bạn đang tham khảo vùng phủ sóng. Phạm vi mã 100% không cần phải có nghĩa là mọi dòng. Câu trả lời này là một mô tả về TDD, nhưng không chạm vào "giả mạo nó cho đến khi bạn làm cho nó" -strategy được sử dụng trong TDD. – Alex

6

Câu trả lời ngắn gọn là: viết thêm kiểm tra.

Nếu phương thức trả về hằng số (khi cần tính toán), chỉ cần thêm kiểm tra cho điều kiện có kết quả khác. Vì vậy, chúng ta hãy nói rằng bạn có những điều sau đây:

@Test 
public void testLength() 
{ 
    final int result = objectUnderTest.myLength("hello"); 
    assertEquals(5, result); 
} 

myLength được thực hiện như return 5, sau đó bạn viết một (thêm) thử nghiệm tương tự nhưng vượt qua trong "foobar" thay vào đó và khẳng định rằng kết quả là 6.

Khi bạn đang viết các bài kiểm tra, bạn nên cố gắng hết sức chống lại việc thực hiện và cố gắng viết một cái gì đó để lộ những thiếu sót của nó. Khi bạn đang viết , tôi nghĩ bạn có nghĩa là rất laissez-faire và làm ít nhất là cần thiết để làm cho những thử nghiệm khó chịu màu xanh lá cây.

+0

Nhưng nó có vẻ như Triangulation hơn là giả mạo nó cho đến khi bạn làm cho nó 'mẫu, bạn không nghĩ như vậy? – pencilCake

+0

Tôi nghĩ rằng Triangulation và Fake nó cho đến khi bạn Make It có liên quan. FITYMI là "làm điều đơn giản nhất có thể làm việc". Khi bạn viết trường hợp thử nghiệm đầu tiên của mình, điều đơn giản nhất là trả lại câu trả lời đúng. yay! Chúng tôi đã vượt qua bài kiểm tra. Chúng ta làm xong chưa? Rõ ràng là không, bởi vì nếu toàn bộ việc thực hiện đơn giản, chúng ta có thể thậm chí không viết nó và thay vào đó chỉ sử dụng một hằng số. Giả mạo nó cho đến khi bạn làm cho nó chỉ giúp bạn có được bootstrapped và nhận được trên với các thử nghiệm tiếp theo mà xác thịt ra khỏi hệ thống. Tôi có thể sử dụng "Fake it" cho bài kiểm tra đầu tiên, nhưng nó hiếm khi sống sót sau bài kiểm tra thứ 2 hoặc thứ 3. – legalize

3

Điều này có thể đề cập đến việc thực hành sử dụng mocks/stubs/giả mạo mà hệ thống/lớp học của bạn được thử nghiệm cộng tác.

Trong trường hợp này, bạn "giả" cộng tác viên, không phải thứ bạn đang thử nghiệm, bởi vì bạn không có triển khai giao diện của cộng tác viên này.

Vì vậy, bạn giả mạo nó cho đến khi bạn "làm cho nó", có nghĩa là bạn thực hiện nó trong một lớp cụ thể.

+0

Điều này nghe có vẻ giống như một câu trả lời hợp lý. Không chỉ bạn có thể chưa triển khai cộng tác viên, thậm chí có thể có hại khi sử dụng nó trong môi trường thử nghiệm. Hãy nghĩ đến việc tương tác với một cơ sở dữ liệu thực chẳng hạn. – helpermethod

4

Giả sử bạn cho phép viết điều đơn giản nhất có thể để vượt qua bài kiểm tra hiện tại của bạn. Thông thường, khi bạn viết một trường hợp thử nghiệm cho một tính năng mới, điều đơn giản nhất có thể là trả về một hằng số. Khi một cái gì đó đơn giản đáp ứng các bài kiểm tra của bạn, đó là bởi vì bạn không (chưa) có đủ các bài kiểm tra. Vì vậy, viết một bài kiểm tra khác, như @Andrzej Doyle nói. Bây giờ tính năng bạn đang phát triển cần một số logic cho nó. Có lẽ đây là điều đơn giản nhất có thể là viết logic cơ bản nếu có để xử lý hai trường hợp thử nghiệm của bạn. Bạn biết bạn đang giả mạo nó, vì vậy bạn biết bạn chưa hoàn thành. Khi nó trở nên đơn giản hơn để viết mã thực tế để giải quyết vấn đề của bạn hơn là mở rộng giả mạo của bạn để trang trải thêm một trường hợp thử nghiệm khác - đó là những gì bạn làm. Và bạn đã có đủ các trường hợp kiểm tra để đảm bảo rằng bạn đang viết đúng.

0

Trong TDD, tất cả các yêu cầu được thể hiện dưới dạng thử nghiệm. Nếu bạn giả mạo một cái gì đó và tất cả các bài kiểm tra vượt qua, yêu cầu của bạn được đáp ứng. Nếu điều này không mang lại cho bạn hành vi mong đợi, thì bạn đã không thể hiện tất cả các yêu cầu của bạn như là các bài kiểm tra.

Nếu bạn tiếp tục giả mạo tại thời điểm này, cuối cùng bạn sẽ nhận thấy rằng giải pháp đơn giản nhất là thực sự giải quyết vấn đề.

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