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