单位测试WCF服务,启动时间较长

时间:2017-10-06 21:31:13

标签: c# .net unit-testing wcf

我们有一个WCF服务,开始时间为几分钟,因为必须在内存中加载大量数据。

我们的问题是,如果不重新启动服务,我们如何测试所有方法?

详细说明:

  • 我们从另一个WCF服务测试服务合同的方法,因此我们只需要启动一次WCF服务。即,我们开始我们的服务和测试服务,后者调用我们的服务来运行相关的单元测试。

  • 对于不需要内存中数据的方法,我们只是在服务中实现了单元测试。

  • 我们的问题涉及所有需要内存中数据且不属于数据合同的方法。我们如何为这些方法实现单元测试,以便我们可以运行多个测试,并且服务必须只启动一次?实际上,我们在服务中实现了这些单元测试,但是如果我们运行测试,服务必须在测试完成后立即启动和关闭。

请注意,无法将相关方法移至库中或将其添加到服务合同中。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您遇到的主要问题是处理WCF服务的状态,因为它在启动时需要它。

首先,很高兴看到您为不依赖于服务状态的所有测试用例实施了单独的单元测试

在测试有状态方法时,您需要集成测试(但我不想因为术语而进行分发)。为此,您需要在执行任何测试之前在设置方法中初始化您的服务一次(之后可能相互依赖)。

您使用的是哪个测试框架? NUnit,MSTest还是其他? 假设您正在使用NUnit,您将使用[OneTimeSetUp]-attribute初始化您的WCF服务,并将该实例用于需要初始化服务(以及状态和数据)的每个测试:

namespace Foo
{
  [TestFixture]
  public class YourServiceTests
  {
    private IYourService _service;

    [OneTimeSetUp]
    public void Init()
    { 
      /* Do whatever is necessary to initialize the service */ 
      _service = CreateNewInstance();
    }

    [OneTimeTearDown]
    public void Cleanup()
    { 
      /* optionally provide a teardown method to gracefully shutdown the service */ 
    }

    [Test]
    public void TestA()
    { 
      var expected = "bar";
      var actual = _service.MethodA();
      Assert.That(actual, Is.EqualTo(expected));
    }

    [Test]
    public void TestB()
    { 
      // ...
    }
  }
}

-

关于您的其他问题(“我们的问题涉及所有需要内存中的数据并且不属于数据合同的方法。”),我会使用类似的方法:

由于您要测试不属于IYourService - 合同的方法,您基本上会执行与上面相同的方法([OneTimeSetUp]),但现在您要初始化具体实现IYourService(例如YourService)。然后,您就可以访问并测试所有其他无法通过接口/合同访问的公共方法。