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、2 回目の実行の初期値 "AHA")。しかし、どうやら MyStaticProp は実行ごとに常に null にリセットされます。なぜこれが起こるのでしょうか?

編集: ご協力いただきありがとうございます。一時フォルダーに保存/ロードされる「DataClass」を作成すると思います。このように、いつ何が起こるかを確認できます。

私がまだ得ていないのは、なぜそれが過去に機能していたのか、現在は機能していないということです。

4

5 に答える 5

8

問題をよりよく理解したと思います。CodedUI実行間で同じオブジェクトを使用していないか、同じ AppDomain を使用しているようです。最後の実行で使用された AppDomain はおそらく破棄されます。このようCodedUIにして、致命的な以前の実行の状態に依存しない、再現可能なテストが生成されます。

于 2011-05-31T11:12:57.957 に答える
3

使用する必要があるすべてのテストメソッドの前にメソッドを呼び出す場合

AssemblyInitializeClassInitializeまたはTestInitialize属性のいずれか

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

一般的に言えば、実行順序に依存することは、単体テストでは常に悪い考えです。単体テストは互いに独立している必要があります。まったく同じ理由で、一部のテスト ランナーは実行前にテストをランダム化します。

テストを実行する前にセットアップを実行する必要がある場合は、単体テスト フレームワークに応じて、コンストラクターまたは [SetUp] メソッドで実行する必要があります。

于 2011-05-31T11:23:46.720 に答える
1

詳細は示していませんが、次のようになります。

  • おそらく、宣言クラスはジェネリックであり、インスタンス化は異なる型パラメーター用です-静的変数を異なるものにします(この動作に対抗するために非ジェネリック(ベース)クラスに移動します)
  • おそらく、テスト対象のアセンブリを appdomain に動的にロードするテストランナーを使用しているでしょう。appdomain がアンロードされるか、アセンブリが新しい appdomain に読み込まれると (ビジュアル スタジオの統合など)、アセンブリ データ セグメント全体で静的データを再初期化する必要があります。
于 2011-05-31T11:13:54.677 に答える
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 に答える