IIS托管的WCF服务:集成测试和代码覆盖如何实现?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (45)

对于一个项目,我编写了一个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. OpenCover

与一个特殊的测试DLL会创建如上所示的主机,但主机无法正确创建,所以测试不会真正开始。我收到“主机处于故障状态”错误消息。我跟着这个迷你教程。尽管我得到的覆盖率报告的计算覆盖率约为20%。但服务刚刚开始,目前尚未开展任何工作。

  1. Visual Studio性能工具

本文主要介绍这些步骤。我得到一个myproject.coverage文件,但我无法查看它,因为我只有一个VS Professional,这个覆盖范围似乎只能用在Test Premium或Ultimate版本中。

除了尝试这两种方法之外,我会接受任何答案,展示如何使用这些方法来启动和运行(openCover首选)。

提问于
用户回答回答于

看起来像OpenCover,你实际上已经获得了覆盖范围,但服务正在进入Faulted状态,所以你需要从ServiceHost中找出故障并加以解决。

基本上你需要某种错误日志,我想尝试的第一件事是看系统事件日志(Win + R,eventvwr.msc,回车)。

还可以尝试收听ServiceHost上的故障事件:

host.Faulted += new EventHandler(host_faulted);
用户回答回答于

这将有助于查看服务的运作。

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

我会建议编写一个测试,让我们说NUnit(或任何其他单元测试框架;显然它不是单元测试,但技术非常适合)。

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

在覆盖率工具下运行此测试,应该完成。

扫码关注云+社区