问题描述
|
我有一个类(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可能被丢弃了。这样,“ 1”将生成可重复的测试,而这些测试不依赖于致命的先前运行状态。
, 如果要在所有测试方法之前调用某个方法,则需要使用
AssemblyInitialize,ClassInitialize或TestInitialize属性之一
http://msdn.microsoft.com/zh-CN/library/microsoft.visualstudio.testtools.unittesting.classinitializeattribute(v=VS.80).aspx
方法将运行的顺序为:
标有
AssemblyInitializeAttribute。
标有
ClassInitializeAttribute。
标有
TestInitializeAttribute。
标有
TestMethodAttribute。
, 您不会显示太多细节,但是这里有:
声明类可能是通用的,而实例化是针对不同类型的参数的-使静态变量不同(将其移至非通用(基)类以应对此行为)
也许您正在使用一个testrunner,它可以将要测试的程序集动态加载到appdomain中。一旦卸载了appdomain或将程序集加载到新的appdomain中(Visual Studio集成,有人吗?),则必须使用整个程序集数据段重新初始化静态对象
, 一般来说,在单元测试中,取决于执行顺序始终是个坏主意。单元测试应该相互独立。出于同样的原因,一些测试运行者在执行之前将测试随机化。
如果需要在运行测试之前执行一些设置,则应根据您的单元测试框架,使用构造函数或[SetUp]方法进行设置。
, 每次调用TestMethod1
时,都将属性设置为\"AHA\"
,也就是将其重置。
如果只希望设置一次,则在创建时在SomeClass
中对其进行初始化,或者在SomeClass
中创建一个设置初始值的静态构造器。
沿着静态构造器路线,它将像这样:
[CodedUITest]
public class SomeClass
{
public static string MyStaticProp { get; set; }
static SomeClass(){
MyStaticProp = \"AHA\";
}
...
}
请注意,仍然调用TestMethod1会更改静态属性的值。但是,将初始化添加到静态构造函数中可确保仅在第一次访问该值之前从那里设置该值。可能是您想要的。