C # статическое свойство, инициализируется более одного раза - PullRequest
2 голосов
/ 31 мая 2011

У меня есть класс (codedUI), содержащий статические свойства, которые используются для сохранения переменных от запуска к запуску:

[CodedUITest]
public class SomeClass
{
    public static string MyStaticProp { get; set; }

    [TestMethod]
    public void TestMethod1()
    {
         SomeClass.MyStaticProp = "AHA";
    }

    [TestMethod]
    public void TestMethod2()
    {
         string x = SomeClass.MyStaticProp;//when TestMethod1 and TestMethod2 are called from an "ordered test", MyStaticProp is reset everytime. The strange thing: it used to work....
    }
}

Я думал, что MyStaticProp останется неизменным от запуска к запуску (первый запуск, начальное значение = ноль, второй запуск, начальное значение "AHA"). Но, очевидно, MyStaticProp всегда сбрасывается в ноль от запуска к запуску. Есть идеи, почему это могло произойти?

EDIT: Спасибо за вашу помощь! Я предполагаю, что создам «DataClass», который будет сохранен в / загружен из временной папки. Таким образом, я могу быть уверен, что произойдет, когда.

Чего я до сих пор не понимаю, так это того, почему это работало в прошлом, а сейчас - нет.

Ответы [ 5 ]

8 голосов
/ 31 мая 2011

Я думаю, что теперь я лучше понял проблему: CodedUI не использует одни и те же объекты между запусками, и, похоже, не использует один и тот же домен приложений, домен приложения, использованный в последнем запуске, вероятно, отброшен.Таким образом, CodedUI генерирует воспроизводимые тесты, которые не зависят от состояния предыдущего запуска, который является фатальным.

3 голосов
/ 31 мая 2011

Если вы хотите, чтобы какой-либо метод вызывался перед всеми методами тестирования, вам нужно использовать

один из AssemblyInitialize , ClassInitialize или TestInitialize атрибут

http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute(v=VS.80).aspx

Порядок запуска методов:

  • Методы, помеченные AssemblyInitializeAttribute.

  • Методы, отмеченные ClassInitializeAttribute.

  • Методы, отмеченные TestInitializeAttribute.

  • Методы, помеченные TestMethodAttribute.

1 голос
/ 31 мая 2011

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

Если вам нужно выполнить настройку перед запуском тестов, вы должны сделать это в конструкторе или в методе [SetUp], в зависимости от вашей среды модульного теста.

1 голос
/ 31 мая 2011

Вы не показываете много деталей, но здесь идет:

  • возможно, декларирующий класс является родовым, а экземпляры предназначены для параметров разных типов - что делает статические переменные разными (переместите его в неуниверсальный (базовый) класс, чтобы противостоять этому поведению)
  • возможно, вы используете testrunner, который динамически загружает сборку для тестирования в домен приложения. Как только домен приложения выгружен или сборка загружена в новый домен приложения (интеграция с Visual Studio, кто-нибудь?), Статическая переменная должна быть повторно инициализирована со всем сегментом данных сборки
0 голосов
/ 31 мая 2011

Каждый раз, когда вы вызываете TestMethod1, вы устанавливаете свойство на "AHA", то есть сбрасываете его.

Если вы хотите установить его только один раз, либо инициализируйте его внутри SomeClass при созданииили создайте статический конструктор внутри SomeClass, который задает начальное значение.

Идя по маршруту статического конструктора, он будет выглядеть следующим образом:

[CodedUITest]
public class SomeClass
{
  public static string MyStaticProp { get; set; }

  static SomeClass(){
    MyStaticProp = "AHA";
  }
  ...
}

Обратите внимание, что по-прежнему вызывается TestMethod1изменит значение статического свойства.Но добавление инициализации внутри статического конструктора гарантирует, что значение будет установлено оттуда только один раз и до первого обращения к нему.Вероятно, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...