2

我有一个类(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 从运行到运行会保持不变(第一次运行,初始值 = null,第二次运行初始值“AHA”)。但显然 MyStaticProp 从运行到运行总是重置为 null 。知道为什么会发生这种情况吗?

编辑:谢谢大家的帮助!我想我将创建一个“DataClass”,它将保存到临时文件夹/从临时文件夹加载。像这样我可以确定什么时候会发生。

我仍然不明白的是,为什么它过去有效,但现在不再有效。

4

5 回答 5

8

我想我现在更好地理解了这个问题,CodedUI在运行之间不使用相同的对象,也不似乎使用相同的 AppDomain,上次运行中使用的 AppDomain 可能被丢弃了。这种方式会CodedUI生成可重现的测试,这些测试不依赖于先前运行的致命状态。

于 2011-05-31T11:12:57.957 回答
3

如果您希望在需要使用的所有测试方法之前调用某个方法

AssemblyInitializeClassInitializeTestInitialize属性之一

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

方法将运行的顺序是:

  • 用 AssemblyInitializeAttribute 标记的方法。

  • 用 ClassInitializeAttribute 标记的方法。

  • 用 TestInitializeAttribute 标记的方法。

  • 用 TestMethodAttribute 标记的方法。

于 2011-05-31T11:14:54.413 回答
1

您没有显示太多细节,但这里有:

  • 也许声明类是泛型的,而实例化是针对不同类型参数的 - 使静态变量不同(将其移动到非泛型(基)类以对抗这种行为)
  • 也许您正在使用一个测试运行程序,它将要测试的程序集动态加载到应用程序域中。一旦卸载了应用程序域,或者程序集被加载到一个新的应用程序域(Visual Studio 集成,有人吗?),静态将不得不用整个程序集数据段重新初始化
于 2011-05-31T11:13:54.677 回答
1

一般来说,在单元测试中依赖执行顺序总是不好的主意。单元测试应该相互独立。出于同样的原因,一些测试运行者在执行之前随机化测试。

如果您需要在运行测试之前执行一些设置,您应该在构造函数或 [SetUp] 方法中进行,具体取决于您的单元测试框架。

于 2011-05-31T11:23:46.720 回答
0

每次调用时TestMethod1,都将属性设置为"AHA",也就是重置它。

如果您只想设置一次,SomeClass请在创建它时在内部对其进行初始化,或者在内部创建一个静态构造SomeClass函数来设置初始值。

走静态构造器路线,它将是这样的:

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

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

请注意,调用 TestMethod1 仍将更改静态属性的值。但是在静态构造函数中添加初始化保证了该值只会从那里设置一次,并且在第一次访问之前。可能是你想要的。

于 2011-05-31T11:14:00.467 回答