启动时间较长的单元测试 WCF 服务



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

我们的问题是,如何在不多次重新启动服务的情况下测试所有方法?

详细地:

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

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

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

请注意,无法将相关方法移动到库中或将它们添加到服务协定中。

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

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

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

您使用的是哪种测试框架?NUnit,MSTest还是其他任何? 假设使用的是 NUnit,则可以使用[OneTimeSetUp]-属性来初始化 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)。然后,您将能够访问和测试所有其他无法通过接口/合约访问的公共方法。

最新更新