Làm thế nào để sử dụng các bài kiểm tra đơn vị như một nguồn thông tin?


8

Một đồng nghiệp của tôi đã từng tham dự một hội thảo về phát triển nhanh, nơi anh ta nghe nói có thể sử dụng các bài kiểm tra đơn vị làm tài liệu kỹ thuật. Một cái gì đó giống như sử dụng các bài kiểm tra đơn vị làm ví dụ về cách sử dụng lớp.

Một tìm kiếm nhanh của Google đã cung cấp TDD và Tài liệu , điều đó chứng tỏ điều đó là có thể. Nhưng nhìn vào mã của chúng tôi, tôi thấy rằng rõ ràng chúng tôi đã thất bại trong việc thực hiện các bài kiểm tra đơn vị theo cách như vậy.

Theo ý kiến ​​của tôi, các bài kiểm tra đơn vị có để kiểm tra mã dưới dạng một đơn vị tối thiểu, ngay cả với sự trợ giúp của các lớp và hàm giả và giả.

Vì vậy, các câu hỏi là:

  • Có phải nhiệm vụ của các bài kiểm tra chức năng là chỉ ra cách sử dụng một lớp (hoặc tập hợp các lớp) không?
  • Nếu có thể sử dụng các bài kiểm tra đơn vị làm tài liệu kỹ thuật, có một số hướng dẫn về cách thực hiện các bài kiểm tra đơn vị đó không?

2
Các bài kiểm tra đơn vị là một nguồn tài liệu, nhưng thường không phải là nguồn duy nhất.
Hội trường Garrett

"Nhưng nhìn vào mã của chúng tôi, tôi thấy rằng rõ ràng chúng tôi đã thất bại trong việc thực hiện các bài kiểm tra đơn vị theo cách như vậy." ...? Có nghĩa là các bài kiểm tra đơn vị của bạn không dễ hiểu như mã ví dụ?
Steven Jeuris

@StevenJeuris Chúng tôi có nhiều bài kiểm tra đơn vị c ++ và một số bài dài (hơn 30 dòng). Tôi chưa bao giờ nhìn vào các bài kiểm tra đơn vị để xem lớp được sử dụng như thế nào. Vì vậy, tôi đã sử dụng tài liệu doxygen mà chúng ta có và mã (nơi sử dụng lớp cụ thể) và tôi đã cố gắng hiểu từ mã lớp những gì nó đang làm. Đây là điều mới đối với tôi
BЈовић

Câu trả lời:


10

Nếu bạn đang áp dụng TDD, thì mỗi bài kiểm tra đơn vị bạn đã viết tương ứng với chức năng của một lớp. Vì vậy, khi bạn viết các bài kiểm tra, bạn thực sự đang tạo ra các chức năng của lớp, các phụ thuộc, ngoại lệ và cả tài liệu lớp.

Nếu bạn không áp dụng TDD, các bài kiểm tra đơn vị vẫn cung cấp cho bạn ý tưởng về lớp học và những gì nó làm. Tên kiểm tra đơn vị rất mô tả, do đó bạn không cần phải tạo tài liệu.

Hãy xem xét một bài kiểm tra đơn vị như

public void Customer_Service_Can_Register_New_Customers(){...}
public void Customer_Service_Cannot_Register_Customers_With_Duplicate_Emails(){...}

Đây là những phương pháp tự mô tả và dễ đọc quá. Vì vậy, họ cũng phục vụ như tài liệu.


4

Các bài kiểm tra đơn vị, nếu được viết tốt DO sẽ phục vụ như một số tài liệu của một lớp hoặc phương thức hoặc bất cứ điều gì.

Những bài được viết tốt dẫn đến sự hiểu biết nhiều hơn bằng cách dễ dàng tìm ra những gì họ đang kiểm tra, nhưng ngay cả những bài kiểm tra kém cũng cho người đọc một số ý tưởng về cách mà bài kiểm tra được cho là hành động, và những điều mà tác giả nghĩ là quan trọng để kiểm tra.

