Есть ли какой-нибудь способ получить 100% покрытия филиала?

#c# #unit-testing #code-coverage

#c# #модульное тестирование #покрытие кода

Вопрос:

Моя задача — покрыть все решение тестами и достичь 100% покрытия ветвей и последовательностей.

У меня есть этот метод с помощью оператора if:

 public string ConvertToOrder(string cartCode)
{  
    var cart = CartService.GetCartByCode(cartCode);
    if (cart == null || cart.ItemCount == 0)
    {
        throw new Exception("CartCode does not exist");
    }
}
  

Я смог проверить только 3 сценария из 4.
1. когда cart нет null и itemCount == 0
2. когда cart нет null и itemCount != 0
3. когда cart null и itemCount == 0
4.Четвертый сценарий нецелесообразен, поскольку я не могу добавить элемент к null объекту в моем тесте.

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

Комментарии:

1. Я в замешательстве. Если cart null да, то как вообще может быть какое-либо количество элементов? # 3, похоже, не имеет никакого значения — что-то может быть равно 0, только если оно существует в первую очередь.

2. Теперь, когда я думаю об этом, третий возможный сценарий — просто cart is null . Тогда почему инструмент покрытия показывает мне, что 3 из 4 случаев покрыты?

3. Какой инструмент вы используете? Мне это кажется неправильным, потому что по определению itemCount == 0 и itemCount != 0 не имеет никакого значения в том случае, если это cart так null .

4. Если вы пишете код, который проверяет условия, которые не могут возникнуть, будет невозможно написать тесты для этих условий. В любом случае, вы не указали, что такое 4-е условие. Разве покрытие кода не подчеркивает, что покрыто, а что нет?

5. @EJoshuaS Я использую инструмент покрытия Typemock

Ответ №1:

Четвертого сценария здесь нет. Следующие три сценария обеспечат полное покрытие вашего кода:

  1. cart не является null и itemCount == 0
  2. cart не является null и itemCount != 0
  3. cart есть ли null

C # (как и многие языки программирования) будет оценивать первый операнд cart == null и, если это верно, не оценивать второй операнд. Просто это потому, что, как только первый операнд имеет значение true, мы знаем, что ответ верен. Смотрите документацию от Microsoft, которая описывает это поведение || оператора.

Ваш вопрос подразумевает, что инструмент сообщает вам, что у вас нет 100% покрытия в первых трех сценариях. Если да, то стоило бы разобраться, почему этот инструмент не считает, что у вас 100% покрытие.

Ответ №2:

Отказ от ответственности: я работаю в Typemock — компании, занимающейся модульным тестированием, инструмент покрытия решений не знает, когда игнорировать эти сценарии, которые невозможно достичь. Пока вам придется игнорировать эти случаи. Чтобы упростить поиск этих сложных случаев, мы рекомендуем использовать HTML-экспорт, в котором вы можете увидеть, сколько раз выполнялся оператор if, и рассчитать покрытие вручную, просто чтобы убедиться, что вы не пропустили ни одного возможного сценария