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に記載するルールのようです。
こんなイメージでしょうか。
- using System;
- using Xunit;
- public class MyTests : IDisposable {
- private int val;
- //テスト前の共通処理
- public MyTests() {
- val = 5;
- }
- [Fact]
- public void MyTest1() {
- Assert.Equal(val, 2 + 2);
- }
- //テスト後の共通処理
- public void Dispose() {
- val = 0;
- }
- }
Theory - InlineData
ざっくり言ってしまうと、テストデータを簡単に定義できる機能という感じでしょうか。
こちらが非常に参考になりました。
xUnit Theory, the Data Driven Unit Test
Theoryを使用するためには、「xunit.extensions.dll」が必要です。
xunitを解凍したフォルダにあるはずなので、テストプログラムを書いたディレクトリに
コピーしておきます。
さらに、サンプルプログラムをビルドするバッチファイルに
参照を追加します。
- @echo off
- set csc=C:\Windows\Microsoft.NET\Framework\v3.5\csc.exe /nologo
- set opt=/r:xunit.dll,xunit.extensions.dll /target:library
- %csc% %opt% MyTests.cs
/r:xunit.dll
を
/r:xunit.dll,xunit.extensions.dll
に変更しました。
Theoryの名前空間は、「Xunit.Extensions」ですので、テストプログラムには
using Xunit.Extensions;
の記載を追加します。
ここでちょっとハマったのですが、こんなサンプルを書きました。
- using Xunit;
- using Xunit.Extensions;
- public class MyTests {
- [Fact]
- [Theory,
- InlineData("日本語テスト", 10, true)]
- public void MyTest(string val1, int val2, bool val3) {
- Assert.Equal(val1, "日本語テスト");
- Assert.Equal(val2, 10);
- Assert.Equal(val3, true);
- }
- }
テストを実行すると、こんな結果になります。
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]をつける必要はありません。
以下のソースで狙い通りの動作になりました。
- using Xunit;
- using Xunit.Extensions;
- public class MyTests {
- [Theory,
- InlineData("日本語テスト", 10, true)]
- public void MyTest(string val1, int val2, bool val3) {
- Assert.Equal(val1, "日本語テスト");
- Assert.Equal(val2, 10);
- Assert.Equal(val3, true);
- }
- }
また、InlineDataは複数指定可能です。
- using Xunit;
- using Xunit.Extensions;
- public class MyTests {
- [Theory,
- InlineData("日本語テスト", "日本語テスト", true),
- InlineData("ちがう", "文字列", false),
- InlineData("ちょっとちがう", "文字列", true)]
- public void MyTest(string val1, string val2, bool val3) {
- Assert.Equal(val1 == val2, val3);
- }
- }
想定取りのテスト結果が得られました。
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を使用した形で書きなおしてみます。
- using System.Collections.Generic;
- using Xunit;
- using Xunit.Extensions;
- public class MyTests {
- [Theory,
- PropertyData("MyTestData")]
- public void MyTest(string val1, string val2, bool val3) {
- Assert.Equal(val1 == val2, val3);
- }
- public static IEnumerable<object[]> MyTestData {
- get {
- yield return new object[] { "日本語テスト", "日本語テスト", true };
- yield return new object[] { "ちがう", "文字列", false };
- yield return new object[] { "ちょっとちがう", "文字列", true };
- }
- }
- }
Theory - ClassData
PropertyDataとほとんど同じです。
最初のケースをClassDataを使用する形式に書きなおしてみます。
- using System.Collections;
- using System.Collections.Generic;
- using Xunit;
- using Xunit.Extensions;
- public class MyTests {
- [Theory,
- ClassData(typeof(MyTestData))]
- public void MyTest(string val1, string val2, bool val3) {
- Assert.Equal(val1 == val2, val3);
- }
- }
- public class MyTestData : IEnumerable<object[]> {
- private readonly List<object[]> _data = new List<object[]> {
- new object[] { "日本語テスト", "日本語テスト", true },
- new object[] { "ちがう", "文字列", false },
- new object[] { "ちょっとちがう", "文字列", true }
- };
- public IEnumerator<object[]> GetEnumerator() {
- return this._data.GetEnumerator();
- }
- IEnumerator IEnumerable.GetEnumerator() {
- return GetEnumerator();
- }
- }
その他、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
- 関連記事
-
- vpsのwebサービスに無料でドメイン名アクセスできるようにする
- xUnitで使用できるAssertion
- xUnitを使用したC#のテストでSetUpやTearDown、Theory
- xUnitを使用したC#のテストプログラム作成法
- C#からwin32なdllを呼び出し、関数を実行する
コメント