c# - IIS 托管 WCF 服务 : Integration tests and code coverage

标签 c# wcf unit-testing integration-testing code-coverage

我为一个项目编写了一个 wcf 服务库。它可以托管在 IIS 和自托管服务中。

对于所有连接的外部系统,我提供了提供一些通用数据的 Mock 实现,这样服务(库)就可以保持运行和工作。它是一个经典的自动机/有限状态机。

引导时,所有数据源都已连接。在测试模式下,模拟实现是连接的。因此,当我运行测试时,服务库是从自托管服务“启动”的,而不是 IIS,并且状态机保持运行和处理数据包。

有没有办法从这样的运行中获得某种“测试覆盖率”。

如果我能分辨出我从模拟对象提供的示例数据命中了哪些代码路径,我将不胜感激。然后提供更多的测试数据以获得更高的覆盖率。

如果我无需提供“大量额外”测试代码就可以做到这一点,那就太好了。我认为模拟对象提供的数据已经涵盖了很多案例。但现在我还没有起点。

以下是一些代码示例,可以更清楚地说明其含义。代码当然大大简化了。

在一个非常简单的控制台应用程序中启动服务(自托管版本)

static void Main(string[] args)
{
    using (var host = new ServiceHost(typeof(MyServiceLib.Service.MyServiceLib)))
    {
        host.Open();
        Console.ReadLine();
        host.Close();
    }
}

在服务库中,从该代码调用构造函数

public MyServiceLib()
{
    Task.Factory.StartNew(this.Scaffold);
}

除了启动状态机什么都不做

private void Scaffold()
{
    // lots of code deleted for simplicity reasons
    var dataSource = new MockDataSource();

    // inject the mocked datasource
    this.dataManager = new DataManager(dataSource);

    // this runs in its own thread. There are parts that are started on a timer event.
    this.dataManager.Start();
}

public class DataManager : IDataManager
{
     public void Start()
     {
         while (this.IsRunning)
         {
             var data = this.dataSource.getNext();

             if (data != null)
             {
                 // do some work with the data retrieved
                 // lots of code paths will be hit from that
                 this.Process(data);
             }
             else
             {
                 Thread.Sleep(1000);
             }
         }
     }

     public void Process(IData data)
     {
        switch (data.PackageType)
        {
            case EnumPackageType.Single:
            {
                ProcessSingle(data);
                break;
            }
            case EnumPackageType.Multiple:
            {
                ProcessMultiple(data);
                break;
            }
            // here are lots of cases
            default:
            {
                Logger.Error("unknown package type");
                break;
            }
        }
     }
}

到目前为止我尝试了什么:

  1. 打开封面

有一个特殊的测试dll,可以创建如上所示的主机,但是无法正确创建主机,所以测试并没有真正开始。我收到“主机处于故障状态”错误消息。我关注了this mini-tutorial .尽管如此,我还是得到了一份覆盖率报告,计算出的覆盖率约为 20%。但是服务才刚刚开始,到目前为止还没有做任何工作。

  1. Visual Studio 性能工具

基本上描述了这些步骤in this article .我得到一个 myproject.coverage 文件,但我无法查看它,因为我只有 VS Professional,覆盖率似乎仅在 Test Premium 或 Ultimate 版本中使用。

除了尝试过这两个之外,我会接受任何显示如何启动和运行其中任何一个的答案(首选 openCover)。

将接受一个答案,该答案显示如何测试此设置并获得代码覆盖率,同时利用工具生成大部分代码(就像 pex 一样,但在试用后我发现它不会生成非常好的代码)。

最佳答案

查看服务的操作会有所帮助。

我从未尝试过在覆盖工具下运行这种“控制台类型”的应用程序。

我建议使用 NUnit(或任何其他单元测试框架;这显然不是单元测试,但该技术非常适合)来编写测试。

在测试中,你打开服务宿主,创建服务的客户端,让客户端对你的服务执行一些操作,然后关闭服务宿主。

在覆盖工具下运行这个测试,你应该完成了。

大约 7 年前,我用 NUnit 和 NCover 做到了这一点,当时使用的是它们的当前版本(如果我没记错的话,NCover 是免费软件)。

关于c# - IIS 托管 WCF 服务 : Integration tests and code coverage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28254987/

相关文章:

wcf - 如何在回调方向扩展 WCF?

c# - 如何使用 Autofac 将 WCF 服务实现注入(inject)到另一个 WCF 服务中

java - TestNG + Mockito + PowerMock - verifyStatic() 不起作用

c# - 查找出现次数最多的日期范围

c# - 数据库中的任务有多个程序处理它们——如何确保每个任务都被恰好处理一次?

linux - 单声道 : Is it possible to host a web/wcf service from console application?

angular - 在 Angular 中模拟 NgbModal

c# - 在 Windows 10 上隐藏和显示任务栏

c# - 为什么我必须在数据库连接字符串中包含 “workstation id” 和 "application name"属性才能正确查询 View ?

django - 在 Django 的基于类的 View 中模拟函数