TDD: Điều gì xảy ra trước khi thử nghiệm đơn vị đầu tiên?


17

Tôi hầu như hiểu lý thuyết về TDD, nhưng tôi không thể tìm ra cách để bắt đầu. Tôi ngồi viết bài kiểm tra đơn vị cho một dự án cá nhân và nhận ra. . . Tôi không biết tôi đang thử nghiệm cái gì. Những đối tượng, chức năng gì, vv

Ví dụ, giả sử tôi muốn viết một ứng dụng để giúp gia đình chúng tôi quản lý các bài tập. Dưới đây là một số câu hỏi trong tâm trí của tôi: Làm thế nào để tôi đi từ ý tưởng này đến thử nghiệm đầu tiên của tôi? Bao nhiêu nên được quyết định trước khi tôi bắt đầu, và tôi tính ra bao nhiêu sau khi tôi bắt đầu viết bài kiểm tra? Khi nào tôi đưa ra quyết định như là lưu trữ dữ liệu trong tệp văn bản hoặc cơ sở dữ liệu? Tôi có nên kiểm tra chấp nhận người dùng trước khi bắt đầu không? Tôi có nên thiết kế UI không? Tôi có nên có một thông số kỹ thuật? (Tôi nhận ra ít nhất một số câu hỏi ví dụ này có thể nằm trong "vùng màu xám").

Ngoài câu hỏi tiêu đề về việc kiểm tra đơn vị đầu tiên, bạn cũng có thể đưa ra một ví dụ về thử nghiệm đơn vị đầu tiên cho một dự án như dự án mẫu có thể như thế nào không?


5
Tôi hoàn toàn khuyên bạn nên đọc cuốn sách GOOS của Nat Pryce và Steve Freeman ... có một số thông tin tuyệt vời về việc kiểm tra từ đầu đến cuối với một 'lát mỏng' chức năng.
trống

Câu trả lời:


6

Tôi thích bắt đầu với một danh sách các Tính năng và với mỗi Tính năng viết các câu chuyện của người dùng, sau đó cho mỗi câu chuyện viết mô tả thử nghiệm.

Hãy suy nghĩ về thiết kế một chút, sau đó chọn một mô tả thử nghiệm và bắt đầu mã hóa: red-green-refactor.

Lặp lại cho đến khi tất cả các bài kiểm tra vượt qua.

Có, các bài kiểm tra chấp nhận nên được coi là một phần của điều này, gắn liền với câu chuyện thích hợp.


Tôi thích điều này. Đó là một quy trình rất rõ ràng mà tôi có thể làm theo: Liệt kê các tính năng, tạo danh sách phụ các câu chuyện của người dùng cho từng tính năng, tạo một danh sách phụ các thử nghiệm cho từng câu chuyện của người dùng. Tôi sẽ thử quá trình này.
Ethel Evans

Tôi chấp nhận điều này bởi vì nó giải quyết những gì cá nhân tôi muốn biết, nhưng khuyên mọi người cũng nên đọc phản hồi (được nâng cao hơn) từ Carl.
Ethel Evans

18

Bạn đã khám phá ra TDD về Thiết kế như thế nào ngay từ đầu. Trước khi bạn viết bài kiểm tra đầu tiên của mình, bạn phải suy nghĩ về chức năng đầu tiên của mình sẽ là gì và chương trình của bạn sẽ như thế nào nếu chức năng đó hoạt động.

Các nhà phát triển không sử dụng TDD cũng phải suy nghĩ về điều đó - nhưng họ có thể "chỉ cần lao vào" và bắt đầu viết một cái gì đó, bất cứ điều gì. Nhưng "một cái gì đó, bất cứ điều gì" không phải luôn luôn trên con đường phân phối chương trình mà bạn nghĩ rằng bạn đang chuẩn bị viết. Những gì là? Chà, chương trình của bạn sẽ như thế nào nếu nó hoạt động? Những bài kiểm tra nào nó sẽ vượt qua?

Tôi muốn viết một ứng dụng để giúp gia đình chúng tôi quản lý các bài tập.

Mát mẻ. Nếu ứng dụng đó hoạt động, nó sẽ làm gì? Chà, một việc vặt có lẽ có thể được gán cho một Người, phải không?

Person fred = new Person("fred")
Chore mow = new Chore("mow the lawn");
mow.assignTo(fred);
assertEquals(fred, mow.whoIsAssigned());

