2013-03-24 50 views
0

对于一个项目,我需要知道在单元测试结束时调用了多少个方法。 (或者类似于Visual Studio中的调用层次结构(不是在运行时),我已经为此创建了一个测试项目,但是我只获取在单元测试项目中调用的方法返回的结果。从单元测试中引用项目的C#StackTrace

因此,例如I有一个类库与下面的类(组装):

public class Program 
{ 
    public void A() 
    { 
     B(); 
     C(); 
    } 

    public void B() 
    { 

    } 

    public void C() 
    { 
     B(); 
     D(); 
    } 

    public void D() 
    { 

    } 
} 

而且一个单元测试(组装)用以下试验方法

[TestMethod] 
    public void TestMethod1() 
    { 
     StackTrace stackTrace = new StackTrace(); 
     new Program().A(); 
     int count = stackTrace.FrameCount; 
    } 

    [TestMethod] 
    public void TestMethod2() 
    { 
     StackTrace stackTrace = new StackTrace(); 
     new Program().C(); 
     int count = stackTrace.FrameCount; 
    } 

在这两个单元测试计数= 12。当余检查stackTrace变量的属性我只能看到称为单元测试程序集的方法。有没有办法将类库程序集的调用包含在stackTrace中?

在此先感谢

+1

构建一个堆栈跟踪对象将获得构建它的代码的堆栈跟踪,它不会收集跟踪它的代码的堆栈跟踪。这意味着在您的测试方法中,您将获得堆栈跟踪,以便在每个测试方法的第一行中构建堆栈跟踪对象,其余方法不会影响此堆栈跟踪。 – 2013-03-24 12:42:53

+0

但是,当我将StackTrace的构造放置到testmethod的结尾时,结果仍然是一样的... – mrtentje 2013-03-24 14:04:57

+0

是的,因为它仍然只计算对**中**方法的调用。 – 2013-03-24 17:12:19

回答

0

您是否尝试过使用覆盖工具? (我会推荐dotCover

工具可以生成报告xml,json等,这样你就可以轻松地解析它们并使用结果进行进一步的计算。

+0

这可以通过编程调用吗? (没有UI?) – mrtentje 2013-03-24 12:19:21

+0

不幸的是,目前没有SDK,但是,您可以通过编程方式调用dotCover进程而没有问题 – 2013-03-24 12:27:27

0

看起来你需要一个测试覆盖工具。它将显示测试程序集的哪些方法被调用。 VisualStudio内置了一个。

+0

我想要做的一件事是以编程方式获取此信息,以便我可以使用此信息进行进一步计算。这可能吗? – mrtentje 2013-03-24 11:52:24

+0

测试覆盖工具将为您做很多计算,提供有用的报告。如果你真的想拦截整个应用程序中的方法调用(以统计调用次数),你可以使用CLR的Profiling API来完成。但是你可能需要为此写很多代码。 – alex 2013-03-24 11:56:11