Đơn vị thử nghiệm hiệu ứng mã nặng


10

Tôi đang bắt đầu viết mã C ++ để chạy robot và tôi không biết cách kết hợp kiểm tra đơn vị, nếu thực sự tôi có thể. Tôi đã được cung cấp một thư viện cho phép tạo ra các "lệnh" cho robot, được tự động lên lịch và thực hiện. Cơ chế để tạo ra các lệnh này là để phân lớp một lớp cơ sở chỉ huy mà họ cung cấp, và thực hiện ảo void Initialize(), void Execute()void End()phương pháp. Các chức năng này được chạy hoàn toàn cho các tác dụng phụ của chúng, chúng làm mọi thứ cho robot (chạy động cơ, mở rộng pít-tông, v.v.). Bởi vì điều này, tôi thực sự không thấy bất cứ nơi nào để đính kèm các bài kiểm tra đơn vị vào mã, không chế nhạo toàn bộ thư viện để tôi có thể kiểm tra ảo trước và sau trạng thái của robot. Có cách nào để kiểm tra đơn vị này không quá nặng nề không?

Biên tập

Tôi nghĩ rằng tôi có thể đã gây hiểu nhầm về chức năng của thư viện. Thư viện cung cấp hầu hết giao diện cho robot cũng như hệ thống chỉ huy / lập lịch, vì vậy nó không đơn giản như chế nhạo lớp cơ sở lệnh, tôi phải chế nhạo toàn bộ giao diện với phần cứng. Tôi không may là không có thời gian để làm điều đó.


Tôi giả sử bạn có thể hoàn tác bất kỳ hành động nào mà bạn tạo ra cho robot của mình, phải không? Bạn có thể không hoàn tác các hành động của bài kiểm tra của bạn?
Neil

1
Thật tệ khi thư viện không sử dụng thành phần thay vì kế thừa, bởi vì bạn chỉ có thể chế nhạo lớp lệnh nếu đó là trường hợp.
Robert Harvey

@Neil Tôi không chắc chắn những gì bạn đang hỏi. Bạn có thể viết lại câu hỏi của bạn?
Will Kunkel

Câu trả lời:


7

Những gì tôi sẽ làm trong trường hợp này là giới thiệu giao diện RobotControl của riêng tôi với các phương thức tương ứng với các phương thức trong lib thực.

Sau khi thực hiện điều này, tôi sẽ tạo một lớp RobotControlImpl thực hiện giao diện này chống lại lib robot thực sự.

Các lệnh mà do đó tôi sẽ viết sẽ không mở rộng lớp cơ sở, mà thay vào đó hoạt động trên giao diện mà bạn đã giới thiệu.

Bằng cách này, bạn có thể giả lập RobotControl, chuyển giả cho bất kỳ lệnh nào và xác minh rằng nó được gọi là phương thức đúng trên giao diện.

Trong prod, bạn sẽ chuyển impl thực sự của RobotControl cho các lệnh mà bạn đã triển khai.

Tôi không chắc chắn nếu đây là những gì bạn có trong tâm trí và được coi là cồng kềnh?

Chỉnh sửa: Ồ, và nếu bạn mong đợi các lệnh ngủ để chờ hoàn thành (cơn ác mộng, nhưng đôi khi đây là những gì bạn có), tôi sẽ yêu cầu các lệnh gọi phương thức ngủ trên RobotControl. Bằng cách này, bạn có thể vô hiệu hóa giấc ngủ trong khi kiểm tra và chỉ cần xác minh rằng lệnh cố gắng ngủ.


2
+1. Không thích giao diện? Làm của riêng bạn.
Neil

Nghe có vẻ như bạn đang gợi ý rằng tôi chế giễu toàn bộ thư viện. Hầu như tất cả các chức năng mà các lệnh sẽ được gọi là nội bộ của thư viện.
Will Kunkel

0

Tôi nghĩ rằng có thể làm cho mã có thể kiểm tra theo cách xâm lấn tối thiểu. Điều đó có nghĩa là tôi có thể viết các lệnh chính xác như dự định của các tác giả thư viện robot. Điều này có thể thuận lợi nếu bạn muốn trao đổi mã với những người khác không sử dụng lớp trung gian của bạn.

Nó đòi hỏi một "bản dựng thử nghiệm đơn vị" riêng biệt của mã của bạn.

Những gì bạn làm là trong một tệp tiêu đề trung tâm, bạn kiểm tra thời gian biên dịch xác định xem đây có phải là bản dựng thử nghiệm đơn vị không và nếu có, hãy xác định lại tên của lớp cơ sở và có thể một số lớp khác trong thư viện robot thành tên của các lớp thực hiện thử nghiệm của bạn. Bạn nên xác định các chức năng ảo giống như trong lib của robot, cũng như cung cấp các sơ khai cho các phương thức bạn gọi trên robot.

Sau đó, bạn có các lệnh mà bạn có thể đưa vào khung thử nghiệm của riêng mình để gọi các phương thức tương tự mà thư viện robot sẽ làm.

Điều này sẽ liên quan đến một số lượng sơ khai và chế nhạo, nhưng đó là điều không thể tránh khỏi trong bất kỳ thiết kế thử nghiệm đơn vị nào.

Thay đổi tên lớp cơ sở có thể được thực hiện bằng #define hoặc có thể được ưu tiên, một typedef.

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.