2017-02-16 3 views
0

여러 시나리오에 대해 약 12 ​​개의 단위 테스트가 있으며 이러한 테스트에서 하나의 비동기 메서드를 호출해야합니다 (한 번에 여러 번 테스트 할 때가 있습니다). "모두 실행"을 수행하면 3 명이 항상 실패합니다. "선택한 테스트 실행"을 사용하여 하나씩 실행하면 통과합니다. 내가 갖는 출력 예외는 이것이다 :모두 실행 중이지만 개별적으로 실행될 때 단위 테스트가 실패 함

System.AppDomainUnloadedException가 : 무부하 응용 프로그램 도메인에 액세스하기 위해 시도했습니다. 테스트가 스레드를 시작했지만 스레드를 중지하지 않은 경우에 발생할 수 있습니다. 완료되기 전에 테스트 (들)에 의해 시작된 모든 스레드가 중지되었는지 확인하십시오.

꽤 크다 내가 어디에서 시작해야할지 모르고 그래서 여기 예와 같이 정말 코드를 공유 할 수 없습니다 :

[TestMethod] 
public async Task SampleTest() 
{ 
    var someProvider = new SomeProvider(); 

    var result = await someProvider.IsSomethingValid(); 

    Assert.IsTrue(result == SomeProvider.Status.Valid); 

    NetworkController.Disable(); 

    result = await someProvider.IsSomethingValid(); 

    Assert.IsTrue(result == SomeProvider.Status.Valid); 

    NetworkController.Enable(); 
} 

편집 : 설정 다른이 실패하는 방법 미래에 대한 시간과 과거에 대한 각각의 시간. TimeProvider은 다음과 같습니다

[TestMethod] 
public async Task SetTimeToFutureTest() 
{ 
    var someProvider = new SomeProvider(); 

    var today = TimeProvider.UtcNow().Date; 

    var result = await someProvider.IsSomethingValid(); 

    Assert.IsTrue(result == SomeProvider.Status.Valid); 

    TimeProvider.SetDateTime(today.AddYears(1)); 

    var result2 = await someProvider.IsSomethingValid(); 

    Assert.IsTrue(result2 == SomeProvider.Status.Expired); 
} 

:

public static class TimeProvider 
{ 
    /// <summary> Normally this is a pass-through to DateTime.Now, but it can be overridden with SetDateTime(..) for testing or debugging. 
    /// </summary> 
    public static Func<DateTime> UtcNow =() => DateTime.UtcNow; 

    /// <summary> Set time to return when SystemTime.UtcNow() is called. 
    /// </summary> 
    public static void SetDateTime(DateTime newDateTime) 
    { 
     UtcNow =() => newDateTime; 
    } 

    public static void ResetDateTime() 
    { 
     UtcNow =() => DateTime.UtcNow; 
    } 
} 

편집 2 :

[TestCleanup] 
    public void TestCleanup() 
    { 
     TimeProvider.ResetDateTime(); 
    } 

다른 방법이 유사, I 등

I 시간/날짜 변경을 시뮬레이션합니다 그것으로부터 .Result()를 가져 와서 동 기적으로 메소드를 호출하려고했으나 도움이되지 않았습니다. 나는 이것에 대해 웹상에서 톤 자료를 읽었지만 여전히 고투하고있다.

누구나 같은 문제가 발생 했습니까? 모든 팁을 높이 평가 될 것입니다.

+0

공유 인스턴스 또는 정적 클래스 (예 : 'NetworkController')와 관련이 없다고 확신합니까? – bashis

+0

실패한 메소드 중 @bashis 2는 NetworkController를 호출하지 않습니다. – user969153

+0

당신의 방법이 의존적 인 것처럼 보입니다. 당신은 방법이 어디에 속해야하는지 정확한 순서를 알아야합니다. –

답변

0

테스트 초기화 또는 정리로 수행중인 작업을 볼 수 없지만 모든 테스트 메소드가 비동기 적으로 실행하려고하므로 테스트 러너가 정리를 수행하기 전에 모든 작업을 완료하도록 허용하지 않을 수 있습니다 .

모든 테스트를 실행할 때 동일한 몇 가지 방법이 실패합니까? 아니면 임의입니까? 단위 테스트를하고 있지만 통합 테스트는 수행하지 않았습니까? "NetworkController"클래스는 여러분이 더 많은 통합 테스트를 수행하고 있다는 인상을줍니다. 그러한 경우에 공통 클래스, 제공자, 서비스 또는 저장 매체 (데이터베이스, 파일 시스템)를 사용하는 경우 한 가지 방법으로 인한 상호 작용이나 상태 변화가 다른 테스트 방법의 효력에 영향을 미칠 수 있습니다.

+0

두 번째 편집시 TestCleanup 메서드를 추가했습니다. TimeProvider 만 재설정합니다. 테스트 init은 없으며 테스트 메소드의 모든 것을 로컬 변수로 초기화합니다. SomeProvider 클래스 초기화가 있기 전에 테스트 초기화가 있었지만 도움이되지 않았습니다. – user969153

+0

NetworkController 클래스는 PC의 IP 주소를 변경하여 인터넷에 액세스하지 못하도록합니다. 라이브러리의 목적은 연결/연결 해제 될 때와 다른 시간에 다른 상태로 돌아가는 것입니다. 모든 단위 테스트는 시간 변경 또는 네트워크 변경 중 하나 또는 둘 모두를 시뮬레이션하려고 시도합니다. – user969153

0

비동기/대기 모드에서 테스트를 실행하면 지연이 발생할 수 있습니다. 모든 처리가 메모리에서 일어나고있는 것처럼 보입니다. 지연 시간이 최소이기 때문에 아마 1 대 1 기준을 통과 할 것입니다. 여러 개의 비동기 모드를 실행할 때 지연 시간은 시간 결과를 차별화하는 데 충분합니다.

DateTime 구성 요소를 테스트중인 NCrunch에서 NUnit 테스트를 실행하기 전에이 문제가 발생했습니다. 수락 기준 내에서 허용되는 한 유효성 검사/만료 논리의 범위를 밀리 초가 아닌 초로 일치 시키면이를 완화 할 수 있습니다. 논리에 따라 유효성 검사 상태 또는 만료 날짜가 무엇인지 코드에서 알 수는 없지만 비동기 래그가 동시에 실행될 때 테스트 실패의 근본 원인이 될 확률은 높습니다.

0

표시된 두 테스트는 동일한 정적 TimeProvider를 사용하므로 클린업의 ResetDateTime과 같은 메소드의 간섭과 TimeProvider.SetDateTime (today.AddYears (1)); 시험에서 기대된다. 또한 NetworkController는 정적 리소스로 보이며 연결/연결 해제가 테스트를 방해 할 수 있습니다.

여러 가지 방법으로 문제를 해결할 수 :

  • 정적 자원을 제거하는 대신
  • 이 테스트를 잠금 인스턴스를 사용하여 같은 하나의 테스트는 시간
에서 실행할 수 있음을

그 외에도 거의 모든 테스트 프레임 워크는 Assert.AsTrue 이상의 기능을 제공합니다. 프레임 워크가 Assert.AreEqual을 제공하지 않습니까? 그것은 readability를 향상시킵니다. 또한 테스트에서 하나 이상의 Assert가있는 경우, 테스트 중 어느 것이 실패했는지 (또는 Assert가 실제 테스트가 아닌 사전 조건을위한 것인지) 나타내는 사용자 지정 메시지가 권장됩니다.

관련 문제