2009-01-06 27 views
21

यदि मैं एमएसटीएस्ट का उपयोग कर रहा हूं तो दृश्य स्टूडियो के भीतर कोड कवरेज का परीक्षण करने का कोई तरीका है? या मुझे एनसीओवर खरीदना है?एमएसटीएस्ट कोड कवरेज

क्या एनसीओवर एंटरप्राइज़ पैसे के लायक है या पुराने बीटा पर्याप्त हैं यदि माइक्रोसॉफ्ट कोड कवरेज करने के लिए टूल में निर्मित नहीं करता है?

संपादित करें: वी.एस. उत्पादों और जो का विवरण वाले कोड कवरेज http://www.microsoft.com/visualstudio/en-us/products/teamsystem/default.mspx

TestDriven.NET (http://testdriven.net/) अगर आपके वी.एस. संस्करण इसका समर्थन नहीं करता इस्तेमाल किया जा सकता शामिल हैं।

उत्तर

14

हां, आप विजुअल स्टूडियो के भीतर से कोड कवरेज जानकारी पा सकते हैं, बशर्ते आपके पास विजुअल स्टूडियो का एक संस्करण हो जो टीम सिस्टम जैसे कार्यक्षमता प्रदान करता हो। वीएस.NET में यूनिट परीक्षण स्थापित करते समय, localtestrun.testrunconfig फ़ाइल को समाधान के हिस्से के रूप में बनाया और जोड़ा जाएगा। इस फ़ाइल को डबल-क्लिक करें और संवाद के बाईं ओर विकल्प कोड कवरेज विकल्प खोजें। उन असेंबली का चयन करें जिनके लिए आप कोड कवरेज जानकारी एकत्र करना चाहते हैं और फिर इकाई परीक्षणों को फिर से चलाएं। कोड कवरेज जानकारी एकत्र की जाएगी और उपलब्ध है। कोड कवरेज जानकारी प्राप्त करने के लिए परीक्षण परिणाम विंडो खोलें और कोड कवरेज परिणाम बटन पर क्लिक करें, जो परिणाम के साथ एक वैकल्पिक विंडो खुल जाएगा।

13

एमएसटीएस्ट में कोड कवरेज शामिल है, कम से कम यह वीएस के संस्करण में है। हालांकि, आपको testrunconfig में वाद्ययंत्र को सक्षम करने की आवश्यकता है, जो कि केवल बदसूरत और एक प्रमुख पिटा है।

TestDriven.NET का उपयोग करना एक आसान विकल्प है, जो एमएसटीएस्ट के लिए भी कवरेज स्वचालित कर सकता है। और चूंकि यह एमएसटीएस्ट कोर का उपयोग करता है, फिर भी आपको रंगीनकरण (कवर कोड के लिए लाल/नीली रेखाएं) जैसी सभी वीएस भलाई मिलती है। here देखें (एक स्क्रीनकास्ट सहित), या एक छवि का कहना है के बाद से एक हजार शब्दों:

alt text http://www.mutantdesign.co.uk/weblog/images/DrivingMSTestandTeamCoverageusingTes.NET_F424/MSTestAndTeamCoverage_thumb1.gif

0

आप दृश्य स्टूडियो अंतिम संस्करण नहीं है, तो आप भी इस MSBuild कार्य कोड कवरेज रिपोर्ट जनरेट करने के लिए उपयोग कर सकते ।

http://archive.msdn.microsoft.com/vscoveragetoxmltask

+0

लिंक टूटी हुई है। यही कारण है कि लिंक केवल जवाब फेंक रहे हैं। – James

6

भविष्य पाठकों के लिए:

वाह, यह नहीं मजेदार था। मुझे उम्मीद है कि यह इंटरनेट भूमि में किसी को बाहर करने में मदद करता है।

कृपया ध्यान दें कि "CodeCoverage.exe" का अस्तित्व आपके पास विजुअल स्टूडियो के संस्करण पर निर्भर हो सकता है। और आपको बिल्ड सर्वर में वीएस (कुछ वर्धित संस्करण) स्थापित करना पड़ सकता है।

set __msTestExe=C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\MSTest.exe 
set __codeCoverageExe=C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe 

rem (the below is a custom C# console application, code seen below) 
set __customCodeCoverageMergerExe=CoverageCoverterConsoleApp.exe 

rem below exe is from https://www.microsoft.com/en-us/download/details.aspx?id=21714 
set __msXslExe=C:\MyProgFiles\MsXslCommandLine\msxsl.exe 

REM the below calls will create the binary *.coverage files 
"%__codeCoverageExe%" collect /output:"D:\BuildStuff\TestResults\AAA_DynamicCodeCoverage.coverage" "%__msTestExe%" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.One.dll" /resultsfile:"D:\BuildStuff\TestResults\My.UnitTests.One.trx" 
"%__codeCoverageExe%" collect /output:"D:\BuildStuff\TestResults\BBB_DynamicCodeCoverage.coverage" "%__msTestExe%" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.Two.dll" /resultsfile:"D:\BuildStuff\TestResults\My.UnitTests.Two.trx" 
"%__codeCoverageExe%" collect /output:"D:\BuildStuff\TestResults\CCC_DynamicCodeCoverage.coverage" "%__msTestExe%" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.Three.dll" /resultsfile:"D:\BuildStuff\TestResults\My.UnitTests.Three.trx" 


rem below, the first argument is the new file, the 2nd through "N" args are the result-files from the three "%__codeCoverageExe%" collect above 
rem this will take the three binary *.coverage files and turn them into one .xml file 
"%__customCodeCoverageMergerExe%" "D:\BuildStuff\TestResults\DynamicCodeCoverage.merged.coverage.converted.xml" "D:\BuildStuff\TestResults\AAA_DynamicCodeCoverage.coverage" "D:\BuildStuff\TestResults\BBB_DynamicCodeCoverage.coverage" "D:\BuildStuff\TestResults\CCC_DynamicCodeCoverage.coverage" 


"%__msXslExe%" "D:\BuildStuff\TestResults\DynamicCodeCoverage.merged.coverage.converted.xml" "D:\BuildStuff\Xsl\VSCoverageToHtml.xsl" -o "D:\BuildStuff\TestResults\CodeCoverageReport.html" 

तुम भी एक कॉल

REM the below calls will create the binary *.coverage files 
"%__codeCoverageExe%" collect /output:"D:\BuildStuff\TestResults\ZZZ_DynamicCodeCoverage.coverage" "%__msTestExe%" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.One.dll" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.Two.dll" /testcontainer:"D:\BuildStuff\BuildResults\My.UnitTests.Three.dll" /resultsfile:"D:\BuildStuff\TestResults\My.UnitTests.AllOfThem.trx" 


rem below, the first argument is the new file, the 2nd through "N" args are the result-files from the three "%__codeCoverageExe%" collect above 
rem this will take the one binary *.coverage files and turn them into one .xml file 
"%__customCodeCoverageMergerExe%" "D:\BuildStuff\TestResults\DynamicCodeCoverage.merged.coverage.converted.xml" "D:\BuildStuff\TestResults\ZZZ_DynamicCodeCoverage.coverage" 


"%__msXslExe%" "D:\BuildStuff\TestResults\DynamicCodeCoverage.merged.coverage.converted.xml" "D:\BuildStuff\Xsl\VSCoverageToHtml.xsl" -o "D:\BuildStuff\TestResults\CodeCoverageReport.html" 

VSCoverageToHtml.xsl

में 3 UnitTests.dlls गठजोड़ कर सकते हैं मैं भी इंटरनेट में कुछ XSL पाया। (नीचे 3 लिंक बहुत ज्यादा एक ही XSL हैं)

http://codetuner.blogspot.com/2011_09_01_archive.html

http://jp.axtstar.com/?page_id=258

http://codetuner.blogspot.com/2011/09/convert-mstest-code-covarage-results-in.html

मैं XSL यहाँ उन यूआरएल मरने भविष्य में पोस्टिंग कर रहा हूँ "बस मामले में" । नीचे दिए गए xsl को "VSCoverageToHtml.xsl" नामक फ़ाइल में रखें (जैसा ऊपर उल्लिखित है)।

<?xml version="1.0" encoding="utf-8"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="html" indent="yes"/> 
    <xsl:template match="/" > 
     <html> 
      <head> 

       <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"/>   

       <style type="text/css"> 
        th { 
        background-color:#dcdcdc; 
        border:solid 1px #a9a9a9; 
        text-indent:2pt; 
        font-weight:bolder; 
        } 
        #data { 
        text-align: center; 
        } 
       </style> 

       <script language="JavaScript" type="text/javascript" > 

        function CreateJavescript(){ 
        var fileref=document.createElement('script'); 
        fileref.setAttribute("type","text/javascript"); 
        fileref.setAttribute("src", "script1.js"); 
        document.getElementsByTagName("head")[0].appendChild(fileref); 
        } 

        function toggleDetail(control) { 
        var ctrlId = $(control).attr('Id'); 
        $("tr[id='"+ctrlId +"']").toggle(); 
        }     

       </script> 

       <title>Code Coverage Report</title> 
      </head> 
      <body onload='CreateJavescript()' > 
       <h1>Code Coverage Report</h1> 
       <table border="1"> 
        <tr> 
         <th colspan="3"/> 
         <th>Name</th> 
         <th>Blocks Covered</th> 
         <th>Blocks Not Covered</th> 
         <th>Coverage</th> 
        </tr> 
        <xsl:apply-templates select="//CoverageDSPriv/Module" /> 
       </table> 
      </body> 
     </html> 
    </xsl:template> 

    <xsl:template match="Module"> 
     <xsl:variable name="parentId" select="generate-id(./..)" /> 
     <xsl:variable name="currentId" select="generate-id(.)" /> 
     <tr id="{$parentId}"> 
      <td id="{$currentId}"  colspan="3"    onClick="toggleDetail(this)"  onMouseOver="this.style.cursor= 'pointer' ">[+]</td> 
      <td> 
       <xsl:value-of select="ModuleName" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksCovered" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksNotCovered" /> 
      </td> 
      <xsl:call-template name="CoverageColumn"> 
       <xsl:with-param name="covered" select="BlocksCovered" /> 
       <xsl:with-param name="uncovered" select="BlocksNotCovered" /> 
      </xsl:call-template> 
     </tr> 
     <xsl:apply-templates select="NamespaceTable" /> 
     <tr id="{$currentId}-end" style="display: none;"> 
      <td colspan="5"/> 
     </tr> 
    </xsl:template> 

    <xsl:template match="NamespaceTable"> 
     <xsl:variable name="parentId" select="generate-id(./..)" /> 
     <xsl:variable name="currentId" select="generate-id(.)" /> 
     <tr id="{$parentId}" style="display: none;"> 
      <td> - </td> 
      <td id="{$currentId}" 
       colspan="2" 
       onClick="toggleDetail(this)" 
       onMouseOver="this.style.cursor= 'pointer' ">[+]</td> 
      <td> 
       <xsl:value-of select="NamespaceName" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksCovered" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksNotCovered" /> 
      </td> 
      <xsl:call-template name="CoverageColumn"> 
       <xsl:with-param name="covered" select="BlocksCovered" /> 
       <xsl:with-param name="uncovered" select="BlocksNotCovered" /> 
      </xsl:call-template> 
     </tr> 
     <xsl:apply-templates select="Class" /> 
     <tr id="{$currentId}-end" style="display: none;"> 
      <td colspan="5"/> 
     </tr> 
    </xsl:template> 

    <xsl:template match="Class"> 
     <xsl:variable name="parentId" select="generate-id(./..)" /> 
     <xsl:variable name="currentId" select="generate-id(.)" /> 
     <tr id="{$parentId}" style="display: none;"> 
      <td> - </td> 
      <td> - </td> 
      <td id="{$currentId}" 
       onClick="toggleDetail(this)" 
       onMouseOver="this.style.cursor='pointer' ">[+]</td> 
      <td> 
       <xsl:value-of select="ClassName" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksCovered" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksNotCovered" /> 
      </td> 
      <xsl:call-template name="CoverageColumn"> 
       <xsl:with-param name="covered" select="BlocksCovered" /> 
       <xsl:with-param name="uncovered" select="BlocksNotCovered" /> 
      </xsl:call-template> 
     </tr> 
     <xsl:apply-templates select="Method" /> 
     <tr id="{$currentId}-end" style="display: none;"> 
      <td colspan="5"/> 
     </tr> 
    </xsl:template> 

    <xsl:template match="Method"> 
     <xsl:variable name="parentId" select="generate-id(./..)" /> 
     <tr id="{$parentId}" style="display: none;"> 
      <td> -</td> 
      <td> - </td> 
      <td> - </td> 
      <td> 
       <xsl:value-of select="MethodName" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksCovered" /> 
      </td> 
      <td id="data"> 
       <xsl:value-of select="BlocksNotCovered" /> 
      </td> 
      <xsl:call-template name="CoverageColumn"> 
       <xsl:with-param name="covered" select="BlocksCovered" /> 
       <xsl:with-param name="uncovered" select="BlocksNotCovered" /> 
      </xsl:call-template> 
     </tr> 
    </xsl:template> 

    <xsl:template name="CoverageColumn"> 
     <xsl:param name="covered" select="0" /> 
     <xsl:param name="uncovered" select="0" /> 
     <td id="data"> 
      <xsl:variable name="percent" 
       select="($covered div ($covered + $uncovered)) * 100" /> 
          <xsl:attribute name="style"> 
       background-color: 
       <xsl:choose> 
        <xsl:when test="number($percent >= 90)">#86ed60;</xsl:when> 
        <xsl:when test="number($percent >= 70)">#ffff99;</xsl:when> 
        <xsl:otherwise>#FF7979;</xsl:otherwise> 
       </xsl:choose> 
      </xsl:attribute> 
      <xsl:if test="$percent > 0"> 
       <xsl:value-of select="format-number($percent, '###.##')" />% 
      </xsl:if> 
      <xsl:if test="$percent = 0"> 
       <xsl:text>0.00%</xsl:text> 
      </xsl:if> 
     </td> 
    </xsl:template> 
</xsl:stylesheet> 

यहां सहायता के लिए एक छोटा कमांड लाइन उपकरण है।

https://www.microsoft.com/en-us/download/details.aspx?id=21714

using System; 

using Microsoft.VisualStudio.Coverage.Analysis; 
using System.Collections.Generic; 

/* References 
\ThirdPartyReferences\Microsoft Visual Studio 11.0\Microsoft.VisualStudio.Coverage.Analysis.dll 
\ThirdPartyReferences\Microsoft Visual Studio 11.0\Microsoft.VisualStudio.Coverage.Interop.dll 
*/ 

namespace MyCompany.VisualStudioExtensions.CodeCoverage.CoverageCoverterConsoleApp 
{ 
    class Program 
    { 
     static int Main(string[] args) 
     { 
      if (args.Length < 2) 
      { 
       Console.WriteLine("Coverage Convert - reads VStest binary code coverage data, and outputs it in XML format."); 
       Console.WriteLine("Usage: ConverageConvert <destinationfile> <sourcefile1> <sourcefile2> ... <sourcefileN>"); 
       return 1; 
      } 

      string destinationFile = args[0]; 
      //destinationFile = @"C:\TestResults\MySuperMergedCoverage.coverage.converted.to.xml"; 

      List<string> sourceFiles = new List<string>(); 

      //files.Add(@"C:\MyCoverage1.coverage"); 
      //files.Add(@"C:\MyCoverage2.coverage"); 
      //files.Add(@"C:\MyCoverage3.coverage"); 


      /* get all the file names EXCEPT the first one */ 
      for (int i = 1; i < args.Length; i++) 
      { 
       sourceFiles.Add(args[i]); 
      } 

      CoverageInfo mergedCoverage; 
      try 
      { 
       mergedCoverage = JoinCoverageFiles(sourceFiles); 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("Error opening coverage data: {0}", e.Message); 
       return 1; 
      } 

      CoverageDS data = mergedCoverage.BuildDataSet(); 

      try 
      { 
       data.WriteXml(destinationFile); 
      } 
      catch (Exception e) 
      { 

       Console.WriteLine("Error writing to output file: {0}", e.Message); 
       return 1; 
      } 

      return 0; 
     } 

     private static CoverageInfo JoinCoverageFiles(IEnumerable<string> files) 
     { 
      if (files == null) 
       throw new ArgumentNullException("files"); 

      // This will represent the joined coverage files 
      CoverageInfo returnItem = null; 
      string path; 

      try 
      { 
       foreach (string sourceFile in files) 
       { 
        // Create from the current file 

        path = System.IO.Path.GetDirectoryName(sourceFile); 
        CoverageInfo current = CoverageInfo.CreateFromFile(sourceFile, new string[] { path }, new string[] { path }); 

        if (returnItem == null) 
        { 
         // First time through, assign to result 
         returnItem = current; 
         continue; 
        } 

        // Not the first time through, join the result with the current 
        CoverageInfo joined = null; 
        try 
        { 
         joined = CoverageInfo.Join(returnItem, current); 
        } 
        finally 
        { 
         // Dispose current and result 
         current.Dispose(); 
         current = null; 
         returnItem.Dispose(); 
         returnItem = null; 
        } 

        returnItem = joined; 
       } 
      } 
      catch (Exception) 
      { 
       if (returnItem != null) 
       { 
        returnItem.Dispose(); 
       } 
       throw; 
      } 

      return returnItem; 
     } 
    } 
} 

यह भी देखें:

Code Coverage files merging using code in VS 2012 Dynamic Code Coverage

संबंधित मुद्दे