외부 EXE를 시작하는 클래스에 대한 단위 테스트 작성


9

EXE 목록 (시작 해야하는 타사 EXE 중 하나가 아님) 목록을 시작하고 계속 실행하는 데 사용되는 C # 클래스를 작성했습니다 (여전히 실행되고 있는지 확인하고 그렇지 않은 경우 시작) .

추가, 제거 등의 기본 논리를 테스트 할 수 있습니다. EXE를 유지하는 실제 작업이 작동하는지 단위 테스트를 어떻게 수행합니까?

내 첫 생각은 1 초 후에 닫히는 더미 EXE를 시작한 다음 그것을 사용하여 테스트하는 것입니다. 이것이 단위 테스트의 영역을 벗어 납니까?

답변:


12

내 첫 생각은 1 초 후에 닫히는 더미 EXE를 시작한 다음 그것을 사용하여 테스트하는 것입니다. 이것이 단위 테스트의 영역을 벗어 납니까?

이것은 좋은 시험입니까? 물론입니다. 단어의 실제 의미에서 "단위 테스트"입니까? 나는 그렇게 생각하지 않는다. 나는 이것을 "시스템 테스트"또는 이와 유사한 것으로 부를 것이지만, 그 테스트가 덜 가치있는 것은 아니다.


9

그것보다 더 높은 수준에서 그것을 조롱하십시오. 주위에 프록시 클래스 Process.Start()를 만들고 테스트에서 가짜로 만들고 입력을 확인하십시오.

public interface IProcessProxy
{
     ProcessInfo Start(string application, string[] arguments);
}

public class ProcessProxy : IProcessProxy
{
    public ProcessInfo Start(string application, string[] arguments)
    {
        return Process.Start(application, arguments);
    }
}

// You could use a mocking framework for this, but for the purposes
// of this example ...
public class FakeProcessProxy : IProcessProxy
{
    private string _expectedApplication;
    private string[] _expectedArguments;
    private ProcessInfo response;

    public FakeProxy(string expectedApplication, string[] expectedArguments, ProcessInfo response)
    {
         _expectedApplication = expectedApplication;
         _expectedArguments = expectedArguments;
    }

    public ProcessInfo Start(string application, string[] arguments)
    {
         // compare input to expectations and throw exception if not matching
         return _response;
    }
}

// You can also use an IoC framework to inject your IProcessProxy, but I won't.
public class ClassUnderTest
{
    public ClassUnderTest(IProcessProxy proxy)
    {
        _proxy = proxy;
    }

    public ClassUnderTest() : this(new ProcessProxy())
    {
    }

    public void MethodUnderTest()
    {
        // Do stuff

        ProcessInfo process = _proxy.Start(@"C:\Program Files\App\App.exe", new[] { "arg1", "arg2" });
        process.WaitForExit();

        if (process.ExitCode == 0)
        {
            // Act on success
        }
        else
        {
            // Act on failure
        }
    }   
}

응용 프로그램 코드에서 ClassUnderTest를 사용해야하는 경우 기본 생성자를 사용하십시오. 테스트에서 예상 Proxy Start 매개 변수와 가짜 생성자의 테스트 결과를 사용하여 FakeProcessProxy를 다른 생성자에 전달하십시오.


4

엄격하게 (강조 유닛 테스트 철학 다음 장치 ), 당신은의 exe 파일을 생성하지 않아야하지만 클래스가 산란하고 정확하게 그 과정을 모니터링에 인터페이스를 호출하는 경우 대신 테스트합니다. 결국 프로세스 처리를 담당하는 라이브러리가 아닌 클래스를 테스트하려고합니다.

그러나 실용적인 관점에서 1 초는 조금 길지만 접근 방식은 좋습니다.


1

나는 비슷한 것을했지만 방금 전화했다 ping localhost. 빌드 서버에 실행 파일을 넣는 번거 로움을 덜어줍니다

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