いろいろ備忘録日記

主に .NET と Python絡みのメモを公開しています。

DevExpress奮闘記-125 (CodeRush Unit Test Builder, UTB, ユニットテスト自動作成)

ちょっと前の情報になってしまいますが、CodeRush のバージョン 13.2 から

Unit Test Builder

という機能が追加されました。名前のままユニットテストを作成してくれる機能です。

公式のブログにて紹介されています。

New in CodeRush 13.2: Unit Test Builder

記事を見るとわかるのですが、デバッグしながらテストしたいパターンの場合のユニットテストを自動生成してくれます。とても便利です。

が、実際やってみるとうまくいかない、、、。というかUnit Test Builderウィンドウが出ない。
なんでだろうってSupport Center見てみると、以下のものがありました。

CodeRush Unit Test Builder not work

この中に、Unit Test Builderが動作する条件について記載されています。

  • Debugger Visualizer機能が有効となっていること
  • デバッグ起動していること
  • 対象のステートメントがpublicメソッドの中にあること
  • テスト対象クラスを含むプロジェクトを参照設定しているテストプロジェクトが少なくとも一つはあること
    • ここでいうテストプロジェクトとはCodeRushがサポートしているテストフレームワークを使っているプロジェクトという意味
  • テスト対象クラスがテストプロジェクトから見えること

上記の条件を満たした状態だと、Unit Test Builderが動きます。最初に機能確認しようと思ってインナークラスにしてたのが私の場合はまずかったみたいです。

んで、改めて試してみました。まず、テスト対象クラスを適当に作る。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CodeRushUnitTestBuilderSample
{
  class Program
  {
    static void Main()
    {
      var obj = new MyClass();

      Console.WriteLine(obj.Calc(10, 10));
      Console.WriteLine(obj.Calc(10, -20));
    }
  }

  public class MyClass
  {
    public int Calc(int x, int y)
    {
      return (x + y);
    }
  }
}

MyClassさんが、テスト対象クラス。で、単体テストプロジェクトも追加しておきます。
その状態で、Calcメソッドの2つめの呼び出しの部分にブレークポイントを当ててデバッグ起動。

今回、このCalcメソッドには仕様があって、負の値は無しで、minの値は0となるという仕様が
あるとします。(無理矢理な仕様ですがw)

当然、今の実装では満たしていないので、マイナスの値となります。
で、先に失敗するテストを記述したい、で、登場するのがUnit Test Builderちゃん。

ここで、

Ctrl + Shift + Alt + T

を押下すると以下のようにUnit Test Builderウィンドウが出てきます。

f:id:gsf_zero1:20140429170459p:plain

ウィンドウ内のグリッドの情報は好きにいじれます。テストメソッド名とかをちょっといじって
そのままデバッグ起動を終了します。すると、以下のようなユニットテストが作成されます。

f:id:gsf_zero1:20140429170619p:plain

そのときの引数の値とかが復元されていますね。assertする部分などは記述されていないので
後は自分でその部分を埋めてテストケース完成です。

f:id:gsf_zero1:20140429170721p:plain

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace CodeRushUnitTestBuilderSample.Tests
{
  [TestClass]
  public class MyClassTests
  {
    /// <summary>
    /// 負の値にはならない。
    /// </summary>
    [TestMethod]
    public void ValueIsNotBeNegative()
    {
      // Arrange
      int x = 10;
      int y = -20;

      MyClass sut = new MyClass();

      // Act
      int result = sut.Calc(x, y);

      // Assert
      Assert.AreEqual(0, result);
    }
  }
}

で、テストを実行すると当然Redとなります。後は実装を直します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace CodeRushUnitTestBuilderSample
{
  class Program
  {
    static void Main()
    {
      var obj = new MyClass();

      Console.WriteLine(obj.Calc(10, 10));
      Console.WriteLine(obj.Calc(10, -20));
    }
  }

  public class MyClass
  {
    public int Calc(int x, int y)
    {
      return Math.Max(0, (x + y));
    }
  }
}

テスト実行すると無事テストがgreenになりました。
同じ要領でいくつでもテストケースが作成できます。

これはこれで便利ですね。

  

過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。