集成测试时设置系统状态的最佳实践/想法?

时间:2009-06-07 20:58:12

标签: c# cucumber integration-testing nbehave

我使用由黄瓜推广的Given / When / Then风格编写了许多C#集成测试。我使用的框架基本上和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 个答案:

答案 0 :(得分:1)

对我来说,这有点像你想让一个基类做一些设置,然后让你的测试类继承这个基础,只添加新的测试功能。

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


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

  test_functions()
    ..

答案 1 :(得分: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();
       }
   }
}