代码之家  ›  专栏  ›  技术社区  ›  Orion Edwards

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

  •  0
  • Orion Edwards  · 技术社区  · 15 年前

    我有很多C#集成测试,都是用cucumber推广的Given/When/Then风格编写的。我使用的框架基本上与NBE的工作原理相同。

    我面临的一个反复出现的问题是设置和连接集成测试所需的所有应用程序状态。我的大多数测试都是这样的:

    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 回复  |  直到 15 年前
        1
  •  1
  •   BjoernD    15 年前

    对我来说,这听起来像是你想让一个基类做一些设置之类的事情,然后让你的测试类从这个基类继承,只添加新的测试功能。

    Base():
      constructor():
        do your wiring
        test if everything's ok
    
    
    TestClass : Base
      constructor():
        Base.constructor()
        additional setup?
    
      test_functions()
        ..
    
        2
  •  1
  •   Samuel Jack    15 年前

    我们有类似的东西

    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()
        {
    
        }
    }
    

    然后,对于每组类似的测试,我们创建一个基本上下文,如下所示:

    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();
           }
       }
    }