Рекомендации / Идеи для настройки состояния системы при интеграционном тестировании? - PullRequest
0 голосов
/ 08 июня 2009

У меня есть несколько интеграционных тестов C #, написанных с использованием стиля Given / When / Then, популяризированного cucumber. Я использую фреймворк, который в основном работает так же, как NBehave.

Повторяющаяся проблема, с которой я сталкиваюсь, - это проблема настройки и подключения всех состояний приложения, необходимых для интеграционного теста. Большинство моих тестов выглядят примерно так:

Given an empty system
  And a new NetworkServer
  And a new ServerDatabase
  And a new Eventlogger
  And a new Networkconnection
  And a new LoggingClient
When the client logs a new event
Then it should appear in the server database

Как вы можете видеть, действие и утверждение - это отдельные строки, но у меня есть 6 строк «проводки». Почти все мои тесты повторяют эти 6 строк.

Это кажется мне запахом кода, но я не уверен, как с этим справиться. Я мог бы преобразовать 6 строк в одну (Given "a valid system..." или что-то подобное), но похоже, что это заходит слишком далеко, и я бы скрывал слишком много информации.

Буду признателен за любые мысли других людей, имеющих больше опыта в этой области. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 08 июня 2009

У нас есть что-то вроде этого

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();
       }
   }
}
1 голос
/ 08 июня 2009

Для меня это пахнет так, как будто бы вы хотели, чтобы базовый класс выполнял какие-то настройки, а затем ваши тестовые классы наследовали от этой базы и добавляли только новые функциональные возможности тестирования.

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


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

  test_functions()
    ..
...