Có một khởi đầu. Không phải là nơi bạn phải bắt đầu, không nhất thiết là nơi tốt nhất để bắt đầu - nhưng đó là một nơi. Đó là thứ bạn muốn mã của mình hỗ trợ (mặc dù tôi chắc rằng bạn có thể tìm ra tên tốt hơn). Bắt đầu ở đó, xem nó thất bại. Làm cho nó vượt qua. Làm sạch nó Lót, rửa sạch, lặp lại.


Tôi không thích ví dụ này, nhưng tôi đồng ý với tiền đề; phương pháp thử nghiệm đầu tiên chỉ có ý nghĩa khi bạn có thể và sẵn sàng thực hiện ít nhất một số thiết kế phía trước. Trong thực tế, bạn thực sự có xu hướng cần một mô hình miền bộ xương, hoặc ít nhất là một đoạn khá lớn của một.
Aaronaught

5
Không có thiết kế phía trước ở đây. Không có lớp nào trong bài kiểm tra cần tồn tại. Thiết kế xảy ra trong thử nghiệm, THÌ chúng được tạo ra để vượt qua thử nghiệm.
Torbjørn

Bạn có thể giải thích thêm về "Trước khi bạn viết bài kiểm tra đầu tiên của mình, bạn phải suy nghĩ về chức năng đầu tiên của bạn sẽ là gì, và chương trình của bạn sẽ như thế nào nếu chức năng đó hoạt động."? Tôi nên tập thể dục bao nhiêu trước khi bắt đầu? Tại thời điểm nào tôi thiết kế quá mức và mất lợi ích của việc để các bài kiểm tra đơn vị của tôi điều khiển thiết kế của tôi? Tôi giả sử tôi không muốn sơ đồ lớp, điều đó nên được điều khiển bằng cách tái cấu trúc, phải không? Nhưng ví dụ này nghe có vẻ như "Có một ý tưởng, đầu tư 15 giây suy nghĩ, sau đó viết một bài kiểm tra." Đó thực sự là tất cả những gì tôi muốn làm?
Ethel Evans

2
@Ethel Vâng, đó là về suy nghĩ nhiều như tôi sẽ khuyên bạn nên đưa vào đó (cả trong ví dụ ở đây và nói chung). Chỉ ra một cái gì đó có thể kiểm tra được, dẫn bạn tới sản phẩm bạn muốn và sau đó viết một bài kiểm tra cho nó.
Carl Manaster

1
Làm thế nào nó hoạt động trên một nhóm là một câu hỏi lớn hơn và khác nhau. Và bản thân TDD không có nhiều điều để nói về việc điều phối công việc nhóm. Lập trình cặp và Trò chơi lập kế hoạch có thể giúp với điều đó; trong bối cảnh những gì bạn đã lên kế hoạch, TDD vẫn được áp dụng. jamesshore.com/Agile-Book/the_planning_game.html Scrum cũng vậy, có điều gì đó để nói về cách lập kế hoạch làm việc của nhóm.
Carl Manaster

5

Vâng, TDD có vấn đề này. Đó là lý do tại sao bây giờ tôi khuyên bạn nên phát triển hướng hành vi.

Bắt đầu bằng tay. Viết một cái gì đó tương tự như một câu chuyện của người dùng:

  • người dùng
  • Khi tôi chọn Thêm vào giỏ hàng, tôi muốn sản phẩm được thêm trong suốt trong nền
  • Để tôi có thể tiếp tục trải nghiệm mua sắm của mình không bị gián đoạn