Heck, tôi đã biết viết các bài kiểm tra đơn vị cho các thư viện bên ngoài - không phải vì họ cần kiểm tra, mà vì tôi muốn đảm bảo rằng sự hiểu biết của tôi về thư viện là chính xác. Và trong tương lai, nếu ai đó có câu hỏi về cách tôi sử dụng mọi thứ, thì đó là sự hiểu biết của tôi, ngay trong mã kiểm tra.


3
Đề nghị tốt đẹp về các bài kiểm tra cho mã bên ngoài!

1
Các bài kiểm tra kiểm tra sự hiểu biết của bạn về một thư viện được gọi là Kiểm tra đặc tính .
Carl Manaster

2
@CarlManaster - Tôi nghĩ rằng tôi thích thuật ngữ Learning Test tốt hơn một chút - Tôi biết rằng Feathers kết hợp chúng với các Bài kiểm tra Đặc tính, nhưng tôi nghĩ thật hữu ích khi phân biệt các bài kiểm tra nhằm cho phép bạn thay đổi một cách an toàn (Bài kiểm tra Đặc tính) bạn về một cái gì đó
Michael Kohne

2

Mặc dù các kiểm tra chức năng có thể giúp bạn hiểu toàn bộ một chức năng, một kiểm tra đơn vị có thể giúp hiểu được một phạm vi mã nhỏ (như một phương thức duy nhất).

Các bài kiểm tra đơn vị tốt cũng sẽ lưu trữ dưới dạng tài liệu kỹ thuật tốt, và có một vài điều có thể giúp viết các bài kiểm tra tốt, đơn giản và hữu ích. Hai điểm quan trọng nhất tôi gặp phải là

  • Hãy chắc chắn rằng tất cả các bài kiểm tra của bạn là độc lập. Bạn sẽ có thể chạy bất kỳ tập hợp con các bài kiểm tra, theo bất kỳ thứ tự nào.

  • Hãy chắc chắn rằng bạn chỉ kiểm tra một điều duy nhất trong mỗi bài kiểm tra. Điều này giữ cho bài kiểm tra của bạn cụ thể, đơn giản, nhưng không dễ vỡ.


2

Ý tưởng của các bài kiểm tra như tiêu chí chấp nhận / tài liệu là một ý tưởng tuyệt vời. Tuy nhiên, các thử nghiệm đơn vị có xu hướng tập trung vào thiết kế kiến ​​trúc / mã hơn là các câu chuyện của người dùng - cố gắng ghi lại các trường hợp sử dụng hoặc yêu cầu ở cấp độ cao hơn có thể gây khó xử. Tôi chưa nhìn nhiều vào nó (nhưng), nhưng Phát triển hướng hành vi có thể giúp giải quyết vấn đề đó.


1

Tôi thấy các ví dụ dễ học hơn nhiều so với tài liệu và bài kiểm tra đơn vị phục vụ tuyệt vời như thế. Không chỉ vậy, nhưng họ chỉ cho tôi, ví dụ, những gì KHÔNG nên làm với một đơn vị.

Tuy nhiên, chúng không thể là hình thức tài liệu duy nhất. Người ta phải nhận ra rằng tất cả bộ não hoạt động khác nhau. Đó là một điều tôi nghĩ rằng những người khuyên bạn nên sử dụng các bài kiểm tra đơn vị JUST làm tài liệu của bạn hoặc CHỈ mã hoàn toàn bỏ lỡ. Thậm chí sâu sắc hơn là thực tế là ngay cả những bộ não đơn lẻ cũng học được những điều khác nhau từ các phương tiện khác nhau. Tôi học được một cái gì đó hoàn toàn khác với sơ đồ lớp hơn là tôi chỉ nhìn vào mã hoặc đọc tài liệu API.

