Viết bài kiểm tra mã mà mục đích tôi không hiểu


59

Gần đây tôi đã hoàn thành một tái cấu trúc hộp đen. Tôi không thể kiểm tra nó, vì tôi không thể tìm ra cách kiểm tra nó.

Ở mức cao, tôi có một lớp có khởi tạo liên quan đến việc lấy các giá trị từ một số lớp B. Nếu lớp B là "trống", nó tạo ra một số mặc định hợp lý. Tôi đã trích xuất phần này cho một phương thức khởi tạo lớp B cho cùng các giá trị mặc định đó.

Tôi vẫn chưa tìm ra mục đích / bối cảnh của một trong hai lớp, hoặc cách chúng sẽ được sử dụng. Vì vậy, tôi không thể khởi tạo đối tượng từ một lớp B trống và kiểm tra xem nó có đúng giá trị / thực hiện đúng không.

Ý tưởng tốt nhất của tôi là chạy mã gốc, mã cứng trong kết quả của các phương thức công khai tùy thuộc vào các thành viên được khởi tạo và kiểm tra mã mới dựa vào đó. Tôi không thể nói rõ tại sao tôi cảm thấy mơ hồ khó chịu với ý tưởng này.

Có một cuộc tấn công tốt hơn ở đây?


28
Tôi cảm thấy như bạn đã bắt đầu sai. Trước tiên bạn nên hiểu mã, sau đó kiểm tra nó, sau đó cấu trúc lại. Tại sao bạn tái cấu trúc mà không biết mã này để làm gì?
Jacob Raihle

11
@JacobRaihle Đây là một chương trình khá chuyên biệt dành cho những người có bằng cấp về những thứ tôi chưa từng chạm tới. Tôi đang chọn bối cảnh khi tôi đi, nhưng đơn giản là không thực tế để chờ đợi để có một sự hiểu biết vững chắc trước khi tôi bắt đầu.
JETM

4
Điều không thực tế là viết lại mọi thứ và, khi những thay đổi đang được sản xuất, khám phá lý do tại sao bạn không nên có. Nếu trước đó bạn sẽ có thể kiểm tra kỹ lưỡng , tốt thôi, đây có thể là một cách tốt để tìm hiểu cơ sở mã. Nếu không, bắt buộc bạn phải hiểu trước khi thay đổi.
Jacob Raihle

37
Có một loại thử nghiệm cụ thể gọi là Thử nghiệm đặc tính khi bạn muốn kiểm tra hành vi thực tế của hệ thống. Bạn chỉ cần lấy hệ thống ban đầu của mình, sau đó thêm các bài kiểm tra để khẳng định bất cứ điều gì nó thực sự làm (và không nhất thiết là những gì đã được dự định làm!). Chúng phục vụ như một giàn giáo xung quanh hệ thống của bạn, mà bạn có thể sửa đổi một cách an toàn vì bạn có thể đảm bảo nó giữ lại hành vi của nó.
Vincent Savard

3
Bạn không thể yêu cầu / cho nó xem xét bởi một người không hiểu nó?
pjc50

Câu trả lời:


122

Bạn đang làm tốt!

Tạo các bài kiểm tra hồi quy tự động thường là điều tốt nhất bạn có thể làm để tạo thành một cấu trúc lại thành phần. Nó có thể gây ngạc nhiên, nhưng các bài kiểm tra như vậy thường có thể được viết mà không có sự hiểu biết đầy đủ về những gì thành phần thực hiện bên trong, miễn là bạn hiểu "giao diện" đầu vào và đầu ra (theo nghĩa chung của từ đó). Chúng tôi đã làm điều này nhiều lần trong quá khứ cho các ứng dụng kế thừa toàn diện, không chỉ các lớp học và nó thường giúp chúng tôi tránh phá vỡ những điều mà chúng tôi không hiểu đầy đủ.

Tuy nhiên, bạn nên có đủ dữ liệu kiểm tra và đảm bảo rằng bạn hiểu rõ phần mềm làm gì từ quan điểm của người dùng thành phần đó, nếu không bạn có nguy cơ bỏ qua các trường hợp kiểm tra quan trọng.

IMHO là một ý tưởng tốt để thực hiện các thử nghiệm tự động của bạn trước khi bạn bắt đầu tái cấu trúc, không phải sau đó, vì vậy bạn có thể thực hiện tái cấu trúc theo các bước nhỏ và xác minh từng bước. Việc tái cấu trúc chính nó sẽ làm cho mã dễ đọc hơn, vì vậy nó giúp bạn tăng sự hiểu biết của mình về các phần bên trong từng chút một. Vì vậy, các bước đặt hàng trong quá trình này là

  1. hiểu mã "từ bên ngoài",
  2. viết bài kiểm tra hồi quy,
  3. refactor, dẫn đến sự hiểu biết tốt hơn về các phần bên trong của mã

