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

问题描述:

我们有一个启动时间为几分钟的WCF服务,因为大量数据必须加载到内存中。单元测试WCF服务启动时间较长

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

详细:

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

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

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

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

如果我正确理解你,你遇到的主要问题是处理你的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 -contract你基本上做的和上面一样([OneTimeSetUp]),但是现在你要初始化IYourService的具体实现(例如, YourService)。然后,您将能够访问并测试所有其他公共方法,这些方法不能通过界面/合同访问。

+0

非常感谢,[OneTimeSetUp] - 属性正是我所搜索的。但是,你的意思是'你可以访问和测试所有其他公共方法,这些方法不能通过界面/合同访问'。这只适用于公共方法吗?我们如何测试私有和内部方法? – user2992131

+0

很高兴在这里:-)通常你不会直接测试私有方法。当他们从公共方法中调用时,他们会被间接测试。对于内部方法,您可以使用['InternalsVisibleTo'-attribute](https://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute(v = vs.110).aspx)。 – khlr

+0

非常感谢。 – user2992131