Làm thế nào để cải thiện mạnh mẽ phạm vi bảo hiểm mã?


21

Tôi được giao nhiệm vụ nhận một ứng dụng kế thừa theo bài kiểm tra đơn vị. Trước tiên, một số thông tin cơ bản về ứng dụng: Đó là cơ sở mã RCP 600 nghìn LỘC với những vấn đề lớn này

  • sao chép mã lớn
  • không đóng gói, hầu hết dữ liệu riêng tư có thể truy cập được từ bên ngoài, một số dữ liệu kinh doanh cũng tạo ra các singletons để nó không chỉ có thể thay đổi từ bên ngoài mà còn từ mọi nơi.
  • không trừu tượng (ví dụ: không có mô hình kinh doanh, dữ liệu kinh doanh được lưu trữ trong Object [] và double [] []), do đó không có OO.

Có một bộ kiểm tra hồi quy tốt và một nhóm QA hiệu quả đang kiểm tra và tìm lỗi. Tôi biết các kỹ thuật làm thế nào để kiểm tra nó từ những cuốn sách kinh điển, ví dụ Michael Feathers, nhưng điều đó quá chậm. Vì có một hệ thống kiểm tra hồi quy làm việc, tôi không ngại tích cực tái cấu trúc hệ thống để cho phép các bài kiểm tra đơn vị được viết.

Tôi nên bắt đầu tấn công vấn đề như thế nào để nhanh chóng nhận được một số bảo hiểm , vì vậy tôi có thể hiển thị tiến trình cho quản lý (và trên thực tế để bắt đầu kiếm tiền từ mạng lưới an toàn của các bài kiểm tra JUnit)? Tôi không muốn sử dụng các công cụ để tạo các bộ kiểm tra hồi quy, ví dụ AgitarOne, vì các thử nghiệm này không kiểm tra xem có gì chính xác không.


Tại sao không tự động tạo các bài kiểm tra hồi quy và xác minh từng bài một? Phải nhanh hơn viết tất cả bằng tay.
Robert Harvey

Nghe có vẻ hơi buồn cười khi gọi bất cứ điều gì được viết bằng di sản Java, nhưng đồng ý, đó chắc chắn là di sản. Bạn đề cập rằng bạn không ngại cấu trúc lại hệ thống để cho phép các bài kiểm tra đơn vị được viết, nhưng bạn không nên viết các bài kiểm tra đơn vị trên hệ thống như trước khi thực hiện bất kỳ phép tái cấu trúc nào? Sau đó, tái cấu trúc của bạn có thể được chạy qua các bài kiểm tra đơn vị tương tự để đảm bảo không có gì bị phá vỡ?
dodgy_coder

1
@dodgy_coder Thường đồng ý, nhưng tôi hy vọng QA truyền thống hoạt động hiệu quả sẽ giúp tôi an toàn một thời gian.
Peter Kofler

1
@dodgy_coder Michael C. Feathers, tác giả của Work Performanceively with Legacy code định nghĩa mã Legacy là "mã không có kiểm tra". Nó phục vụ như một định nghĩa hữu ích.
Người sử dụng Stuper

Câu trả lời:


10

Tôi tin rằng có hai trục chính dọc theo mã nào có thể được đặt khi giới thiệu các bài kiểm tra đơn vị: A) mã có thể kiểm tra được như thế nào? và B) nó ổn định như thế nào (nghĩa là nó cần khẩn cấp như thế nào)? Chỉ nhìn vào các thái cực, điều này mang lại 4 loại:

  1. Mã dễ kiểm tra và dễ vỡ
  2. Mã dễ kiểm tra và ổn định
  3. Mã khó kiểm tra và dễ vỡ
  4. Mã khó kiểm tra và ổn định

Loại 1 là nơi rõ ràng để bắt đầu, nơi bạn có thể nhận được nhiều lợi ích với công việc tương đối ít. Loại 2 cho phép bạn nhanh chóng cải thiện thống kê bảo hiểm (tốt cho tinh thần) và có thêm kinh nghiệm với codebase, trong khi loại 3 hoạt động nhiều hơn (thường gây khó chịu) nhưng cũng mang lại nhiều lợi ích hơn. Việc bạn nên làm trước tiên phụ thuộc vào mức độ quan trọng của tinh thần và thống kê bảo hiểm đối với bạn. Loại 4 có lẽ không đáng bận tâm.


Xuất sắc. Tôi có một ý tưởng làm thế nào để xác định xem có dễ kiểm tra bằng phân tích tĩnh hay không, ví dụ: số lượng phụ thuộc / Testability Explorer. Nhưng làm thế nào tôi có thể xác định nếu mã là giòn? Tôi không thể ghép các khuyết điểm với các đơn vị cụ thể (ví dụ: các lớp) và nếu đó là số 3 của khóa học (các lớp thần / singletons). Vì vậy, có thể số lượng checkin (các điểm nóng)?
Peter Kofler

1
@Peter Kofler: cam kết các điểm nóng là một ý tưởng tốt, nhưng nguồn kiến ​​thức quý giá nhất này sẽ là các nhà phát triển đã làm việc với mã.
Michael Borgwardt

