Kiểm thử đơn vị thực hành tốt nhất cho người mới kiểm tra đơn vị


29

Trong những năm gần đây, tôi chỉ viết các thành phần nhỏ cho mọi người trong các dự án lớn hơn hoặc các công cụ nhỏ. Tôi chưa bao giờ viết một bài kiểm tra đơn vị và dường như luôn luôn học cách viết chúng và thực sự làm cho nó mất nhiều thời gian hơn là chỉ đơn giản là khởi động chương trình và kiểm tra thực tế.

Tôi sắp bắt đầu một dự án quy mô khá lớn, có thể mất vài tháng để hoàn thành và trong khi tôi sẽ thử kiểm tra các yếu tố khi tôi viết chúng (như mọi khi), tôi tự hỏi liệu thử nghiệm đơn vị có thể giúp tôi tiết kiệm thời gian không.

Tôi chỉ tự hỏi nếu có ai có thể cho lời khuyên tốt:

  1. Tôi có nên xem xét thử nghiệm đơn vị khi bắt đầu dự án và có thể áp dụng phương pháp TDD.
  2. Tôi chỉ nên viết bài kiểm tra khi tôi đi cùng, sau khi mỗi phần hoàn thành.
  3. Tôi có nên hoàn thành dự án và sau đó viết bài kiểm tra đơn vị vào cuối.



Câu trả lời:


29

Một số người sẽ nói khác nhưng tôi khuyên bạn nên tách TDD và Kiểm tra đơn vị. TDD là một sự thay đổi tinh thần và thử nghiệm đơn vị xuất hiện ban đầu để mất thời gian. Nếu bạn coi chúng là một mặt hàng, có nguy cơ bạn sẽ không thấy đủ lợi ích ngay lập tức và sẽ có một sự cám dỗ chỉ đơn giản là bỏ TDD và Kiểm tra đơn vị với nó.

Điều đầu tiên là viết một số bài kiểm tra đơn vị. Lúc đầu họ không cần phải hoàn hảo. Chỉ cần dạy bản thân cách kiểm tra các đơn vị mã nhỏ và cách sử dụng mô phỏng để cách ly các thành phần.

Đây là người làm thời gian lớn nhất nhưng cho đến nay là phần thưởng lớn nhất. Khi bạn nhận thấy rằng bạn không còn phải trang qua 14 trang web để truy cập trang bạn muốn kiểm tra, bạn sẽ biết tôi đang nói về điều gì.

Đối với tôi, khoảnh khắc lớn của Eureka là một ứng dụng Windows nơi tôi đang thử kiểm tra một biểu thức chính quy yêu cầu tôi điền vào hai biểu mẫu trước khi tôi có thể truy cập vào nó. Tôi đã cài đặt NUnit và viết một bài kiểm tra xung quanh phương pháp đó và thấy tôi đã tiết kiệm được bao nhiêu giờ thời gian thử nghiệm. Sau đó, tôi đã thêm nhiều bài kiểm tra để đối phó với các trường hợp cạnh. Và như vậy.

Sau đó học cách viết bài kiểm tra đơn vị tốt. Tìm hiểu sự cân bằng giữa các bài kiểm tra giòn, nhanh chóng để viết và viết nhiều bài kiểm tra cá nhân. Điều này khá dễ dàng. Bài học là lý tưởng mỗi bài kiểm tra chỉ kiểm tra một điều, nhưng bạn nhanh chóng học được thời gian đó, vì vậy bạn bắt đầu uốn cong một chút theo quy tắc cho đến khi bạn viết một bài kiểm tra phá vỡ mọi thay đổi mã, sau đó bạn quay trở lại cân bằng đúng (gần với cái trước hơn cái sau).

TDD, như tôi đã nói, một sự thay đổi lớn về tinh thần trong cách bạn làm việc. Tuy nhiên, nó sẽ không thêm nhiều thời gian cho quá trình phát triển của bạn sau khi bạn đã viết bài kiểm tra. Và bạn sẽ, tôi hứa, sẽ thấy phong cách mã hóa của bạn được cải thiện trước mắt bạn. Hay đúng hơn, nếu bạn không thả nó, nó không dành cho bạn.

Một điều cuối cùng cần lưu ý là TDD không giới hạn trong các bài kiểm tra đơn vị. Thiết kế hướng kiểm tra chấp nhận là một phần của TDD. Một lý do tốt để không trộn lẫn chúng trong tâm trí của bạn.


+1 Cảm ơn - Để mở trong một thời gian trong trường hợp có câu trả lời khác, nhưng tôi nghĩ dự án này sẽ là bước ngoặt của tôi với cùng một lý do - nhiều trang web và sẽ mất nhiều thời gian hơn để kiểm tra thủ công.
wilhil

@pdr bạn có một số tài liệu tham khảo tôi có thể nghiên cứu về "viết bài kiểm tra đơn vị tốt" không?
Gaston

9

Tôi đồng ý với những người khác (cuối cùng chắc chắn không viết bài kiểm tra của bạn, TDD dành thời gian để tìm hiểu, bắt đầu với thử nghiệm theo cách bạn có thể, cuối cùng nhắm đến TDD đầy đủ). Nhưng tôi muốn thêm một điều để đáp lại bình luận của bạn: "Tôi tự hỏi liệu thử nghiệm đơn vị có thể giúp tôi tiết kiệm thời gian không."

