对于一个项目,我编写了一个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;
}
}
}
}
到目前为止,我尝试了以下几点:
使用特殊的测试dll创建如上所示的主机,但主机无法正确创建,因此测试并未真正开始。我收到“主机处于故障状态”的错误消息。我跟踪了this mini-tutorial。尽管如此,我得到了一份覆盖率报告,计算出的覆盖率约为20%。但是服务才刚刚启动,到目前为止它还没有做任何工作。
这些步骤本质上是用in this article描述的。我得到了一个myproject.coverage文件,但我无法查看它,因为我只有一个VS专业版,覆盖范围似乎只在测试高级版或旗舰版中使用。
除了尝试过这两个之外,我会接受任何显示如何启动和运行其中任何一个的答案(openCover优先)。
我将接受一个答案,说明如何测试此设置并获得代码覆盖率,同时利用工具生成大部分代码(就像pex一样,但经过试验,我发现它生成的代码不是很好)。
发布于 2015-02-10 15:19:18
查看服务的操作将会有所帮助。
我从未尝试过在覆盖工具下运行这种“控制台式”的应用程序。
我建议使用NUnit (或任何其他单元测试框架;显然这不是单元测试,但该技术非常适合)编写测试。
在测试中,您将打开服务主机,创建服务的客户端,让客户端对您的服务执行一些操作,然后关闭服务主机。
在覆盖率工具下运行这个测试,您应该就完成了。
我在大约7年前用NUnit和NCover做过这件事,使用他们当时的版本(如果我没记错的话,NCover是自由软件)。
发布于 2015-07-29 18:34:28
看起来使用OpenCover您实际上获得了覆盖范围,但是服务正在进入Faulted
状态,因此您需要从您的ServiceHost捕获故障并对其进行寻址。
基本上,您需要某种类型的错误日志,我要做的第一件事就是查看系统事件日志(Win+R、eventvwr.msc、Enter)。
您还可以尝试侦听ServiceHost上的故障事件:
host.Faulted += new EventHandler(host_faulted);
下面是另一个解决这个问题的答案的链接:How to find out the reason of ServiceHost Faulted event
发布于 2018-03-01 06:03:27
我建议测试您的业务逻辑,而不是引导程序代码。我的意思是测试DataManager类,而不是宿主和初始化代码。您可以使用单元测试框架之一来编写单元测试,例如NUnit。然后,您可以使用Resharper Ultimate在Visual Studio中运行测试,也可以在与代码覆盖工具(如OpenCover或dotCover )的持续集成中运行测试,以获得代码覆盖。
[TestFixture]
public class DataManagerTests
{
[Test]
public void Process_Single_Processed()
{
// Arrange
IData data = new SingleData();
DataManager dataManager = new DataManager();
// Act
dataManager.Process(data);
// Assert
// check data processed correctly
}
}
https://stackoverflow.com/questions/28254987
复制相似问题