【问题标题】:C# static property, is initialized more than onceC# 静态属性,被多次初始化
【发布时间】:2011-05-31 11:10:06
【问题描述】:

我有一个类(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”,它将保存到临时文件夹/从中加载。 像这样我可以确定什么时候会发生。

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

【问题讨论】:

  • @Abdul - 更准确地说,每个AppDomain 一次,这不太一样;每个进程可以有多个AppDomains
  • 跑来跑去是什么意思?每个 AppDomain 初始化静态变量一次。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    AssemblyInitializeClassInitializeTestInitialize 属性之一

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

    方法运行的顺序是:

    • 标有 AssemblyInitializeAttribute。

    • 标有 类初始化属性。

    • 标有 测试初始化​​属性。

    • 标有 测试方法属性。

    【讨论】:

      【解决方案3】:

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

      • 也许声明类是泛型的,而实例化是针对不同类型参数的 - 使静态变量不同(将其移至非泛型(基)类以应对这种行为)
      • 也许您正在使用一个测试运行程序,它将要测试的程序集动态加载到应用程序域中。卸载 appdomain 或将程序集加载到新的 appdomain(Visual Studio 集成,有人吗?)后,必须使用整个程序集数据段重新初始化静态

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

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

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

          [CodedUITest]
          public class SomeClass
          {
            public static string MyStaticProp { get; set; }
          
            static SomeClass(){
              MyStaticProp = "AHA";
            }
            ...
          }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多