C#静态属性,不止一次初始化

时间:2011-05-31 11:10:07

标签: c# static properties coded-ui-tests

我有一个类(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”,它将保存到temp-folder中/从temp-folder中加载。 像这样我可以肯定会发生什么。

我还没有得到的是,为什么它在过去有效,但现在已经不存在了。

5 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

如果您想在所有需要使用的测试方法之前调用某种方法

AssemblyInitialize ClassInitialize TestInitialize 属性之一

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

方法的运行顺序是:

  • 标有的方法 AssemblyInitializeAttribute。

  • 标有的方法 ClassInitializeAttribute。

  • 标有的方法 TestInitializeAttribute。

  • 标有的方法 TestMethodAttribute。

答案 2 :(得分:1)

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

  • 也许声明类是通用的,实例化是针对不同的类型参数 - 使静态变量不同(将其移动到非泛型(基类)以抵消此行为)
  • 也许您正在使用testrunner将要测试的程序集动态加载到appdomain中。一旦appdomain被卸载,或者程序集被加载到一个新的appdomain(visual studio集成,任何人?),静态就必须用整个程序集数据段重新初始化

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

每次拨打TestMethod1时,都会将该属性设置为"AHA",同时重置该属性。

如果您只希望将其设置一次,则在创建它时在SomeClass内初始化它,或者在SomeClass内设置一个静态构造器来设置初始值。

走静态构造函数路径,它将是这样的:

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

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

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