17

Podczas obsługi kodu dla mojego rozwiązania zawierającego wiele projektów zauważyłem, że zasięg kodu obejmuje także moje zestawy testowe.Użycie .runsettings w celu wykluczenia złożeń z zasięgu kodu

znalazłem artykuł, który sugeruje poniższy szablon .runsettings:

<?xml version="1.0" encoding="utf-8"?> 
<RunSettings> 
    <DataCollectionRunSettings> 
    <DataCollectors> 
     <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> 
     <Configuration> 
      <CodeCoverage> 
      <ModulePaths> 
       <Include> 
       <!-- Do not specify any includes. This will attempt to include all binaries --> 
       </Include> 
       <Exclude> 
       <!-- Exclude modules that aren't to be processed, by their name/path --> 
       <ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here --> 
       </Exclude> 
      </ModulePaths> 

      <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation> 
      <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses> 
      <CollectFromChildProcesses>True</CollectFromChildProcesses> 
      <CollectAspDotNet>False</CollectAspDotNet> 
      <!-- 
Additional paths to search for symbol files. Symbols must be found for modules to be instrumented. 
If symbols are alongside the binaries, they are automatically picked up. Otherwise specify the here. 
Note that searching for symbols increases code coverage runtime. So keep this small and local. 

<SymbolSearchPaths>    
    <Path>C:\Users\User\Documents\Visual Studio 11\Projects\ProjectX\bin\Debug</Path> 
    <Path>\\mybuildshare\builds\ProjectX</Path> 
</SymbolSearchPaths> 
--> 
      <Functions> 
       <Exclude> 
       <Function>^std::.*</Function> 
       <Function>^ATL::.*</Function> 
       <Function>.*::__GetTestMethodInfo.*</Function> 
       <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function> 
       <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function> 
       <Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function> 
       </Exclude> 
      </Functions> 
      <Attributes> 
       <Exclude> 
       <Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute> 
       <Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute> 
       <Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute> 
       <Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute> 
       <Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute> 
       </Exclude> 
      </Attributes> 
      <Sources> 
       <Exclude> 
       <Source>.*\\atlmfc\\.*</Source> 
       <Source>.*\\vctools\\.*</Source> 
       <Source>.*\\public\\sdk\\.*</Source> 
       <Source>.*\\microsoft sdks\\.*</Source> 
       <Source>.*\\vc\\include\\.*</Source> 
       </Exclude> 
      </Sources> 
      <CompanyNames> 
       <Exclude> 
       <CompanyName>.*microsoft.*</CompanyName> 
       </Exclude> 
      </CompanyNames> 
      <PublicKeyTokens> 
       <Exclude> 
       <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken> 
       <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken> 
       <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken> 
       <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken> 
       <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken> 
       <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken> 
       <PublicKeyToken>^E361AF139669C375$</PublicKeyToken> 
       </Exclude> 
      </PublicKeyTokens> 
      </CodeCoverage> 
     </Configuration> 
     </DataCollector> 
    </DataCollectors> 
    </DataCollectionRunSettings> 
</RunSettings> 

Teraz problemem jest to, że tak szybko, jak mogę sprawdzić plik .runsettings w menu ustawień test test \ widzę Code Coverage analizuje tylko jedno z wielu złożeń w moim rozwiązaniu.

Nawet jeśli usunąć wiersz

<ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here --> 

tylko jeden zespół jest analizowane. Chciałbym uniknąć dodawania wszystkich moich złożeń do listy Uwzględnij, po prostu muszę wykluczyć wszystkie zespoły testowe.

Dlaczego .runsettings powoduje, że zasięg kodu jest wyświetlany tylko w jednym z zestawów w moim rozwiązaniu VS?

+0

http: // msdn.microsoft.com/de-de/library/vstudio/jj635153.aspx mówi, że możesz usunąć każdy wpis w tym pliku (ponieważ używane są wartości domyślne). Spróbuj zacząć od pustego pliku i dodaj jeden region po drugim. – habakuk

+1

Mam do czynienia z podobnym problemem, z dużo prostszym plikiem. Z domyślnym plikiem runsettings, jestem w stanie uzyskać zasięg kodu. Gdy próbowałem wykluczyć bibliotekę innej firmy (na przykład), uruchomienie analizy kodu powoduje ... brak. Bez błędów, bez ostrzeżeń, po prostu nic. Skomentuj to wykluczenie i wszystko znów działa. – sfuqua

+0

po prostu dodaje angielską (en-us) wersję łącza MSDN dostarczoną przez @habakuk http://msdn.microsoft.com/en-us/library/vstudio/jj635153.aspx – kmoormann

Odpowiedz

21

The issue is the period. Z jakiegoś powodu RegEx dusi się z tego powodu. Można uzyskać wokół niego uciekając okres następująco:

<ModulePaths> 
    <Include> 
     <ModulePath>.*MyCompany\.Namespace\.Project\.dll$</ModulePath> 
    </Include> 
    <Exclude> 
     <ModulePath>.*ThirdParty\.Namespace\.Project\.dll$</ModulePath> 
    </Exclude> 
</ModulePaths> 

Również pusty zawiera ważne i oznacza, że ​​wszystkie moduły są włączone. Komentarze Microsoft pod warunkiem, że stan próbki:

<!-- 
About include/exclude lists: 
Empty "Include" clauses imply all; empty "Exclude" clauses imply none. 
Each element in the list is a regular expression (ECMAScript syntax). 
See http://msdn.microsoft.com/library/2k3te2cs.aspx. 
An item must first match at least one entry in the include list to be included. 
Included items must then not match any entries in the exclude list to remain included. 
--> 
+1

+1 za dodanie komentarza Microsoft, który dokładnie wyjaśnia, w jaki sposób działa włączanie i wykluczanie. Dziękuję Ci. –

13

Na pokrewnej notatce, natknąłem się na ten post, ponieważ trochę myślałem jasno o regularnym charakterze wyrażenia i wykluczania ścieżek. W mojej aplikacji WPF chciałem wykluczyć analizę zasięgu na Caliburn.Micro. Napisałem więc:

<ModulePath>Caliburn.Micro.dll</ModulePath> 

Najwyraźniej okres mi się podoba. To pytanie nie cierpi z powodu tego problemu, ale założę się, że nie jestem jedynym, który przeoczy ten prosty fakt. W przypadku innych czytelników należy również pamiętać, że * nie jest symbolem wieloznacznym - jest to wyrażenie regularne "dowolna liczba" operatora. Nie chcesz *.Caliburn, ale raczej .*Caliburn Zatem to proste stwierdzenie rozwiązać mój problem:

<ModulePath>.*Caliburn.*</ModulePath> 

Ponieważ szuka drogi, a nie tylko nazwa modułu, potrzebne są * w przedniej części modułu zignorować. to - to znaczy, że chcesz go zignorować przy dowolnej ścieżce pliku.

+1

Twoje rozwiązanie jest poprawne.Nie jest prostym symbolem wieloznacznym ani wyrażeniem regularnym, ale jest Ścieżką, więc. * Jest w pewnym sensie obowiązkowe, inaczej powinieneś znać pełną ścieżkę pliku .dll, która jest niemożliwa dla TFS Azure. – Raffaeu

Powiązane problemy