Как я могу заставить сборку перестать работать, когда покрытие кода ниже определенного порога?
Скорее всего, это можно сделать с помощью задачи сборки (особенно, если вы хотите использовать свою собственную). Надеюсь, кто-нибудь опубликует для вас образец кода.
Если нет, меня впечатлил NDepend для этого типа задач. Вы можете написать очень понятный, похожий на SQL синтаксис, чтобы определять всевозможные метрики вашего кода и предупреждать или отказывать сборке на основе пороговых значений.
Примеры:
WARN IF Count > 0 IN SELECT METHODS WHERE CodeWasChanged AND PercentageCoverage < 95
WARN IF Count > 0 IN SELECT METHODS WHERE IsPublic AND IsInOlderBuild AND WasRemoved
Основная проблема заключается в том, что файл результатов покрытия кода, который выдает MSTest, имеет двоичный формат. Однако, если предположить, что в VS2010 все не слишком изменилось, вы сможете использовать эту утилиту для преобразования его в XML файл:
http://codeexperiment.com/file.axd?file=2008%2f9%2fCodeCoverageConverter.zip
ПРИМЕЧАНИЕ: Вам, вероятно, придется перекомпилировать его в VS2010 версию 'Microsoft.VisualStudio.Coverage.Analysis.dll.
Затем вы можете использовать предпочтительный метод разбора этого XML-файла, выполняя математические вычисления для каждой из инструментальных сборок для расчета общего коэффициента покрытия. XPaths, которые вас интересуют (по крайней мере, для VS2008):
/CoverageDSPriv/Module/LinesCovered
/CoverageDSPriv/Module/LinesNotCovered
Если вы хотите сделать этот последний шаг в чистом MSBuild, то вам будет достаточно задач 'XmlRead' и 'Math', содержащихся в библиотеке MSBuild Community Tasks:
http://msbuildtasks.tigris.org/
После того, как вы получили общее соотношение в свойстве MSBuild, вы просто используете условную задачу для прерывания сборки, если это число меньше желаемого порога.
<Error Condition=" $(CodeCoverageRatio) < $(MinCodeCoverage) "
Text="Code Coverage is below required threshold." />