MSTest и домены приложений

В каком-то моем проекте я заметил, что во время выполнения модульных тестов под VSTS2008 его потребление памяти VSTestHost растет. Поскольку в моем решении очень много тестов, это в конечном итоге приводит к OutOfMemroyException. Для меня это выглядит очень странно, поскольку я был уверен, что MSTest создает новый AppDomain для каждого модульного теста. Иначе как бы он сбросил статические поля? Но если для каждого теста создается AppDomain, то утечки памяти не должно быть. Но это так.

Возникает вопрос: должна ли VS создавать AppDomain для каждого тестового класса или нет? Если да, то как я могу проверить, что он это делает. Я пробовал отслеживать через ProcessExpolorer и оснастку «Производительность». Значение «Всего выгруженного домена приложения» всегда равно 0 во время тестового запуска.


person Shrike    schedule 02.11.2008    source источник
comment
У меня такая же проблема. Неужели это стало вашей проблемой, как, казалось, сказали респонденты? Или на самом деле это был тестовый раннер? Мне любопытно.   -  person Peter Seale    schedule 24.02.2011
comment
Я нашел социальный .msdn.microsoft.com / Forums / en-US / vststest / thread / и social.msdn.microsoft.com/Forums/en-US/vststest/thread/. Мне кажется, что некоторые из мы, создавшие большой набор тестов, сталкиваемся с этой проблемой.   -  person Peter Seale    schedule 25.02.2011


Ответы (6)


Я не думаю, что движок модульного тестирования создает новый домен приложения для каждого теста. Поскольку создание AppDomain - относительно дорогостоящая операция, выполнение этого для каждого теста значительно замедлит выполнение модульных тестов!

Visual Studio 2008 использует отдельный исполняемый файл vstesthost.exe для запуска модульных тестов. VS связывается с vstesthost.exe (я не знаю, как это происходит), чтобы сообщить ему, какие тесты запускать. vstesthost.exe возвращает результаты выполнения в VS, который отображает эти результаты.

Если вы получаете OutOfMemoryExceptions при запуске своих модульных тестов, я бы сказал, что это сильный индикатор того, что ваш тестируемый код на самом деле не очищает вещи. Вы уверены, что не сохраняете дескрипторы неуправляемых объектов / памяти? Я бы рекомендовал запускать ваши модульные тесты в рамках анализа производительности (вы можете сделать это, найдя модульный тест в «Test View», щелкнув его правой кнопкой мыши и выбрав «Create Performance Session»). Это может пролить свет, по крайней мере, на распределение ваших объектов.

person Jeremy Wiebe    schedule 02.11.2008

MsTest создает домен с одним приложением для каждой тестовой сборки, если вы не используете шумоподавление, и в этом случае изоляция домена приложений отсутствует.

Если вы видите утечки, вероятно, это ошибка либо в вашем тестовом коде, либо в вашем коде продукта. Убедитесь, что вы не запихиваете вещи в словари и не оставляете их там.

person Dominic Hopton    schedule 14.02.2009
comment
+1, домен приложения для каждой сборки. Но - он также создает новый экземпляр тестового класса для каждого теста, поэтому на самом деле он должен собирать поля. У меня также есть проблемы с памятью при тестировании MS, и я не знаю, почему. Думаю, в тестовом раннер есть какие-то проблемы. - person Stefan Steinegger; 26.04.2010
comment
+1 к экземпляру тестового класса за тест. [ClassInitialize] статичен. - person bryanbcook; 09.01.2011

Я ошибался, имея отдельные домены приложений для каждого модульного теста.

Вот свидетельство: синглтон

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);
    }
}

При выполнении обоих тестов выводится один и тот же guid.

person Shrike    schedule 02.11.2008

Наблюдал такую ​​же проблему при больших тестовых прогонах. Моя теория следующая. Исчерпание памяти в этом случае связано с тем, что файлы результатов теста MSTest представляют собой XML. Поэтому ему необходимо хранить все результаты журнала в памяти до конца тестового прогона перед сериализацией на диск. Ура XML :-)

Я опубликовал эту проблему как проблему подключения некоторое время назад, и это должно было быть исправлено в MSTest 10 (переход на 64-разрядную версию), но я еще не смог проверить это из-за всех других проблем, которые мы наблюдаем при переходе на VS2010 и .NET 4.0.

person Brumlemannen    schedule 30.03.2011

Единственный способ избавиться от синглтона - это удалить appDomain. Синглтон - это статическая привязка к самому себе, поэтому в основном это круговая ссылка. Истинные синглтоны не удаляются, пока домен приложения не исчезнет.

person Michael Reed Schmidt    schedule 01.04.2016

Кажется, это не решено в MSTest 2010. Я испытываю множество подобных проблем. Почему сборка мусора не работает в модульном тесте?

Насколько я понимаю, фреймворк UT позаботился об удалении всех выполненных тестов, но это не похоже на некоторые одноэлементные шаблоны, которые у нас есть в коде.

person n8CodeGuru    schedule 07.06.2011