Bây giờ các tính năng hỗ trợ mục tiêu đó (phần 'Vì vậy' là gì?

  • Khi một mặt hàng được thêm vào giỏ hàng
    • Giỏ hàng cho người dùng sẽ chứa mặt hàng mới
    • Tổng số mặt hàng trong giỏ hàng sẽ tăng thêm một
    • Người dùng không nên chuyển hướng
    • Một tùy chọn kiểm tra ngay bây giờ sẽ có sẵn
  • Khi có hai mặt hàng trong giỏ hàng và người dùng chọn kiểm tra
    • Người dùng sẽ được chuyển hướng đến trang thanh toán
    • Cả hai mục sẽ được nhìn thấy

Đây là tất cả những điều bạn có thể, và nên kiểm tra bằng tay.

Làm điều này một chút. Sau đó, giống như một nhà phát triển giỏi, bắt đầu tìm cách tự động hóa các phần dư thừa. Điều này sẽ thay đổi tùy thuộc vào nền tảng của bạn là gì nhưng hầu hết đều có sẵn các khung công tác.

.Net có WatiN để tự động hóa trang web hoặc, nếu bạn muốn kiểm tra API, tôi sẽ đề xuất bổ sung Subspec cho xUnit hoặc MSpec (bạn cũng có thể thực hiện điều này với bất kỳ khung kiểm tra nào, chỉ những cách này giúp bạn dễ dàng đặt tên cho các bài kiểm tra của mình ủng hộ phong cách tư duy này).

Ruby có dưa chuột để thử nghiệm tự động hóa và rspec cho thử nghiệm API cấp thấp hơn

Javascript có hoa nhài và qUnit.

chấm chấm chấm


Ngoài ra còn có các bản sao / thay thế dưa chuột cho .NET: xem câu hỏi StackOverflow này
Carson63000

@ Carson63000 Vâng, nhưng cá nhân tôi không thấy nhiều điểm. Ruby là một ngôn ngữ .Net trong IronRuby. Chỉ cần tạo một dự án IronRuby và sử dụng dưa chuột thực tế.
George Mauer

Tôi yêu BDD và sử dụng StoryQ. Đừng quên đề cập rằng câu chuyện có thể được mở rộng thành các kịch bản với Cho / Khi / Sau đó. Đưa ra một số thứ đã xảy ra khi tôi làm điều này Và điều này Sau đó tôi mong đợi điều này và điều này. Hãy xem bài nói chuyện của David Starr về điều này tại kênh TechEd9.msdn.com/Events/TechEd/NorthAmerica/2010/DPR302 và cũng có một cái nhìn về StoryQ nếu bạn đang sử dụng .net Storyq.codeplex.com
Bronumski

3

Làm thế nào để tôi đi từ ý tưởng này đến thử nghiệm đầu tiên của tôi? Bao nhiêu nên được quyết định trước khi tôi bắt đầu, và tôi tính ra bao nhiêu sau khi tôi bắt đầu viết bài kiểm tra?

Chia ứng dụng của bạn thành những câu chuyện có kích thước vừa phải. ("Là người dùng, tôi muốn nhấp đúp vào biểu tượng và khởi chạy chương trình." Hoặc "Là người dùng, tôi muốn mở trình duyệt của mình và truy cập chương trình." Sao cũng được.)

Sau đó chia nhỏ câu chuyện thành một số nhiệm vụ. (ví dụ: Tạo một dự án trong Eclipse, thiết lập một kho lưu trữ mã) Khi bạn nhận được một nhiệm vụ mã hóa, hãy viết thử nghiệm đầu tiên của bạn.

Khi nào tôi đưa ra quyết định như là lưu trữ dữ liệu trong tệp văn bản hoặc cơ sở dữ liệu?

Nếu bạn không chắc chắn, hãy chọn cái nào có vẻ đơn giản hơn và làm điều đó. (có thể là tệp văn bản) Nếu bạn nhận ra mình đã mắc lỗi, hãy cấu trúc lại. Nếu các bài kiểm tra của bạn có cấu trúc tốt, bạn sẽ có thể làm cho phần cuối thay đổi và bắt được các tác dụng phụ ngoài ý muốn.


3

Tôi ngạc nhiên rằng không có câu trả lời nào có đề cập đến điều thực tế mà bạn làm ngay trước khi viết bài kiểm tra đầu tiên của mình, đó là tạo một danh sách kiểm tra . Một danh sách kiểm tra được thông báo bởi các giai đoạn viết và thiết kế câu chuyện được đề cập trong các câu trả lời khác và là tiền thân trực tiếp để viết một bài kiểm tra mà bạn dường như đang tìm kiếm.

Để biết thêm thông tin về TDD, tôi muốn giới thiệu Phát triển dựa trên thử nghiệm theo ví dụ của Kent Beck. Ông cũng có một screencast TDD theo sau sự phát triển của một thư viện không tầm thường theo phong cách TDD thuần túy với lời giải thích của Kent ở mỗi bước trong quy trình. Tôi nghĩ rằng đó là một ví dụ tuyệt vời về TDD trong thực tế, ngay cả khi nó (do sự cần thiết) được thực hiện trong một môi trường giả tạo.


0

Trước bài kiểm tra đơn vị đầu tiên, bạn nghĩ về những gì bạn muốn xảy ra và sau đó nghĩ về cách bạn sẽ kiểm tra điều đó. Sau đó viết bài kiểm tra đó, xem nó thất bại và thực hiện một số mã để làm cho nó vượt qua.

Rửa sạch, lặp lại, vv

Đối với tôi, đó là suy nghĩ về cách bạn sẽ kiểm tra nó một chút quan trọng và đó là điều có thể thúc đẩy thiết kế của bạn.

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.