Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

xUnit でテスト順を制御する

筋が悪いことは分かっているのですが、テスト順を制御したい場合がたまにあります。

github.com

ここんとこのIssueでも話題になっていました。デフォではサポートされないので、このリンク先のとこのExampleをやってみました。

https://github.com/xunit/samples.xunit/tree/master/TestOrderExamples/TestCaseOrdering

アルファベット順と、プライオリティ順の2つのAttributeが用意されていますが、ここではプライオリティ順を。

  • Priority.cs を取り込む
  • TestPriorityAttribute.cs を取り込む

以下例ですが、ポイントはTestCaseOrder属性にクラスのFQNと、アセンブリ名を指定することです。TestCaseOrder属性はxUnitが提供するものなので、その指示をカスタマイズしている感じでしょうか。

   [TestCaseOrderer("XUnitTestProject1.PriorityOrderer", "XUnitTestProject1")]

    public class UnitTest1 : IClassFixture<T1Fixture>, IClassFixture<T2Fixture>
    {
   
        [Fact, TestPriority(2)]

        public void Test1()
        {
           ....
        }

        [Fact, TestPriority(1)]
        public void Test2()
        {
            ....
        }
    }

xUnit で共通コンテキストを利用する

私的備忘録。

クラスで共通なコンテキストを扱いたいときは、IClassFixtureを使う。

  • IDisposableを実装したFixtureクラスを作る。デフォルトコンストラクタで初期化、Disposeで終了処理を記述しとく
  • 利用側では、IClassFixture な形で実装しておくと、
  • コンストラクタにFixtureクラスを書いてインジェクトされる。
    public class T1Fixture : IDisposable
    {
        public T1Fixture()
        {
        }

        public void Dispose()
        {
        }
    }
    public class T2Fixture : IDisposable
    {
        public T2Fixture()
        {
        }

        public void Dispose()
        {
        }
    }

    public class UnitTest1 : IClassFixture<T1Fixture>, IClassFixture<T2Fixture>
    {
        private readonly T1Fixture _t1;
        private readonly T2Fixture _t2;
        private readonly ITestOutputHelper _output;

        public UnitTest1(T1Fixture t1, T2Fixture t2, ITestOutputHelper output)
        {
            _t1 = t1;
            _t2 = t2;
            _output = output;
        }
        [Fact]
        public void Test1()
        {
            Assert.NotNull(_t1);
            Assert.NotNull(_t2);
            _output.WriteLine("OK");
        }
    }

元ネタは以下です。

Shared Context between Tests > xUnit.net

xUnit 2.0 で コンソール出力

私的備忘録。

xUnit 2.0 でコンソール出力する方法。システムのConsoleとかDebugのWriteLineは使えないのないので、ITestOutputHelper を使います。

以下のようにコンストラクタに定義しておくと適当にインスタンスが渡されてきます。

    public class UnitTest2
    {
        private readonly ITestOutputHelper _output;

        public UnitTest2(ITestOutputHelper output)
        {
            _output = output;
        }

        [Fact]
       public void  FooTest()
        {
            _output.WriteLine("hoge fuga {0}", "boo");
        }
    }

以下、R# で実行したけっか。VSのTest Runnerを使っても同じなはずです。

f:id:StateMachine:20171124120020p:plain

Capturing Output > xUnit.net