단위 테스트 부작용이 많은 코드


10

로봇을 실행하기 위해 C ++ 코드를 작성하기 시작했으며 실제로 가능한 경우 단위 테스트를 통합하는 방법을 모릅니다. 로봇에 대한 "명령"을 생성 할 수있는 라이브러리가 제공되었으며, 자동으로 예약 및 실행됩니다. 이러한 명령을 생성하는 메커니즘은 그들이 제공하는 명령 기본 클래스를 서브 클래스, 가상 구현하는 것입니다 void Initialize(), void Execute()그리고 void End()방법을. 이러한 기능은 로봇에 영향을 미치는 부작용 (순전히 모터, 피스톤 확장 등)을 위해 순수하게 실행됩니다. 이 때문에 로봇의 전후 상태를 가상으로 확인할 수 있도록 전체 라이브러리를 조롱하지 않고 코드에 단위 테스트를 첨부 할 곳이 실제로 없습니다. 지나치게 부담스럽지 않은 단위 테스트 방법이 있습니까?

편집하다

도서관의 기능에 대해 오도 한 것으로 보입니다. 라이브러리는 명령 / 스케줄링 시스템뿐만 아니라 로봇에 대한 대부분의 인터페이스를 제공하므로 명령 기반 클래스를 조롱하는 것만 큼 간단하지 않으므로 전체 인터페이스를 하드웨어에 조롱해야합니다. 불행히도 그렇게 할 시간이 없습니다.


로봇이하는 행동을 취소 할 수 있다고 생각합니다. 테스트 작업을 취소 할 수 없습니까?
Neil

1
라이브러리가 상속 대신 컴포지션을 사용하지 않은 것은 너무 나쁩니다. 그렇다면 명령 클래스를 조롱 할 수 있기 때문입니다.
Robert Harvey

@ Neil 나는 당신이 무엇을 요구하는지 잘 모르겠습니다. 질문을 바꾸어 줄 수 있습니까?
Will Kunkel

답변:


7

이 경우 내가 할 일은 실제 lib의 메소드에 해당하는 메소드를 사용하여 내 자신의 RobotControl 인터페이스를 소개하는 것입니다.

이 작업을 수행 한 후 실제 로봇 라이브러리에 대해이 인터페이스를 구현하는 RobotControlImpl 클래스를 작성합니다.

결과적으로 작성하는 명령은 기본 클래스를 확장하지 않고 대신 소개 한 인터페이스에서 작동합니다.

이 방법으로 RobotControl을 조롱하고 모의를 모든 명령에 전달하고 인터페이스에서 올바른 메소드를 호출했는지 확인할 수 있습니다.

실제로는 RobotControl의 실제 기능을 구현 한 명령에 전달합니다.

이것이 당신이 생각하고 성가신 것으로 생각되는지 확실하지 않습니까?

편집 : 아, 그리고 완료를 기다리기 위해 명령이 잠들기를 기대하면 (악몽이지만 때로는 이것이 당신이 가진 것입니다), 명령은 RobotControl에서 sleep 메소드를 호출해야합니다. 이렇게하면 테스트 중에 휴면을 비활성화하고 명령이 휴면을 시도하는지 확인할 수 있습니다.


2
+1. 인터페이스가 마음에 들지 않습니까? 당신 만의 것을 만드세요.
Neil

이것은 전체 라이브러리를 조롱한다고 제안하는 것처럼 들립니다. 명령이 호출 할 거의 모든 기능은 라이브러리 내부에 있습니다.
Will Kunkel 님

0

최소한의 침입 방식으로 코드를 테스트 할 수 있다고 생각합니다. 그 말은 로봇 라이브러리 제작자가 의도 한대로 정확하게 명령을 작성할 수 있다는 것입니다. 중간 레이어를 사용하지 않는 다른 코드와 코드를 교환하려는 경우에 유리할 수 있습니다.

별도의 "단위 테스트 빌드"코드가 필요합니다.

당신이하는 일은 하나의 중앙 헤더 파일에서 컴파일 시간을 검사하여 이것이 유닛 테스트 빌드인지 정의하고, 그렇다면 기본 클래스의 이름을 재정의하고 로봇 라이브러리의 다른 클래스를 클래스 이름으로 재정의한다는 것입니다 테스트 구현의. 로봇 라이브러리에서와 동일한 가상 기능을 정의하고 로봇에서 호출하는 메소드에 대한 스텁을 제공해야합니다.

그런 다음 로봇 라이브러리와 동일한 방법을 호출하는 자체 테스트 프레임 워크에 넣을 수있는 명령이 있습니다.

여기에는 일정량의 스터 빙 및 조롱이 포함되지만 모든 단위 테스트 디자인에서는 불가피합니다.

기본 클래스 이름 변경은 #define 또는 아마도 선호되는 typedef로 수행 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.