다양한 H/W가 들어가 있는 프로그램을 어떻게 테스트 하시나요?

안녕하세요, FA분야에서 일하고 있는 반나무입니다.

FA분야에서 일하고 있다보니 제작하는 프로그램이 대부분 H/W(IO, PLC, Camera 등)에 종속되어있습니다. 하지만 프로그램은 기구가 없는 상황에서 제작 되어야 하고 그 뒤로 유지 보수를 진행할 때도 H/W가 없는 상태에서 S/W만 단일 실행해서 검사 결과를 뽑아내야 합니다.

저는 그런 상황에 놓일 때를 대비해 IsTestMode 라는 Property를 설정에 만들어 놓고 사용합니다.

아래 예시로 카메라를 Open하는 행위에서도 테스트 할 때는 H/W 구성 환경이 없다 보니 많은 부분이 제거된 상태로 테스트를 해야 합니다.

/// <summary>
/// 카메라를 Open하는 함수
/// </summary>
private void OnCamOpen()
{
    try
    {
        _log.Info("카메라 Open 시작");

        if (_settings.GeneralSettings.IsTestMode)
        {
            TestModeOpen();
        }
        else
        {
            InspectModeOpen();
        }
       
    }
    catch (Exception ex)
    {
        _log.Error(ex.Message);
    }
}

private void InspectModeOpen()
{
    // TODO : DC 전원 입력

    // 카메라 Open
    CameraManager.CameraOpen();

    // TODO : 검사 A

    // TODO : 검사 B(IO가 사용됨)
}

private void TestModeOpen()
{
    // TEST일 때는 POE로 전원을 인가해 사용하지않음

    // 카메라 Open
    CameraManager.CameraOpen();

    // TODO : 검사 A

    // 검사 B는 IO가 사용되기 때문에 하지않음
}

하지만 이런 방법은 Test용 Method와 실제 Method가 분리되며, Region으로 구분해도 소스 코드가 늘어나 보기가 불편합니다. 뭔가 불편하다고 느끼는 이유가 제가 좋지 않은 구조를 사용하고 있어서 그런 거 같단 생각에 글을 남깁니다.

어떤 게 명확한 답이다는 없을 것 같은 주제지만, 혹시 이런 다양한 H/W를 사용하며 테스트할 수 없는
환경일 때 다른 분들은 어떤 식으로 구조를 만들어 사용하시는지, 이런 구조에 대한 프로그래밍을 배울 수 있는 서적이 있는지 궁금합니다.

1 Like

Factory Method Pattern
추상 클래스 MachineBase를 상속해서 RealMachine, TestMachine 구현하고 그냥 메서드 호출하면 끝!

6 Likes

답변 감사합니다.

검사가 많은 조건이라 단순 메서드 호출로 끝날 것 같지는 않지만, 해당 패턴을 사용해 처리 할 수 있는지도 연구해 봐야겠습니다!

1 Like

핵심은 추상화입니다.
GetCurrentDevice()->Inspect();
검사하는 로직에서 A, B 관여 할 필요가 없어요
IO가 사용되서 하든 안 하든 Base class 상속한 A or B의 구현대로 실행하는 거죠