Câu trả lời của tôi là không rõ ràng có. Tôi đã học được cách tiếp cận TDD khoảng 10 năm trước, sau một khoảng thời gian mã hóa tương tự mà không cần kiểm tra. Ngày nay, nếu tôi đang làm một cái gì đó ngắn (<250 loc) và đơn giản, hoặc một cái gì đó vứt đi, thì tôi sẽ không TDD nó. Nếu không, tôi làm, và chính xác bởi vì nó tiết kiệm thời gian.

Tiết kiệm thời gian có ba cách: ít WTF, ít gỡ lỗi và ít sợ hãi hơn. Đầu tiên là rõ ràng: bạn dành ít thời gian hơn để tự hỏi những gì bạn xây dựng đang làm cái quái gì. Khi bạn gặp sự cố, việc gỡ lỗi dễ dàng hơn nhiều, vì a) bạn bắt được các lỗi đã kiểm tra ngay lập tức và b) các lỗi chưa được kiểm tra có ít chỗ để ẩn hơn.

Điều ít sợ hãi hơn, mặc dù, nó tinh tế hơn. Cho đến khi bạn dành một khoảng thời gian trong cơ sở mã TDD, bạn thậm chí không nhận ra mình đã dành bao nhiêu thời gian để lo lắng về những thay đổi bạn đang thực hiện. X có hoạt động không? Nó sẽ phá vỡ Y? Có một số Z có thể bị ảnh hưởng? Với TDD, điều đó biến mất, bởi vì bạn biến nỗi sợ hãi của mình thành các bài kiểm tra, và sau đó máy tính sẽ tự động hóa sự lo lắng. Một nhà phát triển dũng cảm là một nhà phát triển nhanh hơn.


1
+1 để bớt sợ hãi. Và tôi đã tái cấu trúc một codebase không thử nghiệm trong tuần này. . .
Wyatt Barnett

2
Câu nói hay: "bạn biến nỗi sợ hãi của mình thành thử nghiệm, và sau đó máy tính tự động hóa sự đáng lo ngại"!
RichVel

5
  1. Tôi có nên nhìn vào đơn vị khi bắt đầu và áp dụng phương pháp TDD.

  2. Tôi có nên viết bài kiểm tra khi tôi hoàn thành sau khi mỗi phần hoàn thành.

Một trong hai, nhưng không phải là lựa chọn thứ ba .

Như @pdr lưu ý, học kiểm tra đơn vị thích hợp cần có thời gian. Bạn chắc chắn muốn dành thời gian để tìm hiểu khi bắt đầu vòng đời dự án, chứ không phải đến cuối khi thời hạn đang lờ mờ trên đầu bạn. Bằng cách này, bạn đã tăng tốc và thậm chí có thể bắt đầu gặt hái những lợi ích khi thời hạn đến gần hơn, do đã bắt được hầu hết các lỗi trước đó trong vòng đời dự án.

Lưu ý rằng kiểm tra đơn vị đầu tiên luôn là khó khăn nhất, đặc biệt nếu bạn đang kiểm tra mã đã được viết. Mã như vậy có thể không thân thiện với thử nghiệm đơn vị, vì vậy bạn có thể gặp khó khăn khi kết nối tất cả các đối tượng với trạng thái thích hợp cho thử nghiệm. Do đó, chọn một số thử nghiệm cấp độ thấp, khá cô lập, dễ dàng cho các lần thử nghiệm đơn vị đầu tiên của bạn, sau đó dần dần bạn có thể tăng mức độ thử thách. Khi bạn đã có thiết bị thử nghiệm đầu tiên sẵn sàng, trường hợp thử nghiệm tiếp theo sẽ dễ dàng hơn nhiều và đến khi bạn đến lần thứ tư, bạn sẽ sản xuất các trường hợp thử nghiệm như trên băng chuyền. Đó là khi bạn bắt đầu cảm thấy sự tốt đẹp của việc có thể lặp lại, chứng minh một cách rõ ràng rằng mã của bạn hoạt động ...

Cá nhân tôi thích cách tiếp cận TDD và tôi không nghĩ rằng đó là một thách thức - nó cần sự kiên trì, nhưng tôi tin rằng bạn bắt đầu với TDD càng sớm, bạn càng sớm thấy được lợi ích của việc kiểm tra đơn vị nói chung. Tuy nhiên, có thể là một vài bài kiểm tra đơn vị đầu tiên tốt hơn để viết mã bạn đã có. Sau đó, khi bạn hiểu rõ về nó, bạn có thể bắt đầu thử nghiệm với TDD.


Tôi nghĩ rằng tôi sẽ chọn tùy chọn thứ hai dựa trên lời khuyên của bạn và PDR - đối với tùy chọn thứ ba, tôi thực sự có nghĩa là tôi sẽ thực hiện kiểm tra thủ công và chỉ viết một bài kiểm tra ở cuối để đảm bảo mọi thứ hoàn thành theo cách của nó kiểm tra nếu có bất kỳ sửa đổi trong tương lai.
wilhil

2

Tôi nghĩ rằng điều tốt nhất cho một người mới làm là giải quyết một số katas mã cho vay để thử nghiệm đơn vị. Ví dụ; xác nhận một địa chỉ email. TDD trở thành dòng chảy tự nhiên khi bạn đã xử lý một vài trong số các Code Katas này. Kiểm tra kata mã sau đây cho trình xác nhận địa chỉ email tôi đã đề cập: Trình xác thực email

Để được giải thích về Code Katas dành cho những ai chưa biết, hãy xem liên kết sau: Code Katas

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.