如何为WCF项目进行集成测试?

Att*_*lah 5 .net c# tfs tfs2010

我一直在开发一个WCF项目,它将公开将由公司外部的客户端使用的Web服务(基于HTTP).我打算将TFS 2010用于持续集成.

我想做持续集成和集成测试.

我的问题是:

- 做集成测试意味着我必须创建一个模仿生产环境的测试环境吗?-OR这是否意味着我只需要从我的单元测试工具开始调用我的WCF,数据库和其他对象而不依赖于模拟?例如 :

[TestClass]
public class ServiceIntegrationTest
{
    private static ServiceHost serviceHost;

    [ClassInitialize]
    public static void MyClassInitialize(TestContext testContext)
    {
        serviceHost = new ServiceHost(typeof(Service1), new [] { new Uri("http://127.0.0.1:8001/") });
        serviceHost.AddServiceEndpoint(typeof(IService1), new BasicHttpBinding(), "Service1");
        serviceHost.Open();
    } 
Run Code Online (Sandbox Code Playgroud)

- 我真的不明白如何进行这项工作. - 有没有关于如何实现这一目标的真实.NET(WCF)项目的教程?

RQD*_*QDQ 2

我不是如何使用模拟和其他内容正确分解单元测试的专家,但我可以分享我使用 WCF/数据库后端进行集成测试的经验。

基本上,我们使用单例来处理所有启动代码。换句话说,MyClassInitialize 方法将调用一个静态方法,以确保服务主机/数据库启动并运行。这样,我们就不必为每组单元测试设置/拆除后端。

[ClassInitialize]
public static void MyClassInitialize(TestContext testContext)
{
    GlobalBackend.EnsureStarted();
} 
Run Code Online (Sandbox Code Playgroud)

我不知道网上有任何例子,你可能需要做更多的谷歌搜索。

至于以什么粒度编写测试,您谈到了集成测试。听起来您可能想测试附加到真实数据库的服务调用。假设您的服务中融入了一些 CRUD 功能,一个单元测试(在此上下文中的集成测试)可能会创建一个小部件(或其他),然后执行 loadWidget 调用以确保正确创建小部件。

在一个单元测试中要做多少测试(取决于您是进行集成测试还是更细粒度的单元测试)是一个可以写满很多书的主题。

编辑:您可能还需要对数据库/服务进行一些清理/关闭:

有关AssemblyCleanup 属性的 MSDN 页面。

[AssemblyCleanup()]
public static void AssemblyCleanup()
{
   GlobalBackend.ShutDown();
}
Run Code Online (Sandbox Code Playgroud)

当然,这可能导致将所有启动代码放入:

[AssemblyInitialize()]
public static void AssemblyInit(TestContext context)
{
      GlobalBackend.EnsureStarted();
}
Run Code Online (Sandbox Code Playgroud)

所以现在我记得更清楚了 - 我们最终做到了这一点(更少的代码)