2015-09-01 19 views
5

Ich habe gerade eine Reihe von Projekten auf VS2015/C# 6 aktualisiert.Autoeigenschaften aus Code Coverage in Visual Studio 2015 ausschließen

Jetzt MSTest Code Coverage Analyse berichtet, dass einige automatische Eigenschaften nicht durch Komponententests abgedeckt sind. Dies war in Visual Studio 2013 nicht der Fall, und ich vermute, dass dies etwas mit den neuen Eigenschaften von autoproperty in C# 6 zu tun hat.

Der Umgang mit all diesen falsch-positiven Ergebnissen vereitelt den Zweck des Code-Coverage-Tools, da es praktisch unmöglich ist, tatsächlichen Code zu identifizieren, der keine Testabdeckung bietet. Wir wollen keine Komponententests für alle unsere DTOs schreiben, und ich möchte lieber nicht das Projekt durchgehen, in dem jede einzelne Auto-Eigenschaft mit ExcludeFromCodeCoverage kommentiert wird.

Ich habe eine Arbeits MCVE erstellt bei https://github.com/iaingalloway/VisualStudioCodeCoverageIssue


  • öffnen VisualStudio2013.sln in Visual Studio 2013 Premium-oder Ultimate.
  • Klicken Sie auf Test -> Codeabdeckung analysieren -> Alle Tests.
  • Beachten Sie, dass das Fenster "Code Coverage Results" 0 Blöcke "Not Covered" meldet.

  • öffnen VisualStudio2015.sln in Visual Studio 2015 Unternehmen.
  • Klicken Sie auf Test -> Codeabdeckung analysieren -> Alle Tests. Beachten Sie
  • , dass das Fenster Berichte 1 Block "Nicht abgedeckt" "Code Coverage Ergebnisse" (der Getter für ExampleDto.Value)

Ist es möglich, die integrierten Code-Coverage-Tool zu konfigurieren, in Visual Studio 2015, um Auto-Eigenschaften wie Visual Studio 2013 zu ignorieren?

+0

Dieses Verhalten einen Fehler in Visual Studio 2015. Es gibt zu sein scheint noch keine Abhilfen anders als mit '[ ExcludeFromCodeCoverage] '. Sie können den Fortschritt des Tickets überwachen unter: - https://connect.microsoft.com/VisualStudio/Feedback/Details/1742106 –

Antwort

4

Als Abhilfe können Sie Folgendes zu Ihrer .runsettings Datei hinzufügen set_ "in den Namen sollte es dir das Verhalten geben, das du brauchst.

0

Ich denke, [ExcludeFromCodeCoverage] ist Ihre einzige Option. Es ist nur eine einmalige Sache, die Sie tun müssen. Ich persönlich schreibe Unit-Tests für die Eigenschaften-Getter/Setter, insbesondere solche wie in WPF, wo ich sicher sein möchte, dass die Änderung der Eigenschaftenänderung erfolgt.

<RunSettings> 
    <DataCollectionRunSettings> 
    <DataCollector ...> 
     <Configuration> 
     <CodeCoverage> 
      <Functions> 
      <Exclude> 
       <Function>.*get_.*</Function> 
       <Function>.*set_.*</Function> 
      </Exclude> 
      ... 

Es ist kein großes Problem zu umgehen, aber solange Sie Funktionen mit „get_“ nicht verwenden oder "-:

+2

Wenn Sie Logik (zB Änderung der Eigenschaften ändern) in der Getter/Setter, das ist eine Sache .Es ist eine ganz andere, wenn es nur eine Auto-Eigenschaft ist. 'int Foo {bekommen; einstellen; } '. Es gibt Tausende von ihnen in dieser Codebasis. Fast 18% der "Blöcke" in der Code-Analyse und mehr werden jedes Mal hinzugefügt. Da muss * ein besserer Weg sein! –

+0

@Iain scheint mit MSTest keine Möglichkeit zu sein. Ausführliche Informationen dazu, was Sie in VS2015 ausschließen können, finden Sie unter https://msdn.microsoft.com/en-us/library/jj159530.aspx. –

0

Ich habe nicht gerne alle Get/Set-Methoden gefiltert, zumal ich manchmal schreiben und setzen Logik, die getestet werden muss. Für mich, für nur Grundversorgung von relativ einfachen Modellen hat sich das folgende Paar xUnit Tests funktionierte gut:

public class ModelsGetSetTest 
{ 

    [ClassData(typeof(ModelTestDataGenerator))] 
    [Theory] 
    public void GettersGetWithoutError<T>(T model) 
     where T: BaseEntity 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     for (var i = 0; i < properties.Length; i++) 
     { 
      var prop = properties[i]; 
      prop.GetValue(model); 
     } 
    } 

    [ClassData(typeof(ModelTestDataGenerator))] 
    [Theory] 
    public void SettersSetWithoutError<T>(T model) 
     where T : BaseEntity 
    { 
     PropertyInfo[] properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     for (var i = 0; i < properties.Length; i++) 
     { 
      var prop = properties[i]; 
      prop.SetValue(model, null); 
     } 
    } 

    public class ModelTestDataGenerator : IEnumerable<object[]> 
    { 
     private readonly List<object[]> _data = new List<object[]> 
     { 
      new object[] { new UserRole() }, 
      new object[] { new User() }, 
      new object[] { new Role() } 
     }; 

     public IEnumerator<object[]> GetEnumerator() => _data.GetEnumerator(); 
     IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); 
    } 
} 
Verwandte Themen