Ограничить тестирование PEX-кода одним методом? - PullRequest
0 голосов
/ 22 сентября 2011

Может ли тестируемый код в PEX быть ограничен одним методом?Я знаю, что вы можете ограничить его сборками и классами, но как насчет членов?

Я, по сути, пытаюсь достичь 100% покрытия кода для следующего метода:

public virtual bool GetLastSymbol(string symbolHint, out string symbol)
{
    if (symbolHint == null)
    {
        throw new ArgumentNullException("symbolHint");
    }

    IEnumerable<string> symbols;
    symbol = this.VariableHints.TryGetValue(symbolHint, out symbols) ? symbols.Last() : null;

    return symbol != null;
}

Следующее PUTдостигает покрытия кода 12/15 , потому что я тестирую только одно из двух возможных значений, которые оно может вернуть:

found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsFalse(found);

Чтобы получить полное покрытие для этого PUT, мне нужноизмените состояние объекта так, чтобы метод попадал в обе ветви.Я мог бы удовлетворить это, используя отдельные PUT с использованием заводского метода для настройки различных состояний, но это позволило бы мне получить 2 PUT с неполным покрытием кода, а не 1 PUT с полным покрытием.Я понимаю, что в теории 2 PUT будут иметь суммарное покрытие 100%, но мне нужно, чтобы на практике это значение 100% , чтобы я мог правильно настроить CI.

Таким образом, чтобы достичь другой ветви в том же PUT, я должен добавить следующий код к вышеупомянутым 2 строкам:

symbolManager.CreateSymbol(symbolHint); // Ensure next call returns true.
found = symbolManager.GetLastSymbol(symbolHint, out symbol);
PexAssert.IsTrue(found);

Предположительно, покрытие кода для метода GetLastSymbol теперь составляет 100%, но потому чтоЯ ввел еще один вызов метода для тестируемого типа, теперь покрытие кода уменьшается до 20/29 .

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

1 Ответ

0 голосов
/ 23 сентября 2011

'Справочник по PEX API', который поставляется с PEX, был полезен для решения этой проблемы:

Пространство имен Microsoft.Pex.Framework.Coverage включает в себя несколько атрибутов фильтра, которые могут исключать различные аспекты из реализации покрытия кода. Тот, который я хотел, был:

PexCoverageFilterMethodAttribute

Используя этот метод, я смог удалить метод CreateSymbol из отчета о покрытии:

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "CreateVariable")]

Теперь увеличено покрытие кода до 13/15 ; выше, чем раньше, но все еще не на 100%, что я ожидал. Короче говоря, я обнаружил, что PEX тоже включал конструктор в отчеты о покрытии ...

[PexCoverageFilterMethod(PexCoverageDomain.UserOrTestCode, "ctor")]

Я сейчас получаю 13/13 для покрытия моего кода. Я счастливый зайчик :)

...