Thêm các bài kiểm tra đơn vị vào mã kế thừa [đã đóng]


79

Bạn đã bao giờ thêm các bài kiểm tra đơn vị vào mã kế thừa chưa? Làm thế nào phức tạp là mã và làm thế nào khó khăn để khai thác và mô phỏng mọi thứ? Kết quả cuối cùng có đáng giá không?


4
Tôi sẽ xem "Làm việc hiệu quả với Mã kế thừa". Hy vọng rằng nó sẽ cung cấp cho tôi một số gợi ý tốt về cách viết trình bao bọc cho tất cả các phụ thuộc tĩnh này!
BuckeyeSoftwareGuy

Câu trả lời:


57

Cách tốt nhất, tôi đã tìm thấy, là thêm dần các bài kiểm tra đơn vị, không chỉ nhảy vào và nói rằng bây giờ chúng tôi sẽ kiểm tra đơn vị ứng dụng.

Vì vậy, nếu bạn định chạm vào mã, để sửa lỗi hoặc tái cấu trúc, thì trước tiên hãy viết các bài kiểm tra đơn vị. Đối với các bài kiểm tra đơn vị lỗi sẽ giúp chứng minh vấn đề nằm ở đâu, vì bạn có thể sao chép nó.

Nếu tái cấu trúc, bạn sẽ muốn viết các bài kiểm tra đơn vị, nhưng bạn có thể thấy rằng bài kiểm tra đó không thể viết được, vì vậy bạn có thể cần tìm một cấp độ cao, gọi hàm sẽ được cấu trúc lại và kiểm tra đơn vị phần đó. Sau đó, khi bạn cấu trúc lại chức năng tấn công, hãy viết các bài kiểm tra của bạn để bạn có thể đảm bảo rằng nó đang hoạt động như bình thường.

Không có cách nào dễ dàng để làm điều này.

Câu hỏi này có thể giúp đưa ra nhiều gợi ý hơn. Làm cách nào để bạn đưa kiểm thử đơn vị vào một cơ sở mã kế thừa (C / C ++)?


8
+1 để tăng dần các bài kiểm tra.
TrueWill

42

Cuốn sách của Michael Feathers "Làm việc hiệu quả với Mã di sản" là toàn bộ cuốn sách đề cập đến chủ đề này. Michael nói rằng thường quá khó để giới thiệu các bài kiểm tra cho mã kế thừa vì nó không được cấu trúc để có thể kiểm tra được. Điều tôi nhận ra từ cuốn sách nhiều nhất là một vài mẫu có tên "Hàm mầm" và "Lớp mầm". Hàm nảy mầm là một hàm đóng gói thay đổi mà bạn cần thực hiện trong mã. Sau đó, bạn chỉ kiểm tra các chức năng này. Lớp mầm là cùng một ý tưởng ngoại trừ chức năng mới được chứa trong một lớp.


10

Có, và nói chung là rất đau. Thay vào đó, tôi thường phải viết các bài kiểm tra tích hợp.

Cuốn sách The Art of Unit Testing có một số lời khuyên hữu ích về điều này. Nó cũng giới thiệu cuốn sách Làm việc hiệu quả với Mã kế thừa ; Tôi chưa đọc phần thứ hai, nhưng nó nằm trong ngăn xếp của tôi.

CHỈNH SỬA: Nhưng có, ngay cả độ phủ mã tối thiểu cũng đáng giá. Nó đã mang lại cho tôi sự tự tin và một mạng lưới an toàn để cấu trúc lại mã.

CHỈNH SỬA: Tôi đã đọc Làm việc hiệu quả với Mã kế thừa và nó rất xuất sắc.


4
+1 cho "Làm việc hiệu quả với Mã kế thừa": đầy những lời khuyên tuyệt vời; trên thực tế, nó rất đáng đọc ngay cả đối với môi trường greenfield, giống như một nguồn tài nguyên tuyệt vời về xây dựng mã cho khả năng kiểm tra.
itowlson

1
+1 cho ý tưởng thay thế các bài kiểm tra đơn vị bằng các bài kiểm tra tích hợp. Với sự chế giễu thích hợp, những điều trước đây là Đủ Tốt, khá thường xuyên
DVK

6

Cũng hãy nhìn vào cách tiếp cận mới trong lĩnh vực kiểm thử đơn vị mã kế thừa - dự án Asis , nó được lấy cảm hứng từ dự án ApprovalTests và chia sẻ các khái niệm chính của nó.

Như đã đề cập về phương pháp ApprovalTests trong bài viết này :

Thường thì bạn có một dự án mã kế thừa khổng lồ mà bạn không có thử nghiệm nào cả, nhưng bạn phải thay đổi mã để triển khai một tính năng mới hoặc trình cấu trúc lại. Điều thú vị về mã kế thừa là - Nó hoạt động! Nó hoạt động trong nhiều năm, bất kể nó được viết như thế nào. Và đây là một ưu điểm rất lớn của mã đó. Với việc phê duyệt, chỉ với một lần kiểm tra, bạn có thể nhận được tất cả các đầu ra có thể có (HTML, XML, JSON, SQL hoặc bất kỳ đầu ra nào có thể là) và chấp thuận, bởi vì bạn biết đấy - nó hoạt động! Sau khi bạn đã hoàn thành bài kiểm tra như vậy và được chấp thuận kết quả, bạn thực sự an toàn hơn nhiều với việc tái cấu trúc, vì bây giờ bạn đã "khóa" tất cả các hành vi hiện có.