Nhưng vào cuối ngày, nếu sơ đồ và tài liệu API là tất cả những gì bạn có thì có lẽ tôi đã bị lừa. Tôi cần ví dụ. Tôi cần phải nhìn thấy một cái gì đó đang được sử dụng. Tôi có thể tìm kiếm mã cho điều này và không có bất kỳ ví dụ nào khác mà tôi mắc kẹt, nhưng điều này sẽ không bao giờ cho tôi biết nhiều như một bài kiểm tra đơn vị tốt.


0

Kiểm tra ngày nay là một mớ hỗn độn của thuật ngữ trong đó những người khác nhau có nghĩa là những thứ hơi khác nhau và định nghĩa đã thay đổi theo thời gian.

Ví dụ, TDD từng là một thứ mà bây giờ được gọi là BDD. Sự khác biệt là bởi vì những gì đã được thử nghiệm đơn vị thông qua phát triển dựa trên thử nghiệm hiện là một cách tiếp cận chi tiết hơn đối với các phương pháp thử nghiệm (thường được tạo ra bởi các công cụ tự động). Điều từng là TDD là một cách đơn giản hơn các đơn vị kiểm thử kích thước của các lớp, mà tôi nghĩ bây giờ được gọi là kiểm thử chức năng.

Ý tưởng mà bạn có thể sử dụng (một số hình thức) kiểm tra là bạn có thể viết một bài kiểm tra trông giống như cách người dùng sẽ sử dụng một đơn vị mã của bạn. Nó trở thành một ví dụ cho các tài liệu và một bài kiểm tra cùng một lúc.

Vì vậy, nếu bạn đã có một lớp mạng đơn giản (ví dụ). Thay vì kiểm tra từng phương thức riêng lẻ, bạn sẽ tiếp cận kiểm tra rằng lớp là đơn vị cần kiểm tra. Sau đó, kiểm tra đơn vị của bạn sẽ thực hiện toàn bộ đơn vị bằng cách gọi phương thức để khởi tạo đối tượng, đặt máy chủ và cổng và gọi một phương thức để gửi dữ liệu, có thể gọi cả một phương thức để nhận.

Tất cả những gì có thể phù hợp với một 'thử nghiệm đơn vị' sẽ kiểm tra đối tượng bằng cách đặt nó ở trạng thái được cấu hình và khiến nó thực hiện một số công việc. Các bài kiểm tra đơn vị tiếp theo sẽ thực hiện nó với dữ liệu xấu, nhưng bạn không cần phải đưa chúng vào tài liệu.

Điều này không được coi là thử nghiệm đơn vị ngày hôm nay, nhưng tất cả đều theo định nghĩa của bạn về một đơn vị.


Kiểm tra đơn vị và kiểm tra chức năng là những thứ khác nhau. Nếu bạn bắt đầu mở và đóng các kết nối và sử dụng tài nguyên thực, bạn đang thực hiện kiểm tra chức năng và các kiểm tra đó chậm, trong khi các kiểm tra đơn vị phải rất nhanh.
BЈовић

1
Bạn đã mua vào sự cường điệu của thử nghiệm đơn vị. Chúng không được coi là nhỏ, hoặc nhanh, hoặc bất cứ thứ gì khác ngoài phương tiện để kiểm tra một đơn vị mã riêng lẻ. Tất cả phần còn lại được thực hiện để làm cho công cụ đi kèm xuất hiện chính xác. Chúng có thể chậm và chạy hàng ngày, và lớn và đầy đủ các ví dụ để làm việc một lớp kỹ lưỡng. Không có định nghĩa đơn giản được xác định của một bài kiểm tra đơn vị. Đừng gác máy với một số định nghĩa tùy tiện về những gì bạn phải làm, kiểm tra mã của bạn một cách cô lập, chế giễu hoặc ngắt kết nối bên ngoài và bạn có thử nghiệm tốt.
gbjbaanb
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.