Đi bao xa với bài kiểm tra đơn vị


11

Một câu hỏi được hỏi nhiều lần trước đây nhưng với sự phát triển cụ thể của twds mvc.

Tôi đã từng là một cậu bé rất ngoan và đã mã hóa tất cả các hành động của bộ điều khiển của mình bằng các bài kiểm tra đơn vị tương ứng rất tuyệt vời (nếu đôi khi [đọc rất nhiều] lặp đi lặp lại). Thành thật mà nói, tôi thực sự đã tạo ra một mẫu T4 nhỏ để viết hầu hết các phần xương trần của các bài kiểm tra đơn vị nội bộ và sau đó điều chỉnh phù hợp theo từng cách sử dụng. Tôi sẽ thừa nhận không chắc chắn làm thế nào để xử lý các bài kiểm tra trong các chế độ xem có chứa một phần - nhưng đó là một câu chuyện cho một câu hỏi khác.

Bây giờ, phần khó khăn đối với tôi để quyết định là mức độ bao phủ của lớp dịch vụ của tôi sâu đến mức nào. Lý do là một số phương thức dịch vụ của tôi (tốt hơn hoặc xấu hơn) thực sự thực hiện một loạt các truy vấn linq sau đó cung cấp thông tin kín đáo cho logic tiếp theo trong phương thức. Tôi biết tôi có thể (nên ??) phá vỡ các phương thức này để chỉ gọi logic cần thiết cho mỗi câu lệnh linq và sau đó áp dụng chúng trong phương thức. Tuy nhiên, trong nhiều trường hợp, không bao giờ có bất kỳ việc sử dụng lại các hàm 'linq' và do đó, nó cảm thấy rằng điều này sẽ tái cấu trúc mã ra một mức quá xa.

Điều tôi đang hỏi là, với logic phức tạp xảy ra trong một phương thức, liệu 'có đủ tốt' để có một phương thức kiểm tra chỉ đơn giản xác nhận kết quả được yêu cầu và / hoặc lỗi dự kiến, hoặc mọi dòng logic cũng sẽ được mô phỏng và kiểm tra. theo cách tôi nhìn thấy, để thực hiện kiểm tra một cách chính xác, thì logic phương thức (theo từng dòng) cũng sẽ nhận được một số loại bảo hiểm. Tuy nhiên, điều đó (theo ý kiến ​​ngây thơ của tôi) có thể dẫn đến một chu kỳ không bao giờ kết thúc là cố gắng giữ bài kiểm tra và phương pháp được thực hiện rất gần với nhau (mà tôi biết chúng nên như vậy) để tạo ra một ngành công nghiệp trong các bài kiểm tra.

Tôi biết câu hỏi của tôi có thể xúc phạm một số tín đồ TDD, những người sẽ xem đây là một người không có trí tuệ. Không ở trong trại TDD, đây là câu hỏi "có trí tuệ" đối với tôi, do đó là câu hỏi.

btw - đã kiểm tra ý tưởng này:

http://dotnetslackers.com/articles/aspnet/Built-in-Unit-Test-for-ASP-NET-MVC-3-in-Visual-Studio-2010-Part-1.aspx

tìm kiếm fwd để downvotes ổn định bây giờ :)

[sửa] - vì lợi ích của cử tri (cũng tại thời điểm hiện tại !!) 'đóng' cử tri. Câu hỏi này không chủ quan. Tôi đang tìm kiếm sự đồng thuận về một chủ đề rất tập trung. Tôi không cố gắng khơi dậy những đam mê tiêu cực, tôi không muốn phơi bày những lỗ hổng trong công nghệ - tôi là một fan cuồng nhiệt. Vì vậy, xin vui lòng, bỏ một bình luận lịch sự vì lợi ích của tôi nếu bỏ phiếu để đóng vì nó có thể giúp tôi cơ cấu lại câu hỏi nếu có sự mơ hồ hoặc thông tin sai. câu hỏi này có thể có lợi cho một lượng lớn dân số mvc.

cảm ơn bạn!!

jim


Việc bỏ phiếu (đầu tiên) để đóng là của tôi, nhưng không phải là 'chủ quan và tranh luận' (mà điều này không phải), mà là 'di chuyển đến lập trình viên.stackexchange.com', bởi vì đây không phải là một câu hỏi lập trình cụ thể với một câu hỏi duy nhất câu trả lời rõ ràng.

aakashm, đánh giá cao và hiểu. không phải là đào, chỉ muốn biết :)
jim

Câu trả lời:


4

Trước hết, những gì bạn đang nói về không giống như TDD. TDD ngụ ý cách tiếp cận thử nghiệm đầu tiên là hướng đến việc thiết kế hệ thống của bạn bằng cách làm theo mẫu của Test-> Code-> Refactor . Vì vậy, có lẽ vấn đề đầu tiên của bạn là mục đích của các bài kiểm tra của bạn, bạn có đang viết chúng khi bạn viết mã không? Nếu vậy tôi sẽ mong đợi rằng gần như tất cả logic trong bài kiểm tra của bạn liên quan đến bài kiểm tra đơn vị nào đó. Do đó, độ bao phủ mã cao là kết quả gián tiếp của việc áp dụng TDD.

Khi bạn đang làm TDD, bạn viết đủ mã kiểm tra để thúc đẩy mã bạn muốn viết. Bạn cũng đảm bảo kiểm tra thất bại đầu tiên. Về cơ bản hãy tự hỏi những gì phương pháp này cần phải làm. Sau đó, bạn mã hóa nó, nhưng chỉ đủ để làm cho bài kiểm tra vượt qua, nếu đó không phải là điều bạn đang tìm kiếm thì bạn viết các bài kiểm tra bổ sung và sau đó cấu trúc lại phương thức.

