Статьи

Типы покрытия кода – примеры в C #

Анализ покрытия кода используется для измерения качества тестирования программного обеспечения, обычно с использованием динамического анализа потока выполнения. Существует много различных типов анализа покрытия кода , некоторые из которых очень просты, а другие очень строгие и сложные для выполнения без расширенной поддержки инструментов. Большинство людей считают, что они протестировали все, когда охват кода Visual Studio показывает 100% . Но это так неправильно! Здесь я дам вам несколько примеров различных типов покрытия кода .

Заявление покрытия кода

Основным типом покрытия кода является покрытие кода оператора. Да, вы правильно догадались, это тип покрытия кода, выполняемый большинством IDE (включая Visual Studio).

private void PeformAction(int x, int y)
{
    this.DoSomething();
    if (x > 3 && y < 6)
    {
        this.DoSomethingElse();
    }
    this.DoSomething();
}

Цель покрытия операторов — выполнить все операторы в нашем коде с наименьшим количеством возможных тестов. Таким образом, здесь вам потребуется только один тест — x = 4 и y = 5. От вас не требуется выполнять различные комбинации условия в IF.

Покрытие выписки = (Количество выполненных выписок) / (Общее количество выписок) * 100%

Покрытие кода филиала (покрытие решения)

Каждое решение выполняется с обоими возможными результатами — ИСТИНА и ЛОЖЬ . Для Loops — обойти его, выполнить тело и вернуться в начало.

private void PeformAction(int x, int y)
{
    this.DoSomething();
    if (x > 3 && y < 6)
    {
        this.DoSomethingElse();
    }
    else
    {
        System.Console.WriteLine(x + y);
    }
    this.DoSomething();
}

В приведенном выше примере нам нужно два теста для выполнения этого типа покрытия кода.

1. x = 4 и y = 5 => IF Выполнено

2. x = 2 и y = 5 => иначе выполнено

Охват филиалов = (Количество филиалов) / (Общее количество филиалов) * 100%

Расчет подсчитывает каждую выполненную ветвь только одну.

private void PeformAction(int x, int y, bool shouldExecute)
{
    if (shouldExecute)
    {
        this.DoSomething();
        if (x > 3 && y < 6)
        {
            this.DoSomethingElse();
        }
        else
        {
            System.Console.WriteLine(x + y);
        }
        this.DoSomething();
    }
}

В наших тестах ветвь mustExecute будет выполнена дважды, но в формуле она должна учитываться только один раз.

Примечание : 100% покрытие филиала гарантирует 100% покрытие отчета. Также требуется больше тестов.

Охват условий филиала

Иногда ваши условия зависят от нескольких меньших условий, называемых атомными частями. Атомарность — это условие, которое не имеет логических операций, таких как AND, OR, NOT, но может включать «<», «>» или «=». Одно условие может состоять из нескольких атомных частей.

private void PeformAction(int x, int y, int z)
{
    this.DoSomething();
    if ((x > 3 && y < 6) || z == 20)
    {
        this.DoSomethingElse();
    }
    else
    {
        System.Console.WriteLine(x + y);
    }
    this.DoSomething();
}

Сложность таких выражений должна быть рассмотрена и проверена. Покрытие требует, чтобы каждая атомарная часть принимала значения — ИСТИНА и ЛОЖЬ.

В этом примере есть 3 атомные части: x> 3, y <6 и z == 20. Нам нужно два теста, чтобы выполнить 100% покрытие условий ветвления .

1. x = 2, y = 4, z = 21 ((F && T) || F) => F

2. x = 4, y = 7, z = 20 ((T && F) || T) => T

Отрасль Состояние покрытия слабее , чем Statement покрытия и отделения покрытия , поскольку не требуется выполнять каждый оператор.

private void PeformAction(int x, int y)
{
    this.DoSomething();
    if (x > 3 && y < 6)
    {
        this.DoSomethingElse();
    }
    else
    {
        System.Console.WriteLine(x + y);
    }
    this.DoSomething();
}

Здесь вы можете выполнить 100% покрытие условий ветвления, повторив 2 теста.

1. x = 2, y = 3 (F && T) => F

2. x = 4, y = 7 (T && F) => F

Но у вас нет 100% покрытия операторов, код в IF не будет выполнен.

Покрытие кода комбинации условий филиала

Все комбинации атомных частей должны быть применены.

1. x = 2, y = 3 (F && T) => F

2. x = 4, y = 7 (T && F) => F

3. x = 4, y = 3 (T && T) => T

4. х = 2, у = 7 (F && F) => F

Он является более всеобъемлющим, чем охват заявлений и охват филиалов. Однако количество тестов может расти в геометрической прогрессии. (2 n с n атомных частей в состоянии).

Это очень дорогая техника из-за растущего числа атомных условий. Также все комбинации не всегда возможны.

private void PeformAction(int x, int y)
{
    this.DoSomething();
    if (3 <= x && x < 5)
    {
        this.DoSomethingElse();
    }
    else
    {
        System.Console.WriteLine(x + y);
    }
    this.DoSomething();
}

3 <= x (F) && x <5 (F) — комбинация невозможна, поскольку значение x должно быть меньше 3 и больше или равно 5 одновременно.

Определение условий покрытия

Такое покрытие устраняет ранее обсуждавшиеся проблемы. Не все комбинации атомных частей должны применяться. Только комбинации, в которых изменение логического значения атомной части может изменить логическое значение всего условия.

private void PeformAction(int x, int y)
{
    this.DoSomething();
    if (4 <= x || y < 6)
    {
        this.DoSomethingElse();
    }
    else
    {
        System.Console.WriteLine(x + y);
    }
    this.DoSomething();
}

Если мы хотим достичь 100% покрытия комбинации условий ветвления , нам нужно 4 теста.

1. x = 2, y = 3 (F || T) => T

2. x = 4, y = 7 (T || F) => T

3. x = 4, y = 3 (T || T) => T

4. х = 2, у = 7 (F || F) => F

Мы можем исключить 3-й и 4-й тесты, чтобы выполнить 100% покрытие определения состояния . Потому что даже если первая / вторая атомная часть изменится с False на True и наоборот, результат не изменится.

 

Ссылки:

1. Основы тестирования программного обеспечения

2. Покрытие кода вики

3.  Расширенное тестирование программного обеспечения — Vol. 1

4.  Расширенное тестирование программного обеспечения — Vol. 2