【发布时间】:2015-03-31 01:20:42
【问题描述】:
对于一个项目,我编写了一个 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;
}
}
}
}
到目前为止我所尝试的:
- OpenCover
使用特殊的测试 dll 可以创建如上所示的主机,但无法正确创建主机,因此测试并没有真正开始。我收到“主机处于故障状态”错误消息。我关注了this mini-tutorial。尽管如此,我还是得到了一份覆盖率报告,计算出的覆盖率约为 20%。但是该服务才刚刚开始,到目前为止还没有做任何工作。
- Visual Studio 性能工具
基本上描述了这些步骤in this article。我得到了一个 myproject.coverage 文件,但我无法查看它,因为我只有一个 VS Professional,覆盖范围似乎只在 Test Premium 或 Ultimate 版中使用。
除了尝试过这两个之外,我将接受任何显示如何启动并运行其中任何一个的答案(首选 openCover)。
将接受显示如何测试此设置并获得代码覆盖率的答案,同时利用工具生成大部分代码(就像 pex 一样,但经过试用后,我发现它不会生成非常好的代码)。
【问题讨论】:
-
@RobertHarvey 谢谢你的链接。我对这个问题做了一些澄清。
-
请不要在您的问题中添加“编辑”;这不是一个论坛。 Stack Overflow 上的每个帖子都已经有一个detailed edit history,任何人都可以查看。
-
嗯,你的例子呢?
-
您的案例似乎不是唯一的。代码就是代码;覆盖就是覆盖。让我们更具体的唯一方法是查看您想要测试覆盖率的一些代码。
标签: c# wcf unit-testing integration-testing code-coverage