2014-12-11 4 views
1

Я немного запутался в отношении покрытия кода.Единица измерения кода покрытия

Пример: У меня есть метод, который имеет несколько операторов if (не вложенных), каждый из которых добавляет строку, которую я возвращаю после завершения.

Мой блок-тест проверяет исходный и конечный результат, что я намеренно делаю ради этого вопроса. Ничего промежуточного (так что никаких проверок других утверждений)

Проблема: Если я запустил этот тест, я получаю покрытие на 100% кода. Проблема, с которой я сталкиваюсь в понимании этого, заключается в том, что я хочу, чтобы охват кода самого метода, а не то, сколько из моего теста ударяется. Это должно быть немного ниже, поскольку инструкции else не пострадали.

Я просмотрел различные обучающие программы и msdn об модульном тестировании и охвате кода. В некоторых случаях тесты, по-видимому, анализируют код самого метода (что я хочу сделать), но в большинстве других случаев он проверяет только тест на покрытие кода.

Мой вопрос: Есть ли способ связать тест с методом, чтобы он получал покрытие кода в методе, когда я анализирую покрытие кода тестов, или это то, что предназначено для покрытия кода, и пользователь должен написать тесты для учетной записи эти отрасли?

Спасибо за ваше время.

EDIT: Пример кода.

public static string testingString(string s1, string s2, bool isAllowed, bool isAdmin, bool isCustomer){ 
    string result = string.Format("{0}/{1}", s1, s2); 
    if (isAllowed) result += "/Allowed"; 
    if (isAdmin) result += "/admin"; 
    if (isCustomer) result += "/customer"; 
    return result; 
} 

Тест:

[TestMethod] 
public void testingString_BasicTest() 
{ 
    var result = testingString("test1", "test2", false, false, false); 
    var expectedResult = string.Format("{0}/{1}", "test1", "test2"); 

    Debug.WriteLine("Result should be: " + expectedResult); 
    Assert.AreEqual(expectedResult, url); 
} 

testingString_BasicTest будет иметь покрытие коды 100% в этом случае, несмотря на не попав 3 если заявления результатов.

+3

Пример кода может помочь здесь :) – Liath

+0

Это получает покрытие на 100% кода? Вы фактически использовали это с помощью инструмента покрытия и посмотрели отчет?] Используя какой инструмент [предположительно VS2013]? Он может получить 100% * линию * охват; каждая * строка * в вашей функции выполнена. Но ясно, что не каждый * оператор * выполняется. С ложным/ложным/ложным, «результат + = ....«Операторы явно не исполняются –

+0

... Кроме того, необходимо следить за ограничениями в инструментах. Многие байт-кодовые инструменты могут разрешать код только до уровня« линии », потому что байт-код в лучшем случае содержит номера строк. оператор покрытия ", который отслеживает выражения * строки *, может на самом деле путать отчет о том, что« строка »полностью покрывается, если какая-либо часть любого оператора в строке выполняется. Требуется инструмент с более тонкой детализацией, чтобы сообщать о состоянии отчета, если есть несколько операторов в строке, и вы хотите, чтобы их можно было отличить друг от друга. –

ответ

1

Охват кода относится к выполнению кода в рамках выполнения теста. На самом деле это не имеет ничего общего с тем, что протестировано, просто в какой-то момент, когда ваши тесты запущены.

Покрытие кода будет возвращено на 100%, если каждая команда в этом методе будет выполнена в любой момент процесса тестирования. Если вы хотите просмотреть покрытие кода (используя инструмент покрытия кода VS 2013 Ultimate) для отдельного теста, выберите его в окне «Диспетчер тестов» и нажмите «Проверить/проанализировать охват кода/выбранные тесты», чтобы узнать, что охватывает этот конкретный тест.

+0

Я вижу. Спасибо за это объяснение. Это помогло мне разобраться в этом. – mat

+0

Этот ответ крайне вводит в заблуждение; он предполагает «покрытие кода» === «покрытие линии». Существует множество видов тестового покрытия; см. https://en.wikipedia.org/wiki/Code_coverage для наиболее часто используемых терминов. То, что хочет OP, - это нечто большее, чем «покрытие заявлений». –

+0

Заявление «Охват кода будет возвращен на 100%, если каждая команда в этом методе будет выполнена в любой момент вашего тестирования». означает, что каждое высказывание на каждой строке затрагивается, а не только то, что затрагивается каждая строка. Ни один из инструментов покрытия кода, с которыми я знаком, будет содержать 100% -ный охват кода без выполнения каждого оператора. – Grax

-1

Учитывая ваше обновление, вы получаете 100% -ное покрытие из-за того, как вы структурировали свой код. Все строки попадают, событие, хотя не все коды кода выполняются. Если вы реструктурировать свой код, как это, то вы не получите 100% охват больше:

public static string testingString(string s1, string s2, bool isAllowed, bool isAdmin, bool isCustomer){ 
    string result = string.Format("{0}/{1}", s1, s2); 
    if (isAllowed) 
    { 
     result += "/Allowed"; 
    } 
    if (isAdmin) 
    { 
     result += "/admin"; 
    } 
    if (isCustomer) 
    { 
     result += "/customer"; 
    } 
    return result; 
} 

Некоторые инструменты будут справиться с этим лучше, чем другие (я считаю, JetBrains dotCover не сообщит свою версию, как покрытый), но некоторые просто посмотреть на том, выполнялся ли код по строке или нет, поскольку он появляется, как это делает инструмент визуальной студии, поэтому он видит выполняемый if() и рассматривает всю охватываемую линию.

+0

Это форсирует отдельные заявления на отдельных строках, тем самым пытаясь сделать «покрытие линии» === «охват заявления». Я не знаю, действительно ли это удается с помощью MS-инструмента; «{» и «»} также отмечены как покрытые линией (стандартный инструмент PHP, использующий XDebug, страдает от той же проблемы, что и невозможность подсчета покрытия строк для «}», также потому, что он имеет доступ только к «номера строк» ​​и «}» не указаны в байтовом коде). –

Смежные вопросы