여러 스레드에서 단위 테스트를 수행하는 가장 좋은 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/41568

문제

이런 종류의 것은 다른 것에서 따온 것입니다 질문 내 것.

기본적으로 파일에 액세스할 수 있는 코드가 있으면(잠시 후에 답변을 검토하겠습니다) 가장 좋은 방법은 무엇입니까? 시험 그것?

나는 많은 것을 생성하는 방법을 만들려고 생각하고 있습니다. 배경작업자또는 무언가를 모두 로드/저장하고 다양한 파일/객체 크기로 테스트하도록 지시합니다.그런 다음 스레드로부터 응답을 받아 실패/성공/세계를 붕괴시켰는지 등을 확인합니다.

이에 접근하는 가장 좋은 방법에 대해 제안해 주실 수 있나요?앞서 말했듯이, 이것은 나에게 다소 새로운 것입니다 :)

편집하다

수행원 아즈마스트레안의 우편:

Debug.Asserts로 테스트하기 위해 콘솔 앱을 사용하고 있습니다. :)


업데이트

나는 원래 사용하여 굴러 갔다. 배경작업자 스레딩을 처리하기 위해(나는 Windows 개발에서 익숙했기 때문에) 계속하기 전에 여러 작업(스레드)을 완료해야 하는 테스트를 수행할 때 그것이 약간의 해킹이 될 것이라는 것을 곧 깨달았습니다. 이것을 하도록 하세요.

나는 그 다음 후속 조치를 취했다. 아즈마스트레안님의 게시물을 보고 제가 정말 이 도구를 사용해야 한다는 것을 깨달았습니다. 동시 작업을 수행하기 위한 클래스입니다.이제 이 방법을 사용하여 리팩터링하겠습니다(접근 방식은 다르지만).

도움이 되었습니까?

해결책

.NET에서는 ThreadPool 스레드는 설정 없이는 반환되지 않습니다. ManualResetEvent또는 AutoResetEvent에스.나는 빠른 테스트 방법에 비해 이러한 과잉이 있다고 생각합니다(생성, 설정 및 관리가 복잡하다는 것은 말할 것도 없습니다).백그라운드 작업자는 콜백 등으로 인해 약간 복잡합니다.

내가 찾은 것 중 효과가 있는 것은

  1. 스레드 배열을 만듭니다.
  2. 설정 ThreadStart 각 스레드의 메소드
  3. 각 스레드를 시작합니다.
  4. 모든 스레드에서 조인(다른 모든 스레드가 완료되거나 중단될 때까지 현재 스레드를 차단)
public static void MultiThreadedTest()
{
    Thread[] threads = new Thread[count];

    for (int i = 0; i < threads.Length; i++)
    {
        threads[i] = new Thread(DoSomeWork());
    }

    foreach(Thread thread in threads)
    {
        thread.Start();
    }

    foreach(Thread thread in threads)
    {
        thread.Join();
    }
}

다른 팁

@ajmastrean, 단위 테스트 결과를 예측할 수 있어야 하므로 어떻게든 스레드를 동기화해야 합니다.이벤트를 사용하지 않고는 간단한 방법을 볼 수 없습니다.

ThreadPool.QueueUserWorkItem이 이러한 사용 사례를 쉽게 테스트할 수 있는 방법을 제공한다는 것을 알았습니다.

 ThreadPool.QueueUserWorkItem(x => { 
    File.Open(fileName, FileMode.Open);
    event1.Set(); // Start 2nd tread;
    event2.WaitOne(); // Blocking the file;
});
ThreadPool.QueueUserWorkItem(x => { 
    try
    {
        event1.WaitOne(); // Waiting until 1st thread open file
        File.Delete(fileName); // Simulating conflict
    }
    catch (IOException e)
    {
        Debug.Write("File access denied");
    }
});

당신의 아이디어는 잘 작동할 것입니다.기본적으로 여러 스레드를 생성하고 파일을 작성하는 스레드가 실제로 독자를 기다리게 만들 만큼 오랜 시간이 걸리는지 확인하기를 원합니다.모든 스레드가 오류 없이 영원히 차단되지 않고 반환되면 테스트가 성공합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top