21
Câu trả lời hoàn hảo, cũng chính xác như được mô tả trong cuốn sách "Làm việc với Bộ luật kế thừa"
Altoyr

Tôi đã phải làm một cái gì đó như thế này một lần. Thu thập dữ liệu đầu ra điển hình từ ứng dụng trước khi tôi sửa đổi nó, sau đó kiểm tra phiên bản mới của ứng dụng bằng cách chạy cùng dữ liệu thử nghiệm thông qua nó. 30 năm trước ... Fortran ... Đó là một loại xử lý hình ảnh / ánh xạ, vì vậy tôi thực sự không thể biết đầu ra 'nên' bằng cách nhìn vào nó hoặc viết các trường hợp thử nghiệm. Và, tôi đã làm điều đó trên màn hình vector Tektronix (liên tục). Chính phủ làm việc ... 2 Teletypes đập phía sau tôi.

4
Người ta có thể thêm, bạn vẫn có thể viết các bài kiểm tra cho mã cũ sau khi thực tế. Sau đó, bạn có thể thử chúng trên phiên bản tái cấu trúc của mình và nếu nó bị hỏng, hãy thực hiện tìm kiếm chia đôi thông qua lịch sử cam kết của bạn để tìm điểm bắt đầu phá vỡ.
CodeMonkey

2
Tôi khuyên bạn nên làm một điều nữa. Trong khi thu thập dữ liệu thử nghiệm, thu thập số liệu thống kê bảo hiểm mã nếu có thể. Bạn sẽ biết dữ liệu thử nghiệm của bạn mô tả mã được đề cập tốt như thế nào.
liori

2
@nocomprende, Thật buồn cười là tôi đã làm điều đó chính xác với một mã fortran 77 khoa học di sản vào tuần trước. Thêm in dữ liệu ascii vào một tệp, thiết lập các thư mục kiểm tra với đầu vào và đầu ra dự kiến, và trường hợp thử nghiệm của tôi chỉ là một khác biệt của hai bộ đầu ra. Nếu họ không khớp nhân vật cho nhân vật, tôi đã phá vỡ một cái gì đó. Khi mã chủ yếu là hai chương trình con mỗi Lok 2-3k, bạn phải bắt đầu ở đâu đó.
Godric Seer

1

Một lý do quan trọng để viết bài kiểm tra đơn vị là chúng bằng cách nào đó ghi lại API thành phần. Không hiểu mục đích của mã đang thử nghiệm thực sự là một vấn đề ở đây. Phạm vi bảo hiểm mã là một mục tiêu quan trọng khác, khó đạt được mà không biết nhánh thực thi nào tồn tại và chúng được kích hoạt như thế nào.

Tuy nhiên, nếu có thể thiết lập lại trạng thái sạch sẽ (hoặc xây dựng đối tượng thử nghiệm mới mỗi lần), người ta có thể viết các thử nghiệm loại "rác trong thùng rác" chỉ cung cấp chủ yếu đầu vào ngẫu nhiên cho hệ thống và quan sát đầu ra.

Các xét nghiệm như vậy rất khó để duy trì, vì khi chúng thất bại, có thể phức tạp để nói tại sao và mức độ nghiêm trọng của nó. Phạm vi bảo hiểm có thể là nghi vấn. Tuy nhiên họ vẫn tốt hơn nhiều so với không có gì. Khi thử nghiệm như vậy thất bại, nhà phát triển có thể sửa đổi các thay đổi mới nhất với sự chú ý nhiều hơn và hy vọng phát hiện ra lỗi ở đó.


1
Bất kỳ loại thông tin là tốt hơn so với bay mù. Tôi đã sử dụng để xác định vị trí lỗi trong các chương trình máy chủ đang sản xuất bằng cách gọi trình gỡ lỗi trên tệp kết xuất sự cố (Unix) và yêu cầu theo dõi ngăn xếp. Nó cho tôi tên của hàm nơi xảy ra lỗi. Ngay cả khi không có kiến ​​thức nào khác (tôi không biết cách sử dụng trình gỡ lỗi này), nó sẽ giúp ích trong trường hợp bí ẩn và không thể giải quyết được.
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.