문제

백그라운드 스레드에서 DB 쿼리를 수행하는 클래스에 백그라운드 작업자가 있다고 가정 해 봅시다.

이 수업을 테스트하고 싶어요

그래서 나는 내 DB를 조롱하고 지금까지 컬렉션을 다시 반환합니다. 배경 작업자가 Do Work라고 불렀고 마무리가 발생했는지 확인하십시오.

테스트가 무작위로 실패한다는 것을 알았습니다 (스레드와 관련이 있다고 생각합니다)

모든 제안

도움이 되었습니까?

해결책

배경 스레드와 어서/확인 사이에 레이스 조건이있을 수 있습니다.

예를 들어:

[Test]
public void TestWithRaceCondition()
{
    bool called = false;
    new Thread(() => called = true).Start();
    Assert.IsTrue(called);
}

스레드는 반드시 어설 션 전에 끝나는 것은 아니며 때로는 그렇지 않으며 때로는 그렇지 않습니다. 이 경우에 대한 해결책은 배경 스레드에 합류하는 것입니다.

[Test]
public void TestWithoutRaceCondition()
{
    bool called = false;
    var thread = new Thread(() => called = true);
    thread.Start();
    thread.Join()
    Assert.IsTrue(called);
}

레이스 조건인지 확인하는 한 가지 방법은 테스트 스레드를 지연시키는 것입니다 (테스트 직전에 오랫동안 수면 스레드를 호출하십시오). 테스트가 실패하는 경우 레이스 조건에 대한 좋은 표시입니다.

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