2

5 つの異なる TestFixtures で多数の統合テストを含む nunit テスト プロジェクトを作成しました。ConfigSettings属性を持つクラスと、基本的にデータベースに接続して設定を取得する属性[SetupFixture]を持つメソッドがあります。[SetUp]取得した設定は、テスト全体で使用する必要があります。5 つの異なる TestFixtures はすべて、このクラスから継承されConfigSettingsます。

SetupFixture [setup]テストごとにメソッドが実行されることに気付いたので、フラグ「 HasRun」を使用してこれを回避しました。ただし、TestFixture1 の準備が整い、ランナーが TestFixture2 に移動するHasRunと、新しいインスタンスが作成されるため、再び 0 になります。SetupFixtureTestSuite の開始時に属性クラスを 1 回だけ実行するにはどうすればよいですか? 解決策は、HasRunプロパティと他のすべてのプロパティを静的にすることですが、NUnit の新しいインスタンスを開くと、プロパティは最初のインスタンスと同じ値になります。アイデアはありますか?

問題は基本的に、静的クラスの 2 番目のインスタンスが最初のインスタンスのプロパティ値を引き続き取得し、それらを新しい設定で上書きすると、最初のインスタンスが 2 番目のインスタンスの値を使用することです。この動作の回避策はありますか?

これは私がやろうとしていることのサンプルコードです:

以下は、他のテストフィクスチャの前にプロジェクトの開始時に実行する必要がある SetupFixture クラスです:-

[SetUpFixture]
public class ConfigSettings
{
    private static string strConnectionString = @"connectionStringHere";

    public string userName { get; set; }
    public string userId { get; set; }
    public int clientId { get; set; }
    public int isLive { get; set; }
    public int HasRun { get; set; }

    [SetUp]
    public void GetSettings()
    {
        if (HasRun != 1)
        {
            Console.WriteLine("executing setup fixture..");
            HasRun = 1;
            using (var db = new autodb(strConnectionString))
            {
                var currentSession = (from session in db.CurrentSessions
                                      where session.TestSuiteID == 1
                                      orderby session.TestStarted descending
                                      select session).FirstOrDefault();

                userId = currentSession.UserId.ToString();
                clientId = currentSession.ClientID;
                isLive = currentSession.IsLive;

                etc...
            }
        }
    }
}

今、各 TestFixture から ConfigSettings クラスを継承し、そのプロパティにアクセスしています。

[TestFixture]
public class TestFixture1: ConfigSettings
{
    [Test]
    public void Test1()
    {
        Console.WriteLine("executing test 1...");
        Console.WriteLine(userId);
    }

    [Test]
    public void Test2()
    {
        Console.WriteLine("executing test 2...");
        Console.WriteLine(clientId);
    }
}

ありがとう。

4

1 に答える 1

0

すでに知っているように、テストの前にSetUp一度だけSetupFixture実行し、すべてのタインを実行します。

あなたの質問に答える. How can I have the SetupFixture attribute class run only once at the beginning of the TestSuite? 最も簡単な方法は、SetUp代わりに使用することですSetupFixture

于 2013-06-03T12:45:06.367 に答える