1
@Peter - như Michael đã nói, các nhà phát triển đã làm việc với mã. Bất cứ ai đã làm việc với một cơ sở mã hóa lớn trong một khoảng thời gian hợp lý sẽ biết phần nào của nó có mùi. Hoặc, nếu toàn bộ mùi, phần nào của nó thực sự bốc mùi .
Carson63000

15

Tôi có nhiều kinh nghiệm làm việc trên các hệ thống cũ (không phải Java), lớn hơn nhiều so với điều này. Tôi ghét phải là người mang tin xấu, vấn đề của bạn là vấn đề của bạn. Tôi nghi ngờ bạn đã đánh giá thấp nó.

Thêm kiểm tra hồi quy vào mã kế thừa là một quá trình chậm, tốn kém. Nhiều yêu cầu không được ghi chép rõ ràng - một bản sửa lỗi ở đây, một bản vá ở đó và trước khi bạn biết, phần mềm xác định hành vi của chính nó. Không có các thử nghiệm có nghĩa là việc triển khai là tất cả phải thực hiện, không có thử nghiệm nào để "thách thức" các yêu cầu ngầm được thực hiện trong mã.

Nếu bạn cố gắng để có được bảo hiểm một cách nhanh chóng, có khả năng bạn sẽ gấp rút hoàn thành công việc, một nửa nướng nó và thất bại. Các bài kiểm tra sẽ đưa ra một phần bảo hiểm của các công cụ rõ ràng, và không có phạm vi bảo hiểm của các vấn đề thực sự. Bạn sẽ thuyết phục chính những người quản lý mà bạn đang cố gắng bán cho Đơn vị kiểm tra đó là không xứng đáng, đó chỉ là một viên đạn bạc khác không hoạt động.

IMHO, Cách tiếp cận tốt nhất là nhắm mục tiêu bạn thử nghiệm. Sử dụng các số liệu, cảm giác ruột và báo cáo nhật ký lỗi để xác định 1% hoặc 10% mã tạo ra nhiều vấn đề nhất. Nhấn mạnh các mô-đun này, và bỏ qua phần còn lại. Đừng cố làm quá nhiều, ít hơn là nhiều.

Một mục tiêu thực tế là "Kể từ khi chúng tôi triển khai UT, việc chèn khiếm khuyết vào các mô-đun đang thử nghiệm đã giảm xuống x% so với những người không thuộc UT" (lý tưởng x là một số <100).


+1, bạn không thể đơn vị kiểm tra một cái gì đó hiệu quả mà không có tiêu chuẩn mạnh hơn để đi qua mã.
dan_waterworth

Tôi biết và tôi đồng ý. Sự khác biệt là chúng tôi đã kiểm tra, kiểm tra hồi quy truyền thống bằng cách làm việc QA tại chỗ, do đó có một số loại lưới an toàn. Thứ hai tôi rất ủng hộ các bài kiểm tra đơn vị, vì vậy nó chắc chắn sẽ không phải là một điều không hoạt động. Một điểm tốt về những gì để nhắm mục tiêu đầu tiên. Cảm ơn.
Peter Kofler

1
và đừng quên rằng chỉ nhắm đến "bảo hiểm" sẽ không cải thiện chất lượng vì bạn sẽ bị mắc kẹt trong một loạt các thử nghiệm không hoàn hảo và tầm thường (và các thử nghiệm cho mã tầm thường không cần thử nghiệm rõ ràng, nhưng được thêm vào chỉ để tăng phạm vi bảo hiểm). Bạn sẽ kết thúc việc tạo các thử nghiệm để làm hài lòng công cụ bảo hiểm, không phải vì chúng hữu ích và có thể sẽ tự thay đổi mã để tăng phạm vi kiểm tra mà không cần viết thử nghiệm (như cắt bỏ nhận xét và định nghĩa biến, một số công cụ bảo hiểm sẽ gọi mã không được phát hiện).
jwenting

2

Tôi nhắc nhở về câu nói đó về việc không lo lắng về cửa chuồng khi con ngựa đã chốt.

Thực tế là thực sự không có cách nào hiệu quả về chi phí để có được phạm vi kiểm tra tốt cho một hệ thống cũ, chắc chắn không phải trong một khung thời gian ngắn. Như MattNz đã đề cập, đây sẽ là một quá trình rất tốn thời gian và cuối cùng rất tốn kém. Chú ruột của tôi nói với tôi rằng nếu bạn cố gắng làm điều gì đó để gây ấn tượng với quản lý, bạn có thể sẽ tạo ra một cơn ác mộng bảo trì mới vì cố gắng thể hiện quá nhiều quá nhanh, mà không hiểu đầy đủ các yêu cầu mà bạn đang cố gắng kiểm tra.

