【问题标题】:Programmatically reading VS .coveragexml file in C#在 C# 中以编程方式读取 VS .coveragexml 文件
【发布时间】:2010-11-13 03:28:39
【问题描述】:

所以我有一些代码可以从 .coverage 文件中读取方法...

using (CoverageInfo info = CoverageInfo.CreateFromFile(this.myCoverageFile))
{

    CoverageDS ds = info.BuildDataSet();

    foreach (ICoverageModule coverageModule in info.Modules)
    {
        CodeModule currentModule = new CodeModule(coverageModule.Name);
        byte[] coverageBuffer = coverageModule.GetCoverageBuffer(null);

        using (ISymbolReader reader = coverageModule.Symbols.CreateReader())
        {
            Method currentMethod;
            while (reader.GetNextMethod(out currentMethod, coverageBuffer))
            {
                if (currentMethod != null)
                {
                    currentModule.Methods.Add(currentMethod);
                }
            }
        }

        returnModules.Add(currentModule);
    }
}

...但我也希望能够读取已导出到 xml 的 .coverage 文件。原因是 .coverage 文件要求源 dll 位于测量代码覆盖率时的确切位置,这对我不起作用。

当我尝试使用 CreateFromFile(string) 加载 coveragexml 文件时,出现以下异常。

Microsoft.VisualStudio.Coverage.Analysis.InvalidCoverageFileException 未处理 Message=Coverage 文件 “unittestcoverage.coveragexml”是 无效或损坏。

coveragexml 文件可以在 Visual Studio 中正常打开,所以我认为文件格式没有任何问题。

我知道 CoverageDS 可以导入 xml 文件,但 API 不够直观,我能找到的唯一使用示例是...

using(CoverageInfo info = CoverageInfo.CreateFromFile(fileString))
{
   CoverageDS data = info.BuildDataSet();
   data.ExportXml(xmlFile);
}

...它没有告诉我如何从该文件中实际读取覆盖率数据。

有人知道如何处理 .coveragexml 文件中的代码覆盖率数据吗?

【问题讨论】:

  • 对于未来的读者:在下面的 URL 中有一个“线索”。 “要将二进制 VSTest.Console 输出转换为 Microsoft CoverageDS XML 格式,您可以使用以下 V0.14 发行说明中引用的预构建应用程序之一,或者您可以构建以下转换器应用程序:”我 ~~think~~ “CoverageInfo.CreateFromFile”用于从 二进制文件(来自 VSTest.Console)而不是 trx 文件(只是 xml)加载。请参阅:wiki.jenkins-ci.org/display/JENKINS/MSTest+Plugin 我不知道 (d'oh) trx 文件只是 xml。 :(

标签: c# visual-studio-2010 code-coverage


【解决方案1】:

here 和链接的 ms_joc 博客可能是有关以编程方式处理代码覆盖率信息的最佳介绍。

我很确定您可以将“CreateInfoFromFile”与上述示例中导出的 .coverage 文件或 XML 文件一起使用。

更新: 如果coveragexml 作为参数传递,CreateInfoFromFile 将引发异常。这是一个替代方案:

CoverageDS dataSet = new CoverageDS();
dataSet.ImportXml(@"c:\temp\test.coveragexml");

foreach (CoverageDSPriv.ModuleRow module in dataSet.Module)
{
    Console.WriteLine(String.Format("{0} Covered: {1} Not Covered: {2}", module.ModuleName, module.LinesCovered, module.LinesNotCovered));
}

【讨论】:

  • 是的,我看过你提到的那个博客,我发现它是最好的和最有帮助的。如果您将导出的 xml 文件交给 CreateInfoFromFile 似乎会引发异常(这是我尝试的第一件事)。我会用它更新问题。
  • 用不同的方法更新。
  • 这正是我想要的。我设法仅使用 DataSet 接口提取数据,但这要好得多。
【解决方案2】:

您是否尝试过 CoverageDS.ReadXml(fileName_string) 方法?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2010-12-02
    • 1970-01-01
    • 2018-08-29
    • 2011-01-25
    相关资源
    最近更新 更多