问题
I'm having trouble getting the following to work together.
- NCover 1.5.8 (the version shipped with TestDriven.NET)
- NUnit 2.5 (the version shipped with TestDriven.NET)
- Moles and Pex
I'm using Windows 7 x64 with a .NET 4.0 Pex and Moles test library
I have tried to follow tips from this similar question (about getting Moles to work with MSTest) and related links. I did manage to get Moles and NUnit to work together thanks to this answer, but I cannot get it to work with NCover.
Here's a batch file.
:: Some paths
:: ==========
set NCoverPath=C:\Program Files (x86)\TestDriven.NET 3\NCover\1.5.8
set NUnitPath=C:\Program Files (x86)\TestDriven.NET 3\NUnit\2.5
set MolesPath=C:\Program Files\Microsoft Moles\bin
:: Some environment variables
:: ==========================
:: (I've tried every combination I can think of here...)
set ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
set COMPLUS_ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
set COR_PROFILER={3FB1CC1E-1C17-4A37-9C18-BF3DB8F10E46}
set CLRMONITOR_EXTERNAL_PROFILERS={3FB1CC1E-1C17-4A37-9C18-BF3DB8F10E46}
:: (Note 3FB1CC1E-1C17-4A37-9C18-BF3DB8F10E46 is the CLSID of NCoverLib.dll 1.5.8.
:: Use {9721F7EB-5F92-447c-9F75-79278052B7BA} instead for NCover 3.x or later)
:: Call NCover
:: ===========
:: Here is the main call to NCover/Moles.Runner/NUnit-Console
"%NCoverPath%\ncover.console.exe" ^
//pm moles.runner.exe ^
//ea "moles.runner;mscorlib.Moles" ^
//reg ^
"%MolesPath%\moles.runner.exe" "Pex.Tests.dll" ^
/runner:"%NUnitPath%\NUnit-console.exe"
And this is the output I get:
NCover.Console v1.5.8 - Code Coverage Analysis for .NET - http://ncover.org
Copyright (c) 2004-2006 Peter Waldschmidt
Command: C:\Program Files\Microsoft Moles\bin\moles.runner.exe
Command Args: ".\Pex.Tests.dll" "/runner:C:\Program Files (x86)\TestDriven.NET 3\NUnit\2.5\NUnit-console.exe"
Working Directory:
Assemblies:
Coverage Xml: Coverage.Xml
Coverage Log: Coverage.Log
Waiting for profiled application to connect...Microsoft Moles Runner v0.94.51023.0 -- http://research.microsoft.com/moles -- .NET v4.0.30319
Copyright (c) Microsoft Corporation 2007-2010. All rights reserved.
instrumenting...started
NUnit version 2.5.5.10112
Copyright (C) 2002-2009 Charlie Poole.
Copyright (C) 2002-2004 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov.
Copyright (C) 2000-2002 Philip Craig.
All Rights Reserved.
Runtime Environment -
OS Version: Microsoft Windows NT 6.1.7601 Service Pack 1
CLR Version: 4.0.30319.239 ( Net 4.0 )
ProcessModel: Default DomainUsage: Single
Execution Runtime: net-4.0
.................................
Tests run: 33, Errors: 0, Failures: 0, Inconclusive: 0, Time: 0 seconds
Not run: 0, Invalid: 0, Ignored: 0, Skipped: 0
Connected
Profiled process terminated. Profiler connection not established.
It returns error code 1 and my coverage files contain all the test names but with zero coverage.
回答1:
After much trial and error I found a combination which works.
- The only environment setting necessary is
COMPLUS_ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
(setting any of the others mentioned above will cause NCover to fail) - Use
moles.runner.x86.exe
(instead ofmoles.runner.exe
), but usenunit-console.exe
, not (nunit-console-x86.exe
) - You can optionally specify additional args to nunit by using multiple
/args
parameters, e.g.,/args="/domain=None" /args="/xml:MyOutput.xml"
- Don't forget to copy
Microsoft.Moles.NUnit.dll
to the addins subdirectory of NUnit.
See below for the corrected batch file
:: Some paths
:: ==========
set NCoverPath=C:\Program Files (x86)\TestDriven.NET 3\NCover\1.5.8
set NUnitPath=C:\Program Files (x86)\TestDriven.NET 3\NUnit\2.5
set MolesPath=C:\Program Files\Microsoft Moles\bin
set PexPath=C:\Program Files\Microsoft Pex\bin
:: Important!
set COMPLUS_ProfAPI_ProfilerCompatibilitySetting=EnableV2Profiler
:: Here is the main call to NCover/Moles.Runner/NUnit-Console
"%NCoverPath%\ncover.console.exe" ^
//pm moles.runner.x86.exe ^
//ea "moles.runner;mscorlib.Moles" ^
//reg ^
"%MolesPath%\moles.runner.x86.exe" "Pex.Tests.dll" ^
/runner:"%NUnitPath%\NUnit-console.exe"
The tests run, the exit code is zero and the coverage files are generated.
Actually, if you don't need the NUnit output files, you can do the same with pex.x86.exe
as follows:
"%NCoverPath%\ncover.console.exe"
//pm pex.x86.exe
//ea "mscorlib.Moles"
//reg ^
"%PexPath%\pex.x86.exe" "%TestAssemblyPath%\Pex.Tests.dll" /nor /ftf
The tests run, the exit code is zero and the coverage files are generated.
来源:https://stackoverflow.com/questions/8593385/ncover-1-5-8-with-moles-pex-and-nunit