문제

일부 프로젝트에서는 VSTS2008에 따라 단위 테스트를 실행하는 동안 VStesthost의 메모리 소비가 커집니다. 솔루션에 많은 테스트가 있기 때문에 결국 OutofMemroyException으로 이어집니다. MSTEST가 각 단위 테스트에 대해 새로운 AppDomain을 생성한다고 확신하면서 매우 이상하게 보입니다. 그렇지 않으면 어떻게 정적 필드를 재설정합니까? 그러나 각 테스트마다 AppDomain이 생성되는 경우 메모리가 누출되지 않아야합니다. 그러나 그것은 그렇습니다.

따라서 문제는 다음과 같습니다. 대 VS가 각 테스트 클래스에 대해 AppDomain을 만들어야합니까? 그렇다면 어떻게 해야하는지 확인할 수 있습니다. ProcessExpolorer 및 Performance Snap-In을 통해 추적을 시도했습니다. "Total AppDomain 언로드"의 값은 테스트 실행 중 항상 0입니다.

도움이 되었습니까?

해결책

단위 테스트 엔진이 각 테스트마다 새로운 앱 도메인을 생성한다고 생각하지 않습니다. AppDomain을 만드는 것은 비교적 비싼 작업이기 때문에 각 테스트마다 그렇게하는 것은 단위 테스트의 실행 속도를 늦출 수 있습니다!

Visual Studio 2008은 vstesthost.exe라는 별도의 실행 파일을 사용하여 단위 테스트를 실행합니다. vs는 vstesthost.exe (내가 모르는 방법)과 통신하여 실행할 테스트를 알려줍니다. vstesthost.exe는 실행 결과를 VS로 반환하여 해당 결과를 표시합니다.

단위 테스트를 실행할 때 memoryexecece를 얻는 경우 테스트중인 코드가 실제로 정리하지 않는다는 강력한 지표라고 말합니다. 관리되지 않는 물체/메모리에 대한 핸들을 유지하지 않습니까? 성능 분석에서 단위 테스트를 실행하는 것이 좋습니다 ( "테스트보기"에서 장치 테스트를 찾아 오른쪽 버튼을 클릭하고 "성능 세션 만들기"를 선택함으로써이를 수행 할 수 있습니다). 이것은 적어도 객체 할당에 약간의 빛을 비출 수 있습니다.

다른 팁

MSTEST는 테스트 당 1 앱 도메인을 만듭니다 집회, 당신이 소음을 사용하지 않는 한,이 경우 AppDomain 격리가 없습니다.

누출이 보이면 아마도 테스트 코드 또는 제품 코드에있을 수 있습니다. 사전에 물건을 채우지 않고 그곳에 두지 않도록하십시오.

각 유닛 테스트마다 별도의 앱 도메인을 갖는 것이 잘못되었습니다.

증거는 다음과 같습니다. 싱글 톤

public class Singleton
{
    public static Singleton Instance = new Singleton();

    private Guid _token;
    private Singleton()
    {
        _token = Guid.NewGuid();
    }

    public Guid Token
    {
        get { return _token; }
    }
}

그리고 두 가지 테스트 :

[TestClass]
public class UnitTest2
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}
[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        Console.WriteLine(Singleton.Instance.Token);
    }
}

두 테스트를 실행하는 동안 동일한 가이드를 출력합니다.

큰 테스트 실행에서도 같은 문제를 보았습니다. 내 이론은 다음과 같습니다. 이 경우 메모리 소진은 MStest 테스트 결과 파일이 XML이기 때문입니다. 따라서 디스크로 직렬화하기 전에 테스트가 끝날 때까지 모든 로그 결과를 메모리로 유지해야합니다. XML에 대한 Hurray :-)

이 문제를 a로 게시했습니다 문제를 연결하십시오 얼마 전과 MSTEST 10 (64 비트)에서 고정되어야했지만 VS2010 및 .NET 4.0으로 이동 한 다른 모든 문제로 인해 아직 확인할 수 없었습니다.

싱글 톤을 처분하는 유일한 방법은 앱 도메인을 처분하는 것입니다. 싱글 톤은 정적 인 자체를 잡고 있으므로 기본적으로 원형 참조입니다. 진정한 싱글 톤은 AppDomain이 사라질 때까지 폐기되지 않습니다.

이것은 MSTEST 2010에서 해결되지 않은 것 같습니다. 나는 이와 같은 많은 비슷한 문제를 경험하고 있습니다. 쓰레기 수집이 단위 테스트에서 작동하지 않는 이유는 무엇입니까?

저의 이해는 UT 프레임 워크가 실행 된 모든 테스트의 처분을 처리했다는 것이었지만 코드에있는 일부 싱글 톤 패턴은 그렇지 않은 것 같습니다.

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