Bảo hiểm mã sau khi thực tế không phải là một phương pháp hiệu quả để đo lường sự tuân thủ TDD của bạn, mặc dù bạn thường sẽ thấy phạm vi bảo hiểm mã rất cao trong mã được viết bằng TDD thực tế là tất cả các mã phải được thúc đẩy bởi một số thử nghiệm.

Các bài kiểm tra TDD phục vụ cho cả việc điều khiển thiết kế và tài liệu và giải thích thiết kế cho người khác bằng ngôn ngữ đơn giản (vì vậy cách bạn đặt tên cho các bài kiểm tra của mình là rất quan trọng).

Tuy nhiên, không có câu hỏi lan man nào thực sự trả lời trực tiếp câu hỏi của bạn, vì vậy tôi chỉ nói rằng, bạn nên nhắm đến mức độ bao phủ mã khá cao của mã dịch vụ (không phải UI), đặc biệt là bất cứ nơi nào có logic phi trival, và thậm chí tốt hơn nếu các bài kiểm tra được viết trước ;-). Thực tế là (mặc dù một số có thể không đồng ý) rằng nhiều xét nghiệm thường tốt hơn. Nhiều dự án nguồn mở chất lượng cao có nhiều mã kiểm tra hơn nhiều so với mã chạy.

Ngoài ra, các bài kiểm tra nên được viết bất cứ khi nào:

  1. Bạn đang viết mã mới, các bài kiểm tra nên lái xe và ghi lại thiết kế của bạn và giải thích các giả định của bạn về những gì mã nên làm. Nên viết trước khi bạn viết mã.

  2. Bạn đã tìm thấy một lỗi, một bài kiểm tra thất bại sẽ chứng minh lỗi. Khi lỗi được sửa, kiểm tra sẽ vượt qua.

  3. Bạn thay đổi mã theo cách thay đổi bản chất của phương thức hoặc lớp thực hiện (mặc dù nếu rất nhiều thử nghiệm thất bại khi một khu vực của mã thay đổi, điều này có thể chỉ ra các thử nghiệm giòn). Điều này giữ cho các bài kiểm tra ghi lại mã chính xác.

Cá nhân, tôi đã thấy rằng học TDD là một thử thách thú vị và cần có thời gian để phát triển một "cảm giác tốt" cho nó. Thực hành, thực hành, thực hành đã là cách tốt nhất để học cho tôi. Điều đó và đọc mã kiểm tra từ các dự án nguồn mở và bây giờ cũng đóng góp cho chúng trong khi viết các thử nghiệm mới với những thay đổi của tôi.


+1 chris - tôi thích cách cắt của bạn :-), nhưng quan trọng hơn, bạn chỉ ra (tho tôi đã hiểu sự khác biệt) sự tách biệt giữa kiểm tra đơn vị và TDD. Của tôi là một mô hình hơi lai (yike !!)
jim

Vâng tôi đoán rằng nó có thể là một cái gì đó bạn đã quen thuộc, nhưng dù sao cũng đáng đề cập đến. Tôi cũng nghĩ rằng tất cả chúng ta có thể có một phần của một mô hình lai. Gần đây tôi đã thấy mình làm nhiều bài kiểm tra hơn. Tôi cảm thấy rằng việc chuyển sang MSpec và kiểm tra phong cách thông số kỹ thuật đã giúp. Mặc dù tôi vẫn viết một số mã nhưng tôi không thể bận tâm kiểm tra trước.
Chris Nicola

... Tôi xấu hổ gật đầu đồng ý ở câu cuối cùng của bạn :)
jim

0

Rõ ràng là chỉ kiểm tra giá trị trả về của một phương thức ít mạnh hơn kiểm tra tất cả các nhánh bên trong nó. Đầu vào thay thế sẽ không được đảm bảo hành vi chính xác.

Mặt khác, bạn có thể không có đủ thời gian hoặc sự kiên nhẫn để kiểm tra mọi thứ.

Những gì bạn có thể làm là quyết định số lượng mã bạn muốn bao gồm các bài kiểm tra (80-90% hoặc bất cứ điều gì) và thực thi điều đó bằng cách sử dụng các công cụ tự động xác minh điều này.
Một "chu trình không bao giờ kết thúc" của các bài kiểm tra viết sẽ chỉ xảy ra nếu chu trình viết mã cũng không bao giờ kết thúc :)


cosmin - rõ ràng là bạn chưa thấy mã của tôi. trở lại máy chạy bộ ... :-)
jim

0

Làm thế nào chắc chắn bạn muốn là mã của bạn hoạt động đúng? Kiểm thử đơn vị chỉ đơn giản là một công cụ trong túi của lập trình viên để giúp xác minh rằng việc triển khai của bạn thực hiện những gì thông số kỹ thuật nói rằng nó cần phải làm. Bạn có thể không cần bảo hiểm 100%, nhưng bạn nên viết các bài kiểm tra đơn vị để bao quát các phần quan trọng hơn trong mã của bạn. Luôn luôn tốt để đảm bảo rằng các phương thức của bạn phối hợp tốt với nhau, không chỉ một mình và do đó bạn nên thử viết một số bài kiểm tra bao gồm một số "dòng logic" quan trọng hơn của bạn.


0

Chạy thử nghiệm đơn vị với phạm vi bảo hiểm mã được bật trong Visual Studio sẽ cung cấp cho bạn một dấu hiệu tốt (và đồ họa) về mức độ mã của bạn được bảo hiểm.

Nếu bạn không sử dụng khung MSTest sẵn có, bạn có thể cần xem một sản phẩm bảo hiểm mã của bên thứ ba để làm việc với NUnit hoặc làm theo hướng dẫn tại đây: /programming/2665799/does-vs2010-code -Sageage-support-nunit

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.