Công cụ Asis chính xác là về việc ghi nhớ mã kế thừa thông qua việc tạo và chạy các bài kiểm tra mô tả đặc tính một cách tự động.

Để biết thêm thông tin, hãy xem tại


Làm thế nào để điều này không có nhiều ủng hộ hơn? Nếu repo thực hiện những gì nó tuyên bố, đây sẽ là câu trả lời được chọn.
lolololol ol

Nó có đối phó với các tác dụng phụ trong các chức năng, btw? Thậm chí có thể giải quyết vấn đề này?
lolololol ol

5

Một thay thế cho các bài kiểm tra đơn vị, cũng được giới thiệu trong Làm việc hiệu quả với mã kế thừa là các bài kiểm tra đặc tính . Tôi đã có kết quả thú vị với các bài kiểm tra như vậy. Chúng dễ thiết lập hơn các bài kiểm tra đơn vị khi bạn kiểm tra từ điểm hơn có thể được kiểm tra (được gọi là đường may). Hạn chế là khi kiểm tra không thành công, bạn có ít gợi ý hơn về vị trí của vấn đề vì khu vực được kiểm tra có thể lớn hơn nhiều so với kiểm tra đơn vị. Ghi nhật ký giúp ở đây.


Một khung kiểm thử đơn vị như họ xUnit có thể được sử dụng để viết các bài kiểm tra đặc tính.

Trong các bài kiểm tra như vậy, được viết sau các dữ kiện, xác nhận xác minh hành vi hiện tại của mã. Không giống như các bài kiểm tra đơn vị, chúng không chứng minh rằng mã là đúng, chúng chỉ ghim lại (mô tả đặc điểm) hành vi hiện tại của mã.

Quá trình này tương tự như TDD,:

  • viết một bài kiểm tra cho một phần mã
  • thực thi nó - thất bại
  • sửa lỗi kiểm tra từ hành vi quan sát được của mã
  • thực hiện nó - vượt qua
  • nói lại

Các bài kiểm tra sẽ không thành công nếu bạn sửa đổi hành vi bên ngoài của mã. Hành vi bên ngoài của mã? âm thanh quen thuộc ? Vâng, đúng rồi, chúng tôi đây. Bây giờ bạn có thể cấu trúc lại mã.

Rõ ràng rủi ro phụ thuộc vào phạm vi của các thử nghiệm mô tả đặc tính.


5

Hãy xem thư viện tiện ích kiểm tra đơn vị mã nguồn mở miễn phí, ApprovalTests . Nếu bạn là nhà phát triển .NET, người sáng tạo, Llewellyn Falco, đã thực hiện một loạt video cho thấy cách anh ấy sử dụng ApprovalTests để cải thiện kiểm tra đơn vị cho cả mã mới và mã cũ.


4

Nếu bạn đang lên kế hoạch cấu trúc lại mã kế thừa thì việc tạo các bài kiểm tra đơn vị đó là điều bắt buộc. Đừng lo lắng về việc chế nhạo hoặc khai báo - hãy lo lắng về việc kiểm tra các đầu vào và đầu ra của hệ thống để các thay đổi hoặc nỗ lực tái cấu trúc của bạn không phá vỡ chức năng hiện tại.

Tôi sẽ không nói dối bạn, việc trang bị thêm các bài kiểm tra đơn vị cho mã kế thừa là rất khó - nhưng nó rất đáng giá.


Tôi đã bắt đầu tạo các bài kiểm tra đơn vị cho mã kế thừa mà tôi đang làm việc. Tuy nhiên, tôi nhận ra rằng tôi đã viết các bài kiểm tra tích hợp, không phải bài kiểm tra đơn vị vì tôi tạo dữ liệu thực tế và tôi chèn chúng vào cơ sở dữ liệu. Tôi không thấy cách nào để tạo mô phỏng và sơ khai thuần túy cho mã kế thừa này vì nó không được cấu trúc để thử nghiệm.
Vin Shahrdar

1

Tôi đã nói một thời gian trước về ý tưởng về Kim tự tháp kiểm tra đảo ngược trong mã kế thừa tại XPDays http://xpdays.com.ua/archive/xp-days-ukraine-2012/materials/legacy-code/

Phần trình bày này sẽ trả lời câu hỏi tại sao đôi khi việc bắt đầu với tích hợp / chức năng hoặc thậm chí kiểm tra chấp nhận cấp cao lại quan trọng khi làm việc với mã kế thừa. Và sau đó từ từ, từng bước giới thiệu các bài kiểm tra đơn vị. Không có ví dụ về mã - xin lỗi, nhưng bạn có thể tìm thấy một loạt chúng trong cuốn sách Michaels Feathers "Làm việc hiệu quả với Legacy Code".

Ngoài ra, bạn có thể kiểm tra Legacy Code Retreat http://www.jbrains.ca/legacy-code-retreat và tìm cuộc họp đó trong khu vực 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.