Làm cách nào để viết bài kiểm tra đơn vị cho mã kế thừa (mà tôi không hiểu)?


8

Ở đằng trước

Tôi đã đọc rất nhiều điều trước khi đặt câu hỏi này, bao gồm nhiều câu hỏi có liên quan ngay tại đây trên SE:

Tuy nhiên, tôi không thể không cảm thấy rằng vết ngứa vẫn chưa được gãi sau khi đọc để được giúp đỡ.


TL; DR

Làm cách nào để viết bài kiểm tra đơn vị cho mã kế thừa mà tôi không thể chạy, mô phỏng, đọc hoặc dễ hiểu? Những bài kiểm tra hồi quy nào hữu ích cho một thành phần có lẽ hoạt động như dự định?


Toàn bộ hình ảnh

Tôi là một thực tập mùa hè trở lại một lần nữa khi tôi đang chuyển sang trường học. Nhiệm vụ của tôi liên quan đến các yêu cầu này:

  1. Đối với một sản phẩm cụ thể, hãy đánh giá xem nhóm phần mềm của chúng tôi có thể nâng cấp phiên bản IDE và JUnit của họ mà không mất khả năng tương thích với các dự án hiện tại của họ hay không.
  2. Phát triển các thử nghiệm đơn vị cho một số thành phần trong mã Java hiện có (phần lớn không phải là Java). Chúng tôi muốn thuyết phục nhóm phần mềm rằng thử nghiệm đơn vị và TDD là những công cụ vô giá mà họ nên sử dụng. (Hiện tại bảo hiểm mã 0%.)
  3. Bằng cách nào đó, kết thúc những ngày cao bồi mã hóa cho một hệ thống quan trọng.

Sau khi có được một bản sao của mã nguồn, tôi đã cố gắng xây dựng và chạy nó, để tôi có thể hiểu sản phẩm này làm gì và nó hoạt động như thế nào. Tôi không thể. Tôi đã hỏi các giám sát viên của mình về cách tôi làm và tôi đã được cấp một máy độc lập mới có khả năng xây dựng nó, bao gồm các tập lệnh xây dựng thực sự làm. Điều đó cũng không hoạt động vì như họ mong đợi, mã sản xuất của họ chỉ chạy trên hệ thống nhúng mà nó được thiết kế cho. Tuy nhiên, họ có một trình giả lập cho mục đích này, vì vậy họ đã lấy được trình giả lập và đưa nó vào máy này cho tôi. Trình mô phỏng cũng không hoạt động. Thay vào đó, cuối cùng tôi đã nhận được bản in GUI cho một màn hình cụ thể. Họ cũng không có nhận xét mã ở bất cứ đâu trong hơn 700.000 Java LỘC, khiến việc nắm bắt nó càng khó hơn. Hơn nữa, có vấn đề đánh giá xem các dự án của họ có tương thích với các IDE mới hơn hay không. Đặc biệt, mã của họ không tải đúng vào phiên bản IDE mà họ sử dụng.

Hàng tồn kho của tôi trông như thế này:

  • NetBeans 8, 9, 10, 11
  • JUnit 4, 5
  • Mã nguồn của họ cho một sản phẩm cụ thể (bao gồm hơn 700.000 Java LỘC)
  • Hầu như không có ý kiến ​​mã (đôi khi là một chữ ký)
  • Không có xét nghiệm hiện có
  • Ảnh vật lý của cửa sổ GUI
  • Một tài liệu thiết kế phần mềm (109 trang.) Không thảo luận về thành phần trong hình

Tôi ít nhất có đủ để viết các bài kiểm tra về mặt lý thuyết có thể thực hiện. Vì vậy, tôi đã thử một bài kiểm tra đơn vị cơ bản trên thành phần nói trên. Tuy nhiên, tôi không thể khởi tạo các đối tượng mà nó có dưới dạng phụ thuộc, bao gồm các mô hình, trình quản lý và kết nối DB. Tôi không có nhiều kinh nghiệm JUnit ngoài thử nghiệm đơn vị cơ bản, vì vậy hãy theo tôi đến phần tiếp theo.


