123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429 |
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
- <html>
- <head>
- <!-- $Id: NCoverFAQ.html 247 2007-04-26 15:17:46Z peterwald $ -->
- <title></title>
- <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
- <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
- <style> body { font-size: 10pt; font-family: Verdana; }
- p.title { font-size: 20pt; font-weight: bold; }
- .subtitle { color: maroon; }
- p.question { font-weight: bold; }
- pre { font-size: 10pt; font-family: Courier; }
- pre.usage { background-color: #F0F0F0; }
- .quote { background-color: #F0F0F0; margin-left: 36pt;}
- .method { color: maroon; font-size: 10pt; font-weight: bold; }
- .hdrcell { background-color: #DDEEFF; font-size: 10pt; }
- .datacell { background-color: #FFFFEE; text-align: right; font-size: 10pt; }
- .hldatacell { background-color: #FFCCCC; text-align: right; font-size: 10pt; }
- .box { border: 1px solid; padding: 10px; }
- </style>
- </head>
- <body>
- <P class="title">NCover FAQ</P>
- <P>If you have questions that this document does not address, contact <A href="mailto:peter@waldschmidt.com">
- Peter Waldschmidt</A> or try the <A href="http://ncover.org/">NCover Forums</A>.</P>
- <P class="question">1. What is code coverage analysis?</P>
- <P class="answer">A code coverage analyzer monitors your code at runtime and
- records information about which lines of code were executed. NCover shows each
- sequence point in your application along with the number of times that point
- was executed. Sequence points are generated by the compiler and stored in the
- debug information (.pdb) files. A sequence point basically corresponds to a
- single program statement (often a line of code) in your high-level language.</P>
- <P class="question">2. Why would I want to do code coverage analysis?</P>
- <P class="answer">Unit test suites are often used as a quality tool during the
- development process to keep the codebase stable as it changes and expands.
- Tools such as <A href="http://nunit.org/">NUnit</A> are often used to run and
- report on the test suites. However, when implementing unit testing in your
- build process, you have no way of knowing how much of your code the unit tests
- are actually testing. This is where code coverage comes in. You can run NUnit
- within NCover and use the code coverage report to determine which code was not
- tested by that particular test suite.</P>
- <P class="question">3. What versions of the CLR does NCover support?</P>
- <P class="answer">
- NCover 1.5.x requires the .NET framework version 2.0.50727 to be installed; however,
- the application being profiled can be written against any shipping version of the
- framework. NCover
- has been tested profiling coverage of .NET 2.0, .NET 1.1 and .NET 1.0 applications.</P>
- <P class="question">4. Which version of NCover should I install?</p>
- <P class="answer">
- If you have the .NET 2.0 framework installed on your machine then you should use
- the latest NCover version available. NCover as of version 1.5 can profile .NET 2.0, 1.1 and 1.0 applications.</p>
- <p class="answer">
- For development teams who do not have the .NET framework 2.0 installed but do have
- the .NET framework version 1.1.4322, you can
- try NCover 1.3.3. Note however that this version is no longer supported as
- it has a number of known issues and limitations.</p>
- <P class="question">5. What is the command line syntax for NCover?</P>
- <P class="answer">Here is the usage info from the NCover command line (for NCover versions from 1.5.6
- only):</P>
- <pre class="usage">NCover.Console [<command line> [<command args>]]
- [//svc <service name>]
- [//iis]
- [//a <assembly list>]
- [//w <working directory>]
- [//ea <exclusion list>]
- [//reg]
- [//x <xml output file>]
- [//s [<settings file>]] [//r [<settings file>]]
- [//v] [//q]
- [//l <log file>]
- //svc For profiling windows services
- //iis For profiling web applications
- //a List of assemblies to profile separated by semi-colons i.e. "MyAssembly1;MyAssembly2". Do not include paths or suffixes.
- //w Working directory for profiled application
- //ea List of attributes marking classes or methods to exclude from coverage
- //reg Register profiler temporarily for user. (helps with xcopy deployment)
- //x Specify coverage output file. (default: coverage.xml).
- //pm Specify name of process to profile (i.e. myapp.exe)
- //s Save settings to a file (defaults: NCover.Settings)
- //r Use settings file, overriding other settings (default: NCover.Settings)
- //l Specify profiler log file (default: coverage.log).
- //q No logging (quiet)
- //v Enable verbose logging (show instrumented code)
- </pre>
- <UL>
- <LI><command line> - This argument specifies the command-line of the .NET application
- you want to analyze.
- Any command line arguments not starting with // will be passed
- through to that application. NCover will profile the running application until it has exited. See below for examples.<li>//svc - This option is an alternative to the <command line>
- for profiling windows services, which cannot be run directly as executables. NCover
- will start the service (stopping it first if already running) and profile coverage
- until the windows service is stopped.</li>
- <li>//iis - This option is an alternative to the <command line> for profiling
- web applications. NCover will start the IISAdmin and W3C
- services (stopping first if currently running) and profile coverage until the IISAdmin
- service is stopped.<br />
- </li>
- <li>//a - This command-line argument specifies the assemblies that you want to analyze.
- NCover can only analyze assemblies that have .pdb files included with them. If
- you do not specify the //a argument, NCover will attempt to analyze every loaded
- assembly that has debug information available. Note that the assembly name arguments are
- the module name within the assembly, not the physical file name. e.g. "MyAssembly"
- rather than "MyAssembly.dll".<li>//w - If the application being profiled requires the
- working directory to be set to something other than the current directory you are
- executing the command line from then you can override it with this argument.</li>
- <li>//ea - You can choose to exclude classes and methods
- from coverage statistics by defining .NET attribute(s) and applying it to the affected
- code. When using this argument you must specify the full type namespace of these
- attribute(s) separated by semi-colons. See below for an example.<br />
- </li>
- <li>//reg - NCover requires a COM registration of the CoverLib.dll assembly containing
- the profiler, which is performed automatically by the default .msi installation.
- If you require an xcopy style deployment of NCover like many other .NET tools, then
- you can use this argument which will temporarily register the profiler while performing
- coverage. This feature was added in NCover 1.5.6.</li>
- <li>//x - The output of NCover is an xml file (example below). Use this argument to
- specify an alternate filename to "coverage.xml" in the current directory.<br />
- </li>
- <li>//pm - This setting tells NCover to ignore processes that don't have the specified process module name.
- This is the name of the executable (i.e. myapp.exe). This setting is useful in cases, where your NCover
- command spawns a series of child processes. Using this setting will help NCover determine which process to profile.
- </li>
- <li>//s - You may find it more convenient to use a settings file rather than specifying
- a long list of command line arguments for running NCover. If you get the NCover
- command line working as you would like it and then use the //s argument it will
- save the required arguments as an xml file that can then be used by the //r argument
- below.</li>
- <li>//r - For use when you have used //s to construct an NCover settings file containing
- your command line arguments. e.g. "ncover.console.exe //r NCover.Settings"<br />
- </li>
- <li>//l - The coverage log file can provide an insight if the desired coverage output
- is not obtained. Useful information you may find to assist you includes which assemblies
- were loaded by NCover, their file paths and which of those it found the .pdb build
- symbols for. Use this argument to specify an alternative log file name or location
- to coverage.log in the current directory.</li>
- <li>//q - Suppresses writing the coverage.log file.</li>
- <li>//v - This command-line argument makes the profiler emit all the original IL and
- modified IL instructions to the coverage log. This is useful for debugging
- purposes. Beware that this can make your coverage log file very large!
- </li>
- </UL>
- <P class="question">6. Does NCover required a special compilation step for my code?</P>
- <P class="answer">No. Some code coverage tools change your source code and force
- you to recompile it into a special build. NCover is designed to work
- on shipping code. NCover uses the .NET Framework profiling API to monitor
- your code. It does require build symbols, but can be run on release code
- without any modifications.</P>
- <P class="question">7. How does NCover work?</P>
- <P class="answer">NCover uses the .NET Framework profiler API to monitor an
- application's execution. When a method is loaded by the CLR, NCover retrieves
- the IL and replaces it with instrumented IL code. NCover does not change
- your original IL code, it simply inserts new code to update a visit
- counter at each sequence point. Upon
- request, (usually after the .NET process has shut down) the profiler outputs statistics
- to the coverage file.
- </P>
- <P class="question">
- 8. What is the output of NCover?</P>
- <P class="answer">NCover generally writes out three files after analysis
- completes.
- <ul>
- <li>
- Coverage.log - This file is a log of the events and messages from the profiler
- during the analysis process. Most of the time, error messages are recorded in
- this log. If you enable verbose logging, the coverage log will contain
- disassembly of the original and instrumented IL code. Verbose logging is not recommended for
- normal use.<li>
- Coverage.xml - This file is the analysis output of NCover. You can see an
- example of the output below.
- <LI>
- Coverage.xsl - This file is a simple XML transformation that makes the XML
- output easily readable.
- </LI>
- </ul>
- <span class="subtitle">Example XML output</span>
- <div class="box"><pre><method class="NCoverTest.ClassLoaded" name="HasDeadCode">
- <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
- column="13" line="48" endcolumn="58" endline="48" visitcount="1" />
- <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
- column="13" line="49" endcolumn="22" endline="49" visitcount="1" />
- <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
- column="17" line="50" endcolumn="24" endline="50" visitcount="1" />
- <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
- column="13" line="51" endcolumn="48" endline="51" visitcount="0" />
- <seqpnt document="C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs"
- column="9" line="52" endcolumn="10" endline="52" visitcount="0" />
- </method></pre>
- </div>
- <p></p>
- <span class="subtitle">Example transformed output</span>
- <div class="box">
- <DIV class="method">NCoverTest.ClassLoaded.HasDeadCode</DIV>
- <TABLE id="Table1" borderColor="black" cellSpacing="0" cellPadding="3" border="1">
- <TBODY>
- <TR>
- <TD class="hdrcell">Visit Count</TD>
- <TD class="hdrcell">Line</TD>
- <TD class="hdrcell">Column</TD>
- <TD class="hdrcell">End Line</TD>
- <TD class="hdrcell">End Column</TD>
- <TD class="hdrcell">Document</TD>
- </TR>
- <TR>
- <TD class="datacell">1</TD>
- <TD class="datacell">48</TD>
- <TD class="datacell">13</TD>
- <TD class="datacell">48</TD>
- <TD class="datacell">58</TD>
- <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
- </TR>
- <TR>
- <TD class="datacell">1</TD>
- <TD class="datacell">49</TD>
- <TD class="datacell">13</TD>
- <TD class="datacell">49</TD>
- <TD class="datacell">22</TD>
- <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
- </TR>
- <TR>
- <TD class="datacell">1</TD>
- <TD class="datacell">50</TD>
- <TD class="datacell">17</TD>
- <TD class="datacell">50</TD>
- <TD class="datacell">24</TD>
- <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
- </TR>
- <TR>
- <TD class="hldatacell">0</TD>
- <TD class="datacell">51</TD>
- <TD class="datacell">13</TD>
- <TD class="datacell">51</TD>
- <TD class="datacell">48</TD>
- <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
- </TR>
- <TR>
- <TD class="hldatacell">0</TD>
- <TD class="datacell">52</TD>
- <TD class="datacell">9</TD>
- <TD class="datacell">52</TD>
- <TD class="datacell">10</TD>
- <TD class="datacell">C:\Dev\Utilities\ncover\NCoverTest\NCoverTest.cs</TD>
- </TR>
- </TBODY>
- </TABLE>
- </div>
- <P>Suggested usages of the coverage.xml output are to display it in the <a href="http://ncoverexplorer.org/">
- NCoverExplorer</a> gui with the source
- code highlighted, to generate html reports, or to include it in your continuous build server reports such as CruiseControl.Net.
- For more information on these options see below in the FAQ.</P>
- <P></P>
- <P class="question">
- 9. How do I use coverage exclusions?</P>
- <p>
- First you should define an attribute to markup your excluded code with. You will
- likely want to put this in a common assembly to make it reusable, or indeed within
- a "CommonAssemblyInfo.cs" that you include in all your application assemblies.</p>
- <P></P>
- <pre class="usage">namespace MyNamespace {
- class CoverageExcludeAttribute : System.Attribute { }
- }</pre>
- <p>
- Apply the attribute to the C# classes and/or methods you wish to mark as excluded
- from code coverage statistics:</p>
- <P></P>
- <pre class="usage"> [CoverageExclude]
- private void SomeMethodToExclude() {} </pre>
- <p>
- Finally, ensure you pass the full qualified attribute information in the NCover command line:</p>
- <P></P>
- <pre class="usage"> NCover.Console MyApplication.exe //ea MyNamespace.CoverageExcludeAttribute </pre>
- <p>
- Note that if you are using the <a href="http://testdriven.net/">TestDriven.Net</a>
- VS.Net add-in to "Test with Coverage" it will automatically
- pass through "//ea CoverageExcludeAttribute"
- which you should define without a namespace like above. For further information refer to this
- <a href="http://weblogs.asp.net/nunitaddin/archive/2006/10/04/CoverageExclude.aspx">
- blog entry</a>.</p>
- <P class="question">
- 10. Examples</P>
- <p>
- Coverage while running a simple executable until it exits:</p>
- <P></P>
- <pre class="usage"> NCover.Console MyApplication.exe</pre>
- <p>
- Coverage while running all the unit tests in an assembly using NUnit, profiling
- all loaded assemblies with .pdb build symbols:</p>
- <P></P>
- <pre class="usage"> NCover.Console nunit-console.exe MyApplication.Tests.dll</pre>
- <p>
- Coverage of only a subset of loaded assemblies while running unit tests:</p>
- <P></P>
- <pre class="usage"> NCover.Console nunit-console.exe MyApplication.Tests.dll //a MyApplication.Core;MyApplication.Utilities</pre>
- <p>
- Coverage of a windows service. Stop the service to generate the coverage output:</p>
- <P></P>
- <pre class="usage"> NCover.Console //svc MyServiceName</pre>
- <p>
- Coverage of an ASP.Net application. Stop the IIS service to generate the coverage
- output:</p>
- <P></P>
- <pre class="usage"> NCover.Console //iis</pre>
- <P class="question">
- 11. Where can I get help or support?</P>
- <P class="answer">
- Your best approach is to browse the <a href="http://ncover.org/site/forums/default.aspx">
- NCover forums</a> as well as the <a href="http://ncover.org/SITE/blogs/default.aspx">
- blog</a> by the author Peter Waldschmidt. If you cannot find a similar issue
- mentioned feel free to post your query and perhaps someone can help.</P>
- <P class="question">
- 12. How do I "xcopy deploy" NCover like my other build tools?</P>
- <P class="answer">
- Many developers prefer to have their build tools such as NUnit, NAnt etc stored
- in source control in a Tools folder along with the source code. This ensures that
- a new developer can obtain and build the application without having to install additional
- tools on their own machines.</P>
- <p>
- NCover can also be deployed in this fashion. However the one gotcha with NCover
- versus other tools is that the profiler within CoverLib.dll must be COM registered
- on the local machine before you execute it. Prior to NCover 1.5.6 this was usually
- achieved as part of your build script, which would call regsvr32 with the path to
- the CoverLib.dll in your Tools folder. Alternatively the <ncover> NAnt and
- MSBuild tasks described below will do this for you. As of NCover 1.5.6 you can also
- use the //reg option in the command line arguments which will temporarily register
- the profiler. Note that the //reg option will not work for IIS or Windows Service
- profiling unless you are running NCover under the same Windows login account as
- the IIS worker process, or your Windows Service.</p>
- <P class="question">
- 13. How do I see my source code highlighted with the coverage results?</P>
- <P class="answer">
- <a href="http://ncoverexplorer.org/">NCoverExplorer</a> is a gui and console-based
- .NET application developed by <a href="http://www.kiwidude.com/blog/">Grant Drake</a>. NCoverExplorer
- parses the coverage.xml files output from NCover and displays the results integrated
- with your source code. It also includes a number of additional features to merge,
- filter, sort and generate html reports. The console version is
- designed to be used as part of an automated build process. The support forums for
- NCoverExplorer are located with the NCover ones at <a href="http://ncover.org">http://ncover.org/</a>.<strong> </strong></P>
- <P class="question">
- 14. How do I run NCover from within the Visual Studio.Net IDE?</P>
- <P class="answer">
- The <a href="http://testdriven.net/">TestDriven.Net</a> add-in by <a href="http://weblogs.asp.net/nunitaddin/">
- Jamie Cansdale</a> offers a right-click capability within the IDE to execute
- your unit tests with code coverage. The results of the NCover code coverage are
- displayed with the bundled NCoverExplorer gui for analysis and reporting.</P>
- <P class="question">
- 15. How do I run NCover from a NAnt or MSBuild task?</P>
- <P class="answer">
- You can use an <exec> task with <a href="http://nant.sourceforge.net/">NAnt</a>
- or an <Exec> task with MSBuild. Alternatively you may want to use the custom
- <ncover> task for NAnt or <NCover> task for MSBuild developed by Grant
- Drake for a more developer friendly syntax. The source code, compiled assemblies
- and documentation are located in the NCoverExplorer.Extras.zip available from <a
- href="http://ncoverexplorer.org/">http://ncoverexplorer.org/</a>.</P>
- <P class="question">
- 16. How do I include NCover output in my CruiseControl.Net build reports?</P>
- <P class="answer">
- <a href="http://ccnet.thoughtworks.com/">CruiseControl.Net</a> is a continuous integration
- build server which offers web-based reporting of the outputs of a build such as
- unit test results and code coverage reporting. The default CruiseControl.Net installation
- includes a basic stylesheet which works in combination with the standard coverage.xml
- formatted output. So all you need to do is include the execution of NCover as part
- of your build, then add a CruiseControl.Net merge file publisher task to integrate
- the coverage.xml results into the build output.</P>
- <p class="answer">
- An improvement on the above to display more attractive and powerful reports as well
- as minimize the build log size is to use NCoverExplorer. The NCoverExplorer.Console.exe
- is designed to produce a more concise xml report summary that is combined with an
- alternate xsl stylesheet for CruiseControl.Net. You can find more information and
- screenshots in this <a href="http://www.kiwidude.com/blog/2006/04/ncoverexplorer-v133.html">
- blog entry</a> - all the necessary tasks, examples and documentation are located
- within NCoverExplorer.Extras.zip available from <a href="http://ncoverexplorer.org/">
- http://ncoverexplorer.org/</a>. </p>
- <P class="question">
- 17. How do I merge multiple NCover coverage.xml results?</P>
- <P class="answer">
- You can can use NCoverExplorer to merge the results of multiple coverage runs. For
- more information refer to this <a href="http://www.kiwidude.com/blog/2006/10/ncoverexplorer-merging-ncover-reports.html">
- blog entry</a>.</P>
- <P class="question">
- 18. Troubleshooting: Why is my coverage.xml file empty?</P>
- <ul>
- <li>If using the command-line, did you COM register CoverLib.dll (or use the //reg option
- from NCover 1.5.6)?</li>
- <li>Did you generate build symbol files (.pdbs) for the profiled application?</li>
- <li>If using the //a option, did you correctly list just the assembly names without
- paths or .dll suffixes?</li>
- </ul>
- <P class="question">
- 19. Troubleshooting: I have coverage.xml output but my XYZ assembly is not included in it?</P>
- <ul>
- <li>NCover will only profile loaded assemblies - did your code execution path while
- under coverage force that assembly to be loaded (e.g. by loading a type or calling
- a method in that assembly)? </li>
- <li>Did you generate build symbol files (.pdb files) for the missing assembly? </li>
- <li>If using the //a option, did you correctly list the assembly names including the
- one that is missing?</li>
- <li>Can you see information about the assembly being loaded within the coverage.log?
- Is the correct assembly being loaded (check the path) - if you have a version in
- the GAC it may possibly prevent the .pdb file from being loaded.</li><li>If using the NCoverExplorer gui, have you got a coverage exclusion defined which
- is hiding it from the display?</li>
- </ul>
- <P class="question">
- 20. Troubleshooting: After running NCover my coverage.log says "Failed to load symbols for module XYZ"?</P>
- <ul>
- <li>This message means that no .pdb build symbol file was found for that assembly so
- it cannot be profiled for code coverage. If that assembly is part of the .NET framework
- for instance like System.Data.dll, then this is an expected message and should not
- cause concern. </li><li>If however the assembly belongs to your application, did you generate the
- build symbol files (.pdb files) for it? </li>
- </ul>
- <P class="question">
- 21. Troubleshooting: I get a "Profiled process terminated. Profiler connection not
- established" message?</P>
- <ul>
- <li>If using the command-line, did you COM register CoverLib.dll (or use the //reg option
- from NCover 1.5.6)?</li><li>Are you running Windows XP 64-bit? You may want to take a look at
- <a href="http://ncover.org/SITE/forums/thread/43.aspx">this thread</a></li></ul>
- <P class="question">
- 22. Troubleshooting: My coverage exclusions are not working?</P>
- <ul>
- <li>Have you put the full namespace type name to the exclusion including the Attribute suffix in the //ea argument? See the "How
- do I use coverage exclusions?" question above.</li></ul>
-
- </body>
- </html>
|