2009-02-06 47 views
11

Chỉ đọc bốn chương đầu tiên của Refactoring: Improving the Design of Existing Code, tôi bắt tay vào việc tái cấu trúc đầu tiên và gần như ngay lập tức đến một rào cản. Nó bắt nguồn từ yêu cầu mà trước khi bạn bắt đầu tái cấu trúc, bạn nên đặt các xét nghiệm đơn vị xung quanh mã kế thừa. Điều đó cho phép bạn chắc chắn rằng việc tái cấu trúc của bạn không thay đổi mã ban đầu đã làm (chỉ cách nó đã thực hiện).Tái cấu trúc thực tế bằng cách sử dụng các bài kiểm tra đơn vị

Vì vậy, câu hỏi đầu tiên của tôi là: làm cách nào để thử nghiệm đơn vị một phương pháp trong mã cũ? Làm thế nào tôi có thể đặt một thử nghiệm đơn vị xung quanh một dòng 500 (nếu tôi may mắn) phương pháp mà không chỉ làm một nhiệm vụ? Dường như với tôi rằng tôi sẽ phải tái cấu trúc mã di sản của mình chỉ để làm cho nó có thể kiểm chứng được.

Có ai có bất kỳ hoạt động tái cấu trúc trải nghiệm nào bằng các thử nghiệm đơn vị không? Và, nếu có, bạn có bất kỳ ví dụ thực tế nào mà bạn có thể chia sẻ với tôi không?

Câu hỏi thứ hai của tôi hơi khó giải thích. Đây là một ví dụ: Tôi muốn cấu trúc lại một phương thức kế thừa để điền một đối tượng từ một bản ghi cơ sở dữ liệu. Tôi sẽ không phải viết một bài kiểm tra đơn vị so sánh một đối tượng được lấy ra bằng cách sử dụng phương pháp cũ, với một đối tượng được lấy ra bằng cách sử dụng phương pháp được cấu trúc lại của tôi? Nếu không, làm thế nào tôi biết rằng phương pháp tái cấu trúc của tôi tạo ra kết quả tương tự như phương pháp cũ? Nếu điều đó là đúng, thì tôi phải rời khỏi phương pháp cũ không được chấp nhận trong mã nguồn trong bao lâu? Tôi chỉ cần giật mình sau khi tôi kiểm tra một vài hồ sơ khác nhau? Hoặc, tôi có cần phải giữ nó trong một thời gian trong trường hợp tôi gặp phải một lỗi trong mã được cấu trúc lại của tôi không?

Cuối cùng, vì một vài người đã hỏi ... mã di sản ban đầu được viết bằng VB6 và sau đó được chuyển đến VB.NET với những thay đổi kiến ​​trúc tối thiểu.

+0

Câu hỏi hay. Bạn cũng có thể thử Katas, giúp bạn tạo thói quen viết mã tốt và cách bạn có thể viết mã kiểm tra đơn vị: https://github.com/garora/TDD-Katas –

Trả lời

4

Ví dụ tốt về thực tế cuộc họp lý thuyết. Các bài kiểm tra đơn vị có nghĩa là để kiểm tra một hoạt động đơn lẻ và nhiều người theo chủ nghĩa thuần túy mô hình nhấn mạnh vào Single Responsibilty, vì vậy chúng tôi có mã sạch và kiểm tra đáng yêu để đi cùng với nó. Tuy nhiên, trong thế giới thực (lộn xộn), mã (đặc biệt là mã kế thừa) thực hiện rất nhiều thứ và không có kiểm tra. Điều này cần là liều tái cấu trúc để làm sạch mớ hỗn độn.

Cách tiếp cận của tôi là xây dựng các thử nghiệm, sử dụng các công cụ Kiểm tra đơn vị, kiểm tra nhiều thứ trong một thử nghiệm. Trong một thử nghiệm, tôi có thể kiểm tra kết nối DB đang mở, thay đổi nhiều dữ liệu và thực hiện kiểm tra trước/sau trên DB. Tôi chắc chắn tìm thấy bản thân mình viết các lớp trợ giúp để kiểm tra, và thường xuyên hơn những người trợ giúp sau đó có thể được thêm vào cơ sở mã, vì chúng đã đóng gói các hành vi/logic/yêu cầu khẩn cấp. Tôi không có nghĩa là tôi có một thử nghiệm lớn duy nhất, điều tôi làm có nghĩa là các bài kiểm tra mnay đang làm công việc mà một người thuần túy sẽ gọi là kiểm thử tích hợp - điều đó vẫn còn tồn tại? Ngoài ra tôi thấy hữu ích khi tạo mẫu thử và sau đó tạo nhiều thử nghiệm từ đó, để kiểm tra điều kiện biên, xử lý phức tạp, v.v.

BTW mà chúng ta đang nói về môi trường ngôn ngữ nào? Một số ngôn ngữ cho vay để tái cấu trúc tốt hơn các ngôn ngữ khác.

+0

