C#静态属性被初始化多次
本文关键字:初始化 静态 属性 | 更新日期: 2023-09-27 17:57:58
我有一个类(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",它将被保存到临时文件夹/从临时文件夹加载。像这样,我可以确定什么时候会发生。
我仍然不明白的是,为什么它在过去有效,但现在不再有效了。
我想我现在更好地理解了这个问题,CodedUI
在运行之间没有使用相同的对象,也似乎使用了相同的AppDomain,上一次运行中使用的AppDomain可能被丢弃了。通过这种方式,CodedUI
生成可重复的测试,这些测试不依赖于致命的前一次运行的状态。
如果你想在所有测试方法之前调用一些方法,你需要使用
AssemblyInitialize、ClassInitialize或TestInitialize性之一
http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute(v=VS.80).aspx
方法的运行顺序是:
-
标记为的方法AssemblyInitializeAttribute。
-
标记为的方法ClassInitializeAttribute。
-
标记为的方法TestInitializeAttribute。
-
标记为的方法TestMethodAttribute。
您没有显示太多细节,但如下所示:
- 也许声明类是泛型的,实例化是针对不同的类型参数的,从而使静态变量不同(将其移动到非泛型(基类)以对抗这种行为)
- 也许您正在使用一个testrunner,它将要测试的程序集动态加载到appdomain中。一旦卸载了appdomain,或者将程序集加载到新的appdomain(visualstudio集成,有人吗?),就必须使用整个程序集数据段重新初始化静态
一般来说,在单元测试中,依赖执行顺序总是个坏主意。单元测试应相互独立。出于同样的原因,一些测试运行程序在执行之前将测试随机化。
如果您需要在运行测试之前执行一些设置,则应在构造函数或[setup]方法中执行,具体取决于您的单元测试框架。
每次调用TestMethod1
时,都会将属性设置为"AHA"
,也就是重置它。
如果只想设置一次,请在创建它时在SomeClass
中初始化它,或者在SomeClass
中创建一个静态构造函数来设置初始值。
走静态构造函数的路线,它将是这样的:
[CodedUITest]
public class SomeClass
{
public static string MyStaticProp { get; set; }
static SomeClass(){
MyStaticProp = "AHA";
}
...
}
请注意,调用TestMethod1将更改静态属性的值。但是,在静态构造函数中添加初始化可以保证该值只在第一次访问之前设置一次。也许是你想要的。