Trên thực tế, một khi bạn đã viết mã, sẽ rất muộn để viết các bài kiểm tra một cách hiệu quả mà không có nguy cơ bỏ lỡ điều gì quan trọng. Mặt khác, bạn có thể nói rằng một số thử nghiệm tốt hơn so với không có thử nghiệm nào, nhưng nếu đó là trường hợp, bản thân các thử nghiệm cần chứng minh rằng chúng bổ sung giá trị cho toàn bộ hệ thống.

Đề nghị của tôi sẽ là nhìn vào những lĩnh vực quan trọng mà bạn cảm thấy có gì đó bị "hỏng". Điều đó có nghĩa là nó có thể là mã không hiệu quả khủng khiếp, hoặc bạn có thể chứng minh rằng trước đây rất tốn kém để duy trì. Ghi lại các vấn đề, sau đó sử dụng điều này như một điểm khởi đầu để giới thiệu một mức độ thử nghiệm giúp bạn cải thiện hệ thống, mà không bắt tay vào một nỗ lực tái thiết kế lớn. Ý tưởng ở đây là để tránh chơi bắt kịp với các bài kiểm tra, và thay vào đó giới thiệu các bài kiểm tra để giúp bạn giải quyết các vấn đề cụ thể. Sau một khoảng thời gian, hãy xem liệu bạn có thể đo lường và phân biệt giữa chi phí trước đó để duy trì phần mã đó không và những nỗ lực hiện tại với các bản sửa lỗi bạn đã áp dụng với các thử nghiệm hỗ trợ của chúng.

Điều cần nhớ là quản lý quan tâm nhiều hơn đến chi phí / lợi ích và cách điều đó ảnh hưởng trực tiếp đến khách hàng của họ và cuối cùng là ngân sách của họ. Họ không bao giờ quan tâm đến việc làm một cái gì đó đơn giản bởi vì đó là điều tốt nhất để làm trừ khi bạn có thể chứng minh rằng nó sẽ cung cấp cho họ một lợi ích mà họ quan tâm. Nếu bạn có thể cho thấy rằng bạn đang cải thiện hệ thống và có được phạm vi kiểm tra tốt cho công việc bạn đang làm, thì ban quản lý có nhiều khả năng xem đây là một ứng dụng hiệu quả cho những nỗ lực của bạn. Điều này có thể cho phép bạn tranh luận về trường hợp mở rộng nỗ lực của mình sang các lĩnh vực quan trọng khác, mà không yêu cầu đóng băng hoàn toàn sự phát triển của sản phẩm, hoặc thậm chí tệ hơn là không thể tranh luận để viết lại!


1

Một cách để cải thiện phạm vi bảo hiểm là viết thêm các bài kiểm tra.

Một cách khác là giảm sự dư thừa trong mã của bạn, theo cách mà các thử nghiệm hiện tại có hiệu lực bao gồm mã dự phòng hiện không được bảo hiểm.

Hãy tưởng tượng bạn có 3 khối mã, a, b và b ', trong đó b' là bản sao (chính xác hoặc gần bỏ lỡ) của B và bạn có phạm vi bảo hiểm trên a và b nhưng không phải b 'với thử nghiệm T.

Nếu tái cấu trúc cơ sở mã để loại bỏ b 'bằng cách trích xuất điểm chung từ b và b' là B, thì cơ sở mã bây giờ trông giống như a, b0, B, b'0, với b0 chứa mã không được mã hóa với b'0 và ngược lại ngược lại, và cả b0 và b'0 đều nhỏ hơn B rất nhiều và gọi / sử dụng B.

Bây giờ chức năng của chương trình đã không thay đổi và cũng không có thử nghiệm T, vì vậy chúng tôi có thể chạy lại T và hy vọng nó sẽ vượt qua. Mã hiện được bảo hiểm là a, b0 và B, nhưng không phải là b'0. Cơ sở mã đã nhỏ hơn (b'0 nhỏ hơn b '!) Và chúng tôi vẫn bao gồm những gì chúng tôi đề cập ban đầu. Tỷ lệ bảo hiểm của chúng tôi đã tăng lên.

Để làm điều này, bạn cần tìm b, b 'và lý tưởng là B để cho phép tái cấu trúc. Công cụ CloneDR của chúng tôi có thể làm điều này cho nhiều ngôn ngữ, đặc biệt là Java. Bạn nói rằng cơ sở mã của bạn có rất nhiều mã trùng lặp; đây có thể là một cách tốt để giải quyết nó vì lợi ích của bạn.

Điều kỳ lạ là hành động tìm b và b 'thường làm tăng vốn từ vựng của bạn về những ý tưởng trừu tượng mà chương trình thực hiện. Mặc dù công cụ không biết b và b 'làm gì, nhưng chính hành động cô lập chúng khỏi mã, cho phép tập trung đơn giản vào nội dung của b và b', thường cung cấp cho các lập trình viên một ý tưởng rất hay về việc trừu tượng hóa B_abab thực hiện mã nhân bản . Vì vậy, điều này cải thiện sự hiểu biết của bạn về mã, quá. Hãy chắc chắn rằng bạn đặt cho B một cái tên hay khi bạn bỏ nó và bạn sẽ có được phạm vi kiểm tra tốt hơn và một chương trình dễ bảo trì hơ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.