Как заставить MSTest TestMethod сбросить все синглеты / статику перед запуском?

Я использую MSTEST внутри Visual Studio 2008. Как я могу заставить каждый метод модульного теста в определенном тестовом классе действовать так, как если бы он был первым тестом, чтобы сбросить все глобальное состояние перед запуском каждого теста? Я не хочу явно очищать мир с помощью TestInitialize, ClassInitialize, AssemblyInitialize и т. д. Например:

[TestClass]
public class MyClassTests
{
    [TestMethod]
    public void Test1()
    {
       // The "Instance" property creates a new instance of "SomeSingleton"
       // if it hasn't been created before.
       var i1 = SomeSingleton.Instance;
       ...
    }
    [TestMethod]
    public void Test2()
    {
       // When I select "Test1" and "Test2" to run, I'd like Test2
       // to have a new AppDomain feel so that the static variable inside
       // of "SomeSingleton" is reset (it was previously set in Test1) on
       // the call to ".Instance"
       var i2 = SomeSingleton.Instance;
       // some code
    }

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

В идеале я хотел бы указать это поведение только для небольшого подмножества моих модульных тестов, чтобы мне не пришлось платить штраф за создание нового AppDomain для тестов, которые не заботятся о глобальном состоянии (подавляющее большинство моих тестов).

4 ответов


в конце концов, я написал помощник, который использовал AppDomain.Метода createdomain а затем использовал отражение для вызова модульного теста под другим AppDomain. Это обеспечивает мне необходимую изоляцию.

этот пост на форумах MSDN показано, как справиться с ситуацией, если у вас есть только несколько статик, которые необходимо сбросить. Это упоминает некоторые параметры (например, использование отражения и PrivateType ).

Я продолжаю приветствовать любые дальнейшие идеи, особенно если я упускаю что-то очевидное о MSTEST.


добавьте помощника в свои тесты, который использует отражение для удаления экземпляра singleton (вы также можете добавить метод reset в singleton, но меня беспокоит его использование). Что-то вроде:

public static class SingletonHelper {
            public static void CleanDALFactory() 
            {
                    typeof(DalFactory)
                        .GetField("_instance",BindingFlags.Static | BindingFlags.NonPublic)
                        .SetValue(null, null);
            }
}

вызовите это в своем методе TestInitialize. [ Я знаю, что это "очистка мира", но вам нужно только написать метод один раз в помощнике на синглтон, его очень тривиальный и дает вам явный контроль ]


Я думаю, вы ищете атрибут TestIntialize и атрибут TestCleanUp. Вот блог MSDN, показывающий порядок выполнениятекст ссылки


У нас была аналогичная проблема с нашими MSTests. Мы справились с этим, вызвав функцию в начале и в конце конкретных тестов, которые в ней нуждались.

мы хранить срок годности теста в конфигурации приложения. Три теста требовали, чтобы эта дата попадала в определенный диапазон для определения соответствующих значений. Как настроено наше приложение, значения конфигурации будут сброшены только в том случае, если в сеансе не было назначено значение. Итак, мы создали два новых частных статические функции-одна для явного задания значения конфигурации на указанную дату и одна для очистки этой даты от сеанса после выполнения теста. В наших трех тестах мы назвали эти две функции. При следующем запуске теста приложение увидит пустое значение даты и повторно установит его из файла конфигурации.

Я не уверен, что это полезно, но так мы работали над нашей аналогичной проблемой.