2017-05-17 10 views
1

Nunit 2.6で単体テストを行いましたが、Nunit 3.6.1にアップグレードする予定ですが、Nunit 3.6.1で奇妙な問題が発生しました私はそれを正しく理解していないか)。問題はOneTimeSetUp()の周りです。Nunit3 OneTimeSetUp()が[テスト]の後に呼び出されたのはなぜですか

はNUnitの2.6.3で、私はSetUpFixtureAttribute [SetUpFixture]持っていたし、そのSetUpAttribute [設定]と内側にそれは私のために予想されるとして働いていた、流れは

SetUpFixture.Setup

TestFixture.Setupました

TestFixture.Test

TestFixture.TearDown

TestFixture.Setup

TestFixture.Test

TestFixture.TearDown

SetUpFixture.TearDown

私はNUnitの3にアップグレードする場合、私は(セットアップを置き換え)をOneTimeSetUpとSetUpFixture内部、及び私のコードを実行した後、私は流れを得た

TestFixture.Setup

TestFixture.Test

TestFixture.TearDown

SetUpFixture.OneTimeSetUp

SetUpFixture.OneTimeTearDown

後、私は私のマシンで試したサンプルコードと、コマンドラインであります出力

[SetUpFixture] 
    public class TestBase 
    { 
     [OneTimeSetUp] 
     //[SetUp] 
     public static void MyTestSetup() 
     { 
      Console.WriteLine(" ---------- Calling OneTimeSetUp ----------"); 

     } 
    } 


[TestFixture] 
    class TestClass : TestBase 
    { 
     [Test] 
     public void test() 
     { 
      Console.WriteLine("\n ....I'm inside TestClass.test() ...."); 
     } 

    } 

コンソール出力

=> TestSample.TestClass.test 

....I'm inside TestClass.test() .... 
=> TestSample.TestClass 
---------- Calling OneTimeSetUp ---------- 
=> TestSpecflow.TestBase 
---------- Calling OneTimeSetUp ---------- 

誰かが私がここで行方不明です何を提案してくださいことはできますか? 私はnunit-console経由でテストを実行しています

答えて

3

出力が誤解を招き、コードが実行される順序ではないという問題があります。 NUnit 3はパラレル実行をサポートしているため、テスト実行のレベルが完了すると出力をキャプチャしてコンソールに表示します。

あなたのケースでは、フィクスチャ設定がテストをラップするので、テスト後に実行を終了し、その後にキャプチャしたテキストを出力します。

テストをデバッグするか、またはConsole.WriteLineコールをTestContext.Progress.WriteLineにすぐに切り替えると、コードは期待どおりの順序で実行されます。

期待どおりの順序でない場合は、名前空間を確認してください。名前空間レベルでの設定には[SetupFixture]が使用されることに注意してください。テストが異なる名前空間にある場合、テストは異なる順序で呼び出すことができます。すべてのテストのセットアップが必要な場合は、クラスを最上位の名前空間に配置するか、複数の名前空間がある場合は名前空間に入れません。ロブの答えは、あなたが問題を抱えている根本的な理由ですが、追加的なものがある。ここ

は、いくつかのテストコードです

そして、ここではnunit3-console.exe

=> NUnitFixtureSetup.SetupClass 
One time setup 
=> NUnitFixtureSetup.TestClass.TestMethod 
Test Method 
3

で実行されているから出力され、これはロブのコードではありませんが、あなたのコードにあります。

コードでは、TestBaseを2回使用しています:SetUpFixtureおよびTestFixtureの基本クラス。

これは、OneTimeSetUpメソッドが2回使用されることを意味します。ネームスペース内のすべてのフィクスチャの前と、それを継承するテストフィクスチャの前に1回。このようにしてSetUpFixtureを使用すると、その目的は壊れてしまいます。すべての名前空間内のフィクスチャの前に一度だけ実行されるコードを持つことです。

ベースクラス(必要な場合)とセットアップフィクスチャ(必要な場合)の別々のクラスを使用します。

関連する問題