2009-08-17 5 views
15

Mam kilka klas, które z różnych powodów nie mogą być lub nie muszą być testowane jednostkowo. Chciałbym wykluczyć te klasy z moich danych dotyczących zasięgu, aby uzyskać lepsze wyczucie pokrycia na zajęciach, na których mi zależy. Teraz muszę wykluczyć wyniki po fakcie. Chciałbym użyć atrybutu, aby oznaczyć te klasy jako wykluczone, aby nie były uwzględniane na początku. Czy istnieje sposób na udekorowanie klasy za pomocą atrybutu, który automatycznie wykluczy ją z analizy zakresu? Każda analiza zasięgu VS lub nCover będzie działać.Użyj atrybutu, aby pominąć kod z analizy pokrycia w Visual Studio

FWIW, to są klasy, które mogę zapewnić, sprawdzając, że kod jest poprawny. Przeważnie są to klasy opakowujące wokół istniejących klas szkieletowych, które wprowadziłem, aby móc wyśmiać klasę szkieletu. Odkąd opakowanie zostaje wyśmiane, nie poddaje się testom. To dobrze, ponieważ wszystko, co robią, to owinięcie metod klasy szkieletowej, na których mi zależy.

+0

Czy problem, że nie można uzyskać danych pokrycia poszczególnych metod, , więc chcesz usunąć dane dotyczące zasięgu w przypadku metod, których nie chcesz, aby uzyskać bardziej odpowiedni pomiar całości? –

+0

Tak. Istnieje kilka metod, które nie muszą być lub nie mogą być łatwo przetestowane - na przykład klasy otworkowe tworzone w celu umożliwienia testowania jednostek wokół klas frameworku. Wolałabym nie mieć tych nieładnych statystyk dla zajęć, na których mi zależy. – tvanfosson

Odpowiedz

22

Począwszy od VS2010 mamy ExcludeFromCodeCoverageAttribute. Komentatorzy zauważyli, że to działa w NCover, a także DotCover + NUnit. Przykład użycia:

[ExcludeFromCodeCoverage] 
public class myUntestableClass 
{ } 

Zobacz te link. Sugerują użycie VSInstr jako narzędzia wiersza poleceń, mają opcje/EXCLUDE (nie jest to przydatne).

+0

Działa to również z NCover w VS2010. – tvanfosson

+0

Działa również z DotCover + NUnit (VS2012). – Jeroen

6

Znalazłem some information na kilku atrybutach diagnostycznych DebuggerNonUserCodeAttribute i DebuggerHiddenAttribute, które wskazują, że użycie tych atrybutów spowoduje, że analizator pokrycia w VS nie będzie ich usuwał z wyników. Próbowałem go z DebuggerNonserserCodeAttribute i wydaje się, że działa. Prawdopodobnie mogę żyć z tym dla większości klas, o których myślę, chociaż nie podoba mi się efekt uboczny, że nie mogę wejść na te zajęcia. Nie powinno to stanowić problemu dla klas wrappera, ale może się tak zdarzyć w przypadku klas, które są z natury trudne do przetestowania i potrzebuję dostępu do debuggera.

Wciąż szukam alternatyw.

+0

To jest dokładnie to, czego szukałem. Dzięki za obserwację! –

5

Za pomocą NCover można utworzyć atrybut, a następnie nakazać NCover, aby zignorował ten atrybut.

W naszych projektach, zdefiniowaliśmy tego atrybutu (bez przestrzeni nazw, więc jest łatwy w użyciu):

public class CoverageExcludeAttribute : Attribute { } 

Używamy NAnt, więc mamy cel, który wygląda tak:

<target name="unittests" description="run nunit tests" >   
    <ncover 
     .... 
     excludeAttributes="CoverageExcludeAttribute" 
    /> 
</target> 

Pytanie 9 w NCover FAQ opisuje tę metodę. Oparliśmy nasze rozwiązanie na tym.

Można również użyć funkcji wykluczania programu NCoverExplorer, aby wykluczyć przestrzenie nazw i złożenia z raportu końcowego. Spowoduje to jedynie usunięcie danych z raportu, ale wynik końcowy jest taki sam.

Używamy obu technik.

+0

Dzięki. Właśnie tego szukałem. W większości korzystam z nCover w połączeniu z TestDriven.Net, który wygląda tak, jakby włączał CoverageExcludeAttribute po wyjęciu z pudełka. – tvanfosson

+0

Najnowsza wersja działa z atrybutem ExcludeFromCodeCoverage, więc użyłem tego. – tvanfosson

Powiązane problemy