Tôi thường thấy mình đang tranh luận về sự thỏa hiệp về mặt thực dụng của một cuộc thảo luận thuần túy như thế này. Có lẽ tôi chỉ mới già đi và không có cuộc chiến trong tôi để lãnh đạo phí thuần túy nữa. ;) – JMD

+0

@ JMD.Đơn giản hơn, kiểm tra đơn vị duy nhất có ý nghĩa cho việc tái cấu trúc là kiểm tra đơn vị chức năng từ đầu đến cuối với sự phụ thuộc tối thiểu vào cấu trúc bên trong. Đồng thời không ai nói về nó. Tôi đoán là có một quá trình tái cấu trúc rất ít xảy ra: mã hiện tại quá tệ đến nỗi trong hầu hết các trường hợp, việc tái cấu trúc được thực hiện bằng cách thay thế các đơn vị chức năng. – zzz777

0

Đó thực sự là một trong những vấn đề chính của việc cố gắng tái trang mã cũ. Bạn có thể phá vỡ miền vấn đề xuống một cái gì đó chi tiết hơn? Liệu phương pháp 500+ line đó có tạo ra bất kỳ điều gì khác ngoài các lời gọi hệ thống tới các JAR/JD/các assembly của JDK/Win32/.NET không? I E. Có các cuộc gọi hàm chi tiết hơn trong phạm vi 500+ dòng mà bạn có thể kiểm tra đơn vị không?

+0

Thật vậy, có nhiều chức năng chi tiết hơn nhưng cách thế nào tôi có thể kiểm tra đơn vị mà không cần phải tái cấu trúc mã kế thừa trước để trích xuất các phương thức chi tiết hơn? –

+0

Đó là câu hỏi $ 64,000. Và đôi khi câu trả lời là một sự thỏa hiệp. Bạn muốn phấn đấu cho việc tái cấu trúc hoàn hảo, nhưng đôi khi bạn phải viết những bài kiểm tra đơn vị nào bạn có thể/trong khi/bạn đang cải thiện mã kế thừa. Ít nhất đó là kinh nghiệm của tôi. – JMD

1

Từ kinh nghiệm của tôi, tôi sẽ viết các bài kiểm tra không cho các phương pháp cụ thể trong mã kế thừa, nhưng đối với chức năng tổng thể mà nó cung cấp. Những thứ này có thể hoặc không thể ánh xạ chặt chẽ với các phương thức hiện có.

1

Viết các bài kiểm tra ở mức bao giờ của hệ thống bạn có thể (nếu bạn có thể), nếu điều đó có nghĩa là chạy một cơ sở dữ liệu, vv thì hãy làm như vậy.Bạn sẽ cần phải viết nhiều mã hơn để khẳng định mã hiện đang làm như một phương thức 500 dòng + sẽ có thể có rất nhiều hành vi được bao bọc trong nó. Đối với việc so sánh cũ so với mới, nếu bạn viết các bài kiểm tra chống lại mã cũ, họ vượt qua và họ bao gồm tất cả mọi thứ nó làm sau đó khi bạn chạy chúng chống lại mã mới bạn đang kiểm tra hiệu quả cũ chống lại mới. Tôi đã làm điều này để kiểm tra một bộ kích hoạt sql phức tạp mà tôi muốn cấu trúc lại, đó là một nỗi đau và mất thời gian nhưng một tháng sau khi chúng tôi tìm thấy một vấn đề khác trong khu vực đó.

9

Để biết hướng dẫn về cách cấu trúc lại mã cũ, bạn có thể muốn đọc sách Working Effectively with Legacy Code. Ngoài ra còn có một phiên bản PDF ngắn có sẵn here.

+0

Tuyệt vời để có liên kết tới PDF - công việc tuyệt vời! – MarkJ

+0

+1 Cuốn sách này trả lời chính xác câu hỏi. –

1

Theo kinh nghiệm của tôi, đây là thực tế khi làm việc trên mã Legacy. Sách (Làm việc với Di sản ..) được đề cập bởi Esko là một tác phẩm tuyệt vời mô tả các cách tiếp cận khác nhau có thể đưa bạn đến đó.

Tôi đã thấy các sự cố tương tự với bản thân kiểm tra đơn vị đã phát triển để trở thành thử nghiệm hệ thống/chức năng. Điều quan trọng nhất để phát triển các thử nghiệm cho Legacy hoặc mã hiện có là xác định thuật ngữ "unit". Nó có thể là đơn vị chức năng như "đọc từ cơ sở dữ liệu" vv. Xác định các đơn vị chức năng quan trọng và duy trì các bài kiểm tra bổ sung giá trị.

Ngoài ra, đã có một cuộc nói chuyện gần đây giữa Joel S. và Martin F. về TDD/bài kiểm tra đơn vị. Việc tôi làm là điều quan trọng là xác định đơn vị và tập trung vào nó! URL: Open Letter, Joel's transcriptpodcast

0

Cuốn sách sau đây: The Art of Unit Testing chứa một vài chương có một số ý tưởng thú vị về cách xử lý mã cũ trong việc phát triển Bài kiểm tra đơn vị.

Tôi thấy nó khá hữu ích.

Các vấn đề liên quan