Những gì tôi đã học được từ việc đọc của tôi

  1. Mocking: Nếu tôi viết một bài kiểm tra đơn vị, có thể cần phải có các biến giả cho các phụ thuộc sản xuất mà tôi không thể dễ dàng khởi tạo setUp.
  2. Mọi người ở đây tự do đề xuất cuốn sách "Làm việc hiệu quả với Bộ luật kế thừa" của Michael Feathers.
  3. Kiểm tra hồi quy có lẽ là một nơi tốt để bắt đầu. Tôi không nghĩ rằng tôi có đủ vũ khí để thử kiểm tra tích hợp và kiểm tra hồi quy sẽ cung cấp sự hài lòng tức thì hơn cho nhóm phần mềm của chúng tôi. Tuy nhiên, tôi không có quyền truy cập vào các lỗi đã biết của họ; Nhưng, tôi có thể hỏi.

Và bây giờ là một nỗ lực để nói lên sự không chắc chắn mà tôi vẫn có như một câu hỏi. Về cơ bản, tôi không hiểu cách viết một phần của các bài kiểm tra này. Giả sử tôi không nhận được bất kỳ hướng dẫn nào nữa từ các giám sát viên của mình (có khả năng), nó không chỉ tìm hiểu thành phần này làm gì mà còn quyết định thử nghiệm nào thực sự hữu ích khi thử nghiệm hồi quy.

Là những chuyên gia đã làm việc với các dự án như thế này lâu hơn tôi có, bạn có thể cung cấp bất kỳ hướng dẫn nào về cách viết bài kiểm tra đơn vị trong tình huống này không?


12
How do I write unit tests for legacy code that I can't build, run, simulate, read about, or otherwise understand?- Bạn không thể. Ít nhất bạn phải biết đầu ra dự kiến ​​là gì cho một đầu vào nhất định.
Robert Harvey

1
Bạn đã đọc cuốn sách của Michael Feathers chưa?
Robert Harvey

@RobertHarvey Đó là cường điệu nhẹ. Rõ ràng tôi có thể dành thời gian để đọc mã để hiểu nó, nhưng đó thường là giải pháp cuối cùng cho một cái gì đó quá lớn. Và không, tôi chưa, vì tôi vừa tìm thấy cuốn sách sáng nay.
Joshua Detwiler

Nếu bạn có mã kế thừa mà bạn thậm chí không thể xây dựng, bạn có chắc chắn rằng bạn thậm chí có phiên bản mã phù hợp không? Bạn cần giải quyết vấn đề này trước khi lo lắng về các kiểm tra tự động - mã có phải bạn đang cố gắng xây dựng giống như bất kỳ thứ gì mà người dùng của bạn đang chạy không? Bước đầu tiên trong tất cả những điều này nếu bạn có một hệ thống đang hoạt động và hoạt động sẽ là cố gắng hiểu nó từ quan điểm của người dùng; nó có thể giúp đọc tài liệu người dùng và có thể xem dữ liệu người dùng nếu có thể để cố gắng tìm ra những gì nó làm
Ben Cottrell

2
Nếu dữ liệu cảm biến là rất quan trọng để thực hiện, việc nhạo báng các cảm biến (hoặc bất kể phụ thuộc bên ngoài là gì) có vẻ như là một nơi tốt để bắt đầu.
JimmyJames

Câu trả lời:


10

Theo một xấp xỉ đầu tiên, các bên liên quan của bộ kiểm tra là các nhà phát triển / bảo trì mã. Bạn sẽ cần một chút thời gian của họ. Nhấn mạnh vào điều này.

Hỏi họ về những vấn đề họ đang gặp phải.
Hỏi họ về các lỗi họ đã sửa gần đây (trong vài năm qua, giả sử đây là một dự án chậm dài).

Tôi có ấn tượng rằng bạn không mong đợi họ có thể hòa hợp với công việc của bạn; có lẽ bạn nói đúng. Nhưng tôi không nghĩ rằng bạn có thể xây dựng bất cứ điều gì hữu ích mà không cần sự giúp đỡ của họ.

Họ sẽ nắm tay bạn viết bài kiểm tra đầu tiên. Có thể bạn sẽ kéo chúng, nhưng bạn cũng sẽ nắm tay nhau.

Khi bạn có một bài kiểm tra, hy vọng nó sẽ rõ ràng hơn về cách viết bài kiểm tra thứ hai. Nếu bạn đã quản lý để xây dựng bất kỳ loại mối quan hệ nào, nó chắc chắn sẽ rõ ràng hơn.


Cảm ơn câu trả lời! Bạn cũng có thể xem nửa sau câu hỏi của tôi chứ? Nửa đầu của tôi là một chút trùng lặp các câu hỏi tôi liên kết, và tôi chủ yếu quan tâm đến phần khác của câu hỏi của tôi vì điều đó.
Joshua Detwiler

Tôi không biết làm thế nào tôi có thể hữu ích. Bạn có gặp khó khăn trong việc hiểu làm thế nào khung kiểm tra hoạt động? Bạn đang tự hỏi những gì để kiểm tra? Vì thế, các bài kiểm tra hồi quy là một lựa chọn tốt: Bài kiểm tra nào đã ngăn chặn lỗi này mà chúng tôi vừa sửa khỏi bị đẩy, nếu chúng tôi quá tầm nhìn .
ShapeOfMatter

Đó là nhiều hơn "Những bài kiểm tra hồi quy nào hữu ích cho một thành phần có lẽ hoạt động như dự định?" Giống như, nếu tôi tạo ra các bài kiểm tra hữu ích, điều gì hữu ích hoàn toàn mù quáng về những gì hoạt động, những gì không và thậm chí nó hoạt động như thế nào? Tôi tồn tại trong chân không ngoài nhóm phần mềm và những người giao cho tôi nhiệm vụ này tồn tại trong chân không ngoài cả hai chúng tôi.
Joshua Detwiler

Tôi vẫn chắc chắn rằng bạn cần phải khăng khăng vào cùng phòng với những người viết phần mềm, lý tưởng trong một vài ngày, và có lẽ hơn một lần. Tôi có thể liên quan đến các tình huống làm việc vô lý, nhưng đến một lúc nào đó, một trong hai người cần phải mạo hiểm với công việc của một người hoặc chấp nhận rằng bạn chỉ là một người
hâm

Về kiểm tra hồi quy: Nó không khác biệt về mặt khái niệm so với bất kỳ thử nghiệm nào khác: Tôi muốn chương trình làm gì (hoặc không làm) trước khi tôi tuyên bố với đồng nghiệp rằng nó đang hoạt động? Nếu có hồ sơ về các tính năng mới hoặc các lỗi gần đây, đó là những nơi tốt để bắt đầu. Hoặc chỉ cần xem qua các tài liệu bạn có và chọn một cái gì đó có thể kiểm tra được. Java đã gõ các hàm, đó là tốt. Một chữ ký loại rõ ràng có thể cho bạn biết rất nhiều về những gì mong đợi từ một chức năng (và có thể được coi là một loại thử nghiệm đơn vị trong chính nó). Kiểm tra hành vi NULL / chuỗi rỗng / max-int cũng có thể tốt.
ShapeOfMatter

3

Tôi sẽ giả sử tại một số điểm bạn có thể lấy mã để biên dịch ít nhất. Nếu bạn thậm chí không thể đi xa đến mức bạn đang ở trong một việc vặt.


Thiếu các yêu cầu, thông số kỹ thuật hoặc ảnh chụp màn hình phù hợp không phải là một công cụ chặn để viết bài kiểm tra. Miễn là bạn có thể đọc mã nguồn, bạn có thể viết bài kiểm tra.

Nếu bạn được phép cấu trúc lại cơ sở mã để cô lập những thứ như kết nối cơ sở dữ liệu đằng sau giao diện của riêng họ, bạn có thể viết một số thử nghiệm đơn vị hộp đen - về cơ bản viết thử nghiệm để ném một số đầu vào vào một phương thức và khẳng định hành vi hoặc đầu ra của nó. Nhận các bài kiểm tra bao gồm từng dòng mã trong một phương thức và sau đó yêu cầu một trong các thành viên cấp cao của nhóm xem xét các bài kiểm tra của bạn.

Nếu bạn không được phép cấu trúc lại cơ sở mã để viết các bài kiểm tra đơn vị thì các bài kiểm tra tích hợp đầy đủ hoặc kiểm tra tự động hóa UI là lựa chọn duy nhất của bạn. Ngay cả khi đó, kiểm tra hộp đen là chiến lược tốt nhất của bạn - ném một số đầu vào vào UI và xem nó phản ứng như thế nào. Hãy khẳng định của bạn. Có một thành viên cao cấp của nhóm xem xét các bài kiểm tra của bạn.

Tại một số điểm, bạn sẽ có đủ các bài kiểm tra tự động để bạn có thể bắt đầu tái cấu trúc cơ sở mã với sự tự tin để giới thiệu các bài kiểm tra đơn vị. Các kiểm tra giao diện người dùng đảm bảo các trường hợp sử dụng nghiệp vụ chính hoạt động, và sau đó bạn có thể trang bị thêm một kiến ​​trúc có lợi cho kiểm tra cấp độ đơn vị hoặc thành phần.

Một lợi ích khác của kiểm tra giao diện người dùng là bạn có thể xây dựng danh tiếng với nhóm của mình mà bạn hiểu cơ sở mã, điều này giúp họ cởi mở hơn với bạn về việc giới thiệu thay đổi, vì bằng chứng nằm trong mánh khóe. Và bạn sẽ làm bánh bằng cách viết các bài kiểm tra.

Nói ngắn gọn:

  • Viết bài kiểm tra Hộp đen dưới dạng bài kiểm tra đơn vị hoặc giao diện người dùng tự động
  • Có thành viên cao cấp xem xét bài kiểm tra của bạn

Bạn sẽ ngạc nhiên khi bạn có thể nhanh chóng tìm hiểu chế độ xem hình ảnh lớn của ứng dụng 700.000 dòng


1

Dựa trên mô tả về vấn đề và nhận xét của bạn, tôi nghĩ cách tốt nhất bạn có thể làm là bắt đầu với API Java và thử xây dựng một thử nghiệm đơn vị duy nhất xung quanh một phương thức bị cô lập.

Không có quyền truy cập vào mã, tôi chỉ có thể cung cấp cho bạn hướng dẫn hạn chế nhưng tôi sẽ tìm kiếm thứ gì đó trong đó a) không có phụ thuộc b) không làm thay đổi trạng thái. Ví dụ. giả sử có một phương thức lấy một giá trị và kiểm tra xem nó có nằm trong một phạm vi nhất định không. Nếu bạn không thể tìm thấy thứ gì đó không có phụ thuộc, hãy thử thứ gì đó lấy giá trị từ một phụ thuộc và cố gắng chế giễu nó.

Một khi bạn tìm thấy một cái gì đó nhỏ như thế này, bạn có thể bắt đầu xây dựng các bài kiểm tra. Nếu phương pháp kiểm tra giá trị dương, sau đó chuyển nó thành giá trị âm và đảm bảo rằng nó bắt được nó, v.v. Vấn đề ở đây là bạn có thể không biết chắc hành vi chính xác là gì. Bạn có thể cần yêu cầu giúp đỡ hoặc đào qua tài liệu cho việc đó.

Bạn không thể nhận được rất xa với điều này. Thực tế là viết mã để nó có thể được kiểm tra đơn vị là một nghệ thuật đối với chính nó. Mã không được viết với điều này trong tâm trí có thể khó kiểm tra đơn vị.

Một tùy chọn khác có thể được thực hiện dễ dàng hơn là thử nghiệm tương thích nhị phân. Nghĩa là, bạn nắm bắt các đầu vào và đầu ra của một hệ thống và sau đó để kiểm tra, bạn cung cấp các đầu vào tương tự và so sánh các đầu ra. Điều này sẽ không cho bạn biết mã bắt đầu đúng hay sai nhưng nó có thể giúp phát hiện các lỗi hồi quy khi mọi thứ thay đổi ngoài ý muốn khi thực hiện một số sửa đổi khác. Tuy nhiên, bạn sẽ cần có thể chạy toàn bộ ứng dụng để thực hiện điều đó.

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.