0

cucumber で普及した Given/When/Then スタイルを使用して記述された C# 統合テストがいくつかあります。基本的に NBehave と同じように機能するフレームワークを使用しています。

私が直面している繰り返しの問題は、統合テストに必要なすべてのアプリケーション状態のセットアップと配線の問題です。私のテストのほとんどは次のようになります。

空のシステムを考える
  そして、新しい NetworkServer
  そして、新しい ServerDatabase
  そして新しいイベントロガー
  そして、新しいネットワーク接続
  そして新しい LoggingClient
クライアントが新しいイベントをログに記録するとき
次に、サーバーデータベースに表示されます

ご覧のとおり、アクションとアサーションは 1 行ですが、6 行の「配線」があります。私が行ったほぼすべてのテストで、これらの 6 行が繰り返されます。

これはコードの匂いのように思えますが、これを処理する方法がわかりません。6 行を 1 行 (Given "a valid system..."またはそのようなもの) にリファクタリングすることもできますが、それでは行き過ぎて、あまりにも多くの情報を隠してしまうようです。

この分野でより多くの経験を持つ他の人からの考えをいただければ幸いです。どうもありがとう。

4

2 に答える 2

1

私たちはこのようなものを持っています

public abstract class ContextSpecification
{
    [FixtureSetUp]
    public void SetUp()
    {
        EstablishContext();
        Act();
    }

    protected abstract void Act();

    protected abstract void EstablishContext();

    [FixtureTearDown]
    public void TidyUpCore()
    {
        TidyUp();
    }

    protected virtual void TidyUp()
    {

    }
}

次に、同様のテストのグループごとに、次のようなBaseContextを作成します。

internal class TestClassTests 
{
    internal abstract class BaseContext : ContextSpecification
    {
        protected TestClass _sut;

        protected override void Act()
        {

        }

        protected override void EstablishContext()
        {
            _sut = new TestClass ();
           // common wiring
        }
    }

   internal class Given_this_situation : BaseContext
   {
       protected override void EstablishContext()
       {
           base.EstablishContext();
           // test specific wiring
       }

       protected override void Act()
       {
           // carry out the test actions
       }

       [UnitTest]
       public void ThisShouldBeTrue()
       {
          Assert.IsTrue();
       }
   }
}
于 2009-06-08T10:00:47.507 に答える
1

私には、基本クラスでセットアップのようなことを行い、テストクラスをこの基本から継承させ、新しいテスト機能のみを追加したいような匂いがします。

Base():
  constructor():
    do your wiring
    test if everything's ok


TestClass : Base
  constructor():
    Base.constructor()
    additional setup?

  test_functions()
    ..
于 2009-06-08T06:09:33.947 に答える