Embedded software engineers는 보통 H/W, S/W가 동시(concurrent)에 개발된다.
그럼 S/W는 어떻게 H/W가 나오기 전에 Test되어야 하는가?
Jack Granssle says
The only reasonable way to build an embedded system is to start integrating today...The biggest schedule killers are unknowns; only testing and running code and hardware will reveal the existence of these unknowns.
Test and integration are no longer individual milestones; they are the very fabric of development.
- TDD + OOD(C++) "Interface"(Mock)를 사용하면 Interface layer를 사용하여 H/W와 분리 할 수 있다.
- Embedded S/W
- The development machine are often differnt from the target machine.
- 일반 APP의 문제 + a
- real-time constaraints (timing constraints)
- concurrent processing (concurrency)
- resource constraints such as limited memory space or processing power are the norm.
- testing a large application
- real-time constaraints (timing constraints)
- 그림추가할것
- 소스
TEST(HomeGuard, WindowIntrusion)
{
MockAlarmPannel *pannel = new MockAlarmPanel();
HomeGuard hg(pannel);
hg.arm();
hg.windowIntrusion();
CHECK(true == pannel->isArmed());
CHECK(true == pannel->isAudibleArmedOn());
CHECK(true == pannel->isVisualAlarmOn());
CHECK(pannel->getDisplayString() == "Window Intrusion");
}
{
MockAlarmPannel *pannel = new MockAlarmPanel();
HomeGuard hg(pannel);
hg.arm();
hg.windowIntrusion();
CHECK(true == pannel->isArmed());
CHECK(true == pannel->isAudibleArmedOn());
CHECK(true == pannel->isVisualAlarmOn());
CHECK(pannel->getDisplayString() == "Window Intrusion");
}
- Embedded TDD Cycle
- Quickly add a test
- Run all the tests and see the new one fail
- Make a little change
- Run all the tests and see the new one pass
- Refactor to remove duplicateion
결론
real H/W에서 모든 시나리오에 대한 자동화된 시험은 이루어질 수 없다. 자동화된(automated) Tests와 수동(manual) Tests가 같이 수행되어야 한다.(보드 탈장등을 자동화 할 수는 없다.)
하지만, 테스트 환경안에서는 임의로 상태나 이벤트를 발생시킬 수 있으므로 모든 시나리오를 자동화 할 수 있다.
하지만, 테스트 환경안에서는 임의로 상태나 이벤트를 발생시킬 수 있으므로 모든 시나리오를 자동화 할 수 있다.
소스 참고 : http://fitnesse.org/FitServers.CppFit.CppTestTools
연구 : 그럼 원 소스가 C인 경우 어떻게 Mock를 생성하여 Test할 수 있는가? 위 소스내의 예제를 살펴보자.