xUnitを使用したC#のテストでSetUpやTearDown、Theory

xUnitでテストプログラムをビルドし、実行できるようになりました。

xUnitを使用したC#のテストプログラム作成法
http://symfoware.blog68.fc2.com/blog-entry-1061.html


細かい使い方について調べてみます。

こちらのページを参考にしました。
http://xunit.codeplex.com/wikipage?title=Comparisons&referringTitle=HowToUse




SetUpやTearDown



以前、jUnitの使い方について調べました。
JUnit 4.10で使用できるアノテーション(org.junitパッケージ)

ここで言うところの@BeforeClassの機能。
テストを通して、最初に一回だけ実行したい処理は、コンストラクタに処理を記載します。


また、テスト終了後に一回だけ実行したい処理、jUnitで言う@AfterClassは、
Disposeに記載するルールのようです。

こんなイメージでしょうか。


  1. using System;
  2. using Xunit;
  3. public class MyTests : IDisposable {
  4.     private int val;
  5.     //テスト前の共通処理
  6.     public MyTests() {
  7.         val = 5;
  8.     }
  9.     [Fact]
  10.     public void MyTest1() {
  11.         Assert.Equal(val, 2 + 2);
  12.     }
  13.     
  14.     //テスト後の共通処理
  15.     public void Dispose() {
  16.         val = 0;
  17.     }
  18. }








Theory - InlineData



ざっくり言ってしまうと、テストデータを簡単に定義できる機能という感じでしょうか。

こちらが非常に参考になりました。
xUnit Theory, the Data Driven Unit Test


Theoryを使用するためには、「xunit.extensions.dll」が必要です。
xunitを解凍したフォルダにあるはずなので、テストプログラムを書いたディレクトリに
コピーしておきます。

さらに、サンプルプログラムをビルドするバッチファイルに
参照を追加します。


  1. @echo off
  2. set csc=C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /nologo
  3. set opt=/r:xunit.dll,xunit.extensions.dll /target:library
  4. %csc% %opt% MyTests.cs



/r:xunit.dll

/r:xunit.dll,xunit.extensions.dll
に変更しました。


Theoryの名前空間は、「Xunit.Extensions」ですので、テストプログラムには

using Xunit.Extensions;


の記載を追加します。



ここでちょっとハマったのですが、こんなサンプルを書きました。


  1. using Xunit;
  2. using Xunit.Extensions;
  3. public class MyTests {
  4.     [Fact]
  5.     [Theory,
  6.     InlineData("日本語テスト", 10, true)]
  7.     public void MyTest(string val1, int val2, bool val3) {
  8.         Assert.Equal(val1, "日本語テスト");
  9.         Assert.Equal(val2, 10);
  10.         Assert.Equal(val3, true);
  11.     }
  12. }




テストを実行すると、こんな結果になります。


xUnit.net console test runner (64-bit .NET 2.0.50727.5420)
Copyright (C) 2007-11 Microsoft Corporation.

xunit.dll:     Version 1.9.1.1600
Test assembly: c:¥share¥csharp¥MyTests.dll

MyTests.MyTest [FAIL]
System.InvalidOperationException : Fact method MyTests.MyTest cannot have parameters
Stack Trace:
     場所 Xunit.Sdk.FactCommand.Execute(Object testClass)
     場所 Xunit.Sdk.FixtureCommand.Execute(Object testClass)
     場所 Xunit.Sdk.BeforeAfterCommand.Execute(Object testClass)
     場所 Xunit.Sdk.LifetimeCommand.Execute(Object testClass)
     場所 Xunit.Sdk.ExceptionAndOutputCaptureCommand.Execute(Object testClass)

2 total, 1 failed, 0 skipped, took 0.302 seconds



テストケースは1回で、かつ成功のつもりだったのですが・・・


why xunit not allow test a method with parameters?
ここを見て納得。

[Theory]をつけたときは、既にテストケースとして扱われるので
[Fact]をつける必要はありません。


以下のソースで狙い通りの動作になりました。


  1. using Xunit;
  2. using Xunit.Extensions;
  3. public class MyTests {
  4.     [Theory,
  5.     InlineData("日本語テスト", 10, true)]
  6.     public void MyTest(string val1, int val2, bool val3) {
  7.         Assert.Equal(val1, "日本語テスト");
  8.         Assert.Equal(val2, 10);
  9.         Assert.Equal(val3, true);
  10.     }
  11. }





また、InlineDataは複数指定可能です。


  1. using Xunit;
  2. using Xunit.Extensions;
  3. public class MyTests {
  4.     [Theory,
  5.     InlineData("日本語テスト", "日本語テスト", true),
  6.     InlineData("ちがう", "文字列", false),
  7.      InlineData("ちょっとちがう", "文字列", true)]
  8.     public void MyTest(string val1, string val2, bool val3) {
  9.         Assert.Equal(val1 == val2, val3);
  10.     }
  11. }




想定取りのテスト結果が得られました。


xUnit.net console test runner (64-bit .NET 2.0.50727.5420)
Copyright (C) 2007-11 Microsoft Corporation.

xunit.dll:     Version 1.9.1.1600
Test assembly: c:¥share¥csharp¥MyTests.dll

MyTests.MyTest(val1: "ちょっとちがう", val2: "文字列", val3: True) [FAIL]
Assert.Equal() Failure
Expected: False
Actual: True
Stack Trace:
     場所 Xunit.Assert.Equal[T](T expected, T actual, IEqualityComparer`1 comparer)
     場所 MyTests.MyTest(String val1, String val2, Boolean val3)

3 total, 1 failed, 0 skipped, took 43.263 seconds








Theory - PropertyData



InlineDataでごりごりテストデータを書くのが辛いケースは、PropertyDataが便利そうです。

先ほどと同じテストをPropertyDataを使用した形で書きなおしてみます。


  1. using System.Collections.Generic;
  2. using Xunit;
  3. using Xunit.Extensions;
  4. public class MyTests {
  5.     [Theory,
  6.     PropertyData("MyTestData")]
  7.     public void MyTest(string val1, string val2, bool val3) {
  8.         Assert.Equal(val1 == val2, val3);
  9.     }
  10.     
  11.     public static IEnumerable<object[]> MyTestData {
  12.         get {
  13.             yield return new object[] { "日本語テスト", "日本語テスト", true };
  14.             yield return new object[] { "ちがう", "文字列", false };
  15.             yield return new object[] { "ちょっとちがう", "文字列", true };
  16.         }
  17.     }
  18. }








Theory - ClassData



PropertyDataとほとんど同じです。
最初のケースをClassDataを使用する形式に書きなおしてみます。


  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Xunit;
  4. using Xunit.Extensions;
  5. public class MyTests {
  6.     [Theory,
  7.     ClassData(typeof(MyTestData))]
  8.     public void MyTest(string val1, string val2, bool val3) {
  9.         Assert.Equal(val1 == val2, val3);
  10.     }
  11. }
  12. public class MyTestData : IEnumerable<object[]> {
  13.     private readonly List<object[]> _data = new List<object[]> {
  14.         new object[] { "日本語テスト", "日本語テスト", true },
  15.         new object[] { "ちがう", "文字列", false },
  16.         new object[] { "ちょっとちがう", "文字列", true }
  17.     };
  18.     
  19.     public IEnumerator<object[]> GetEnumerator() {
  20.         return this._data.GetEnumerator();
  21.     }
  22.     IEnumerator IEnumerable.GetEnumerator() {
  23.         return GetEnumerator();
  24.     }
  25. }





その他、ExcelDataやSqlServerData、OleDbDataというのも
使えるみたいです。




【参考URL】

xUnit Theory, the Data Driven Unit Test
http://www.tomdupont.net/2012/04/xunit-theory-data-driven-unit-test.html

Introduction to XUnit.net Extensions
http://blog.benhall.me.uk/2008/01/introduction-to-xunitnet-extensions.html




関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