Add support for UnreachableException in .NET code

Aperta
#142 2 commenti 9 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
35/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
csharp

Direzione di ricerca

L’issue non indica alcun file del repository, test o punto di ingresso. Inizia dall’esempio di switch in C# e dai riferimenti collegati a UnreachableException, quindi traccia il modo in cui gli strumenti di coverage producono l’XML mostrato; il lavoro è completato quando i percorsi UnreachableException vengono esclusi dalle righe e dai branch copribili, come nell’output previsto.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement

.NET 7 added the UnreachableException class, which is meant to be thrown when executing a branch that isn't isn't expected to execute, due to the developer believing it to be unreachable. The Microsoft code coverage tools should analyze code that throws UnreachableException and reduce the number of coverable lines and branches accordingly.

Consider the following example:

using System.Diagnostics;

enum E
{
    A,
    B,
    C,
}

static partial class C
{
    public static void M()
    {
        E value = GetValue();

        switch (value) // line 16
        {
            case E.A:
                PerformActionA();
                break;

            case E.B:
                PerformActionB();
                break;

            case E.C:
                PerformActionC();
                break;

            default:
                throw new UnreachableException(); // line 31
        }
    }
}

Currently, this will yield coverage data for M() like so:

<method line-rate="0.9090909090909091" branch-rate="0.75" complexity="4" name="M" signature="()">
  <lines>
    <line number="13" hits="1" branch="False" />
    <line number="14" hits="1" branch="False" />
    <line number="16" hits="1" branch="True" condition-coverage="75% (3/4)">
      <conditions>
        <condition number="0" type="switch" coverage="75%" />
      </conditions>
    </line>
    <line number="19" hits="1" branch="False" />
    <line number="20" hits="1" branch="False" />
    <line number="23" hits="1" branch="False" />
    <line number="24" hits="1" branch="False" />
    <line number="27" hits="1" branch="False" />
    <line number="28" hits="1" branch="False" />
    <line number="31" hits="0" branch="False" />
    <line number="33" hits="1" branch="False" />
  </lines>
</method>

We see that the condition on line 16 shows four branches (one of which is the default case and is uncovered) and that line 31 shows no hits. If the developer has otherwise guaranteed that GetValue() will return a valid value of E—one of the known enum cases—and they handle the remaining case in the above sample by throwing UnreachableException, the code coverage findings should reflect that. Given the above example, if the code coverage tools were aware of UnreachableException, I would instead expect to see the following coverage data:

<method line-rate="1" branch-rate="1" complexity="4" name="M" signature="()">
  <lines>
    <line number="13" hits="1" branch="False" />
    <line number="14" hits="1" branch="False" />
    <line number="16" hits="1" branch="True" condition-coverage="100% (3/3)">
      <conditions>
        <condition number="0" type="switch" coverage="100%" />
      </conditions>
    </line>
    <line number="19" hits="1" branch="False" />
    <line number="20" hits="1" branch="False" />
    <line number="23" hits="1" branch="False" />
    <line number="24" hits="1" branch="False" />
    <line number="27" hits="1" branch="False" />
    <line number="28" hits="1" branch="False" />
    <line number="33" hits="1" branch="False" />
  </lines>
</method>

Recognizing the developer's intent with regards to intentionally unreachable code will provide for more accurate code coverage results, and will make the tooling more usable for teams who want to enforce 100% code coverage in their test suites.

References:

Lingua principale
C#
Stelle
125
Fork
17
Merge medio
1h 17m
PR unite (30g)
2

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/codecoverage

Tutte le issue di microsoft/codecoverage

Issue simili

Altre issue su C#

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.