Должны ли мы исключить код для анализа покрытия кода?

15

Я работаю над несколькими приложениями, в основном устаревшими. В настоящее время их охват кода довольно низок: обычно от 10 до 50%.

Уже несколько недель мы регулярно обсуждаем с бангалорскими командами (основная часть разработки ведется на шельфе в Индии) об исключениях пакетов или классов для Cobertura (наш инструмент покрытия кода, даже если мы в настоящее время переходим на JaCoCo).

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

Кроме того, когда они работают над модульным тестом для сложного класса, преимущества - исключительно с точки зрения покрытия кода - будут незамеченными из-за большого приложения. Сокращение охвата кода сделает такие усилия более заметными ...

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

Однако моя точка зрения такова, что мы каким-то образом подделываем цифры. Это решение - простой способ достичь более высокого уровня покрытия кода без каких-либо усилий. Другой момент, который меня беспокоит, заключается в следующем: если мы показываем увеличение охвата от одной недели к другой, как мы можем определить, связаны ли эти хорошие новости с хорошей работой разработчиков или просто с новыми исключениями?

Кроме того, мы не сможем точно знать, что учитывается в показателе покрытия кода. Например, если у меня есть приложение на 10000 строк кода с 40% покрытия кода, я могу вычесть, что 40% моей базы кода протестировано (2) . Но что произойдет, если мы установим исключения? Если охват кода теперь составляет 60%, что я могу точно вычесть? Что 60% моей "важной" базы кода проверено? Как я могу

Что касается меня, я предпочитаю сохранять «реальное» значение покрытия кода, даже если мы не можем быть в восторге от этого. Кроме того, благодаря Sonar, мы можем легко перемещаться по нашей базе кода и знать, для любого модуля / пакета / класса, свое собственное покрытие кода. Но, конечно, глобальный охват кода будет по-прежнему низким.

Каково ваше мнение по этому вопросу? Как вы делаете на ваших проектах?

Благодарю.

(1) Эти уровни обычно связаны с пользовательским интерфейсом / компонентами Java и т. Д.

(2) Я знаю, что это не так. На самом деле, это только означает, что 40% моей базы кода

Ромэн Линсолас
источник
заключены ли контракты против конкретного покрытия?
JK.

Ответы:

3

Я обычно исключаю автоматически сгенерированный код, такой как клиенты WCF, которые генерирует Visual Studio. Там обычно много строк кода, и мы никогда не собираемся их тестировать. Это очень деморализует: увеличивать тестирование большого куска кода в других местах и ​​увеличивать только охват кода на 0,1%.

Я также исключу взаимодействия на уровне данных, если команда может с уверенностью сказать, что этот слой настолько тонкий, насколько это возможно. Хотя вы можете утверждать, что, если слой тонкий, он не будет иметь большого эффекта, он оставляет множество компонентов в отчете о покрытии с 0% против них, поэтому мы не обязательно замечаем те, которые нам нужны действительно беспокоиться о. Уровень пользовательского интерфейса может обсуждаться аналогичным образом, в зависимости от используемой платформы.

Но в качестве контрапункта я также исключу сами юнит-тесты. У них всегда должно быть покрытие ~ 100%, и они составляют значительную долю базы кода, опасно искажая цифры вверх.

прецизионный самописец
источник
Пришел сюда в поисках противоположного. Мои модульные тесты полны обработки ошибок для ситуаций, никогда не возникающих на практике, поэтому никогда не выполняются, поэтому они искажают цифры довольно вниз, сейчас они составляют около 45%.
94239
Я имею в виду обработку ошибок для самого модульного теста, например ... тест выполняется, но диск заполнен, поэтому модульные тесты с использованием ввода-вывода не оправдают ожиданий.
94239,
Хммм. Нет, я был неправ. Эти тесты были выполнены неправильно. Буду удалять все эти комментарии позже.
94239
3

Хороший вопрос. В целом, я склонен исключать код из покрытия кода по ряду причин, например:

  • генерироваться
  • наследие (больше не обновляется)
  • вот оно: некоторые слои я не собираюсь тестировать

Почему последний пункт? Я думаю, что это хорошая практика - сосредоточиться на вещах, которые мне небезразличны, и при этом подавлять отвлекающие факторы Если вы не собираетесь тестировать UI-Layer, зачем принимать это во внимание - это только отвлечет внимание от важной части вашего программного обеспечения - бизнес-логики.

НО:

  1. У вас должна быть веская причина, почему вообще исключить определенный слой из юнит-тестирования (могут возникнуть вопросы - от вашего босса, ваших товарищей по команде, прессы ;-)
  2. Если вы хотите, чтобы они тестировали эти слои, вы должны включить их в статистику, чтобы показать всей команде, каждый день, что это важно и что нужно сделать.

Наконец: не принимайте цифры слишком серьезно. 30% -ое покрытие может служить доказательством того, что программное обеспечение является надежным, когда оно является его неотъемлемой частью.

Энди
источник
1

Я склонен согласиться с вами и включить весь соответствующий код в показатели покрытия кода (и Sonar в целом). Даже если вы не планируете тестировать некоторые части кода (в обозримом будущем), показатели должны отражать фактический статус. Это заставляет вас иметь вескую причину не писать тесты для значительной части кодовой базы. В конце концов (когда-то более важные части кода уже рассмотрены) вы можете пересмотреть или выбрать другой способ устранения этого диссонанса - например, путем рефакторинга рассматриваемого кода, чтобы сделать его тестируемым, или для переноса всей логики из него в другая, тестируемая часть кодовой базы или даже полное исключение уровня (если уровень не стоит тестировать, есть ли у него достаточно веская причина для существования?)

В мои текущие проекты мы также включили весь код в метрики, за одним исключением: сгенерированный код, генерирующий кучу предупреждений статического анализа. Поскольку этот код обычно состоит из огромных POD-классов без какой-либо логики, в любом случае тестировать там нечего.

Петер Тёрёк
источник
1

Теперь я не очень знаком с инструментами покрытия кода, которые вы используете, и я не знаком с бинами Java, но из того, что вы говорите, они связаны с пользовательским интерфейсом.

С моим ограниченным знанием я могу сказать следующее:

  1. Не позволяйте номерам каких-либо инструментов тестирования мешать вашим тестам.
  2. Если классы являются сложными и не могут быть проверены на единицу, всегда полезно перегруппировать их в более компактные и тестируемые классы. Это потребует много усилий и самоотверженности, но в конечном итоге это окупится.
  3. Тестирование компонентов пользовательского интерфейса может быть сложным, но вы все равно можете протестировать функцию, выполняемую этими компонентами.
  4. Если вы делаете веб-проект, вы можете использовать QUnit для модульного тестирования всего кода на стороне клиента.

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

Акшат Дживан Шарма
источник
1
Спасибо за ваш ответ, но вопрос в большей степени связан с анализом покрытия и исключением, а не с тем, как тестировать слои, которые разработчики "не хотят тестировать", а также с тем, как интерпретировать это число (даже если я согласен с вами на то, что это просто номер).
Ромен Линсолас
0

Некоторые исключения имеют смысл (код котельной плиты, который не имеет реального влияния или потенциального влияния на правильное функционирование вашего проекта). Даже по-прежнему собирать покрытие кода в качестве показателя бессмысленно, потому что в любом случае оно не говорит вам ничего полезного. Покрытие кода на 100% не является реальной целью, и низкие цифры покрытия также могут быть неплохими в зависимости от проекта, возможно, что покрытие кода на 20-30% покрывает все, что стоит протестировать. покрытие кода только говорит вам, что X% вашего кода, который потенциально стоит охватить, является неким типом теста неизвестного качества.

Ryathal
источник
0

Я предлагаю сообщать набор метрик для каждого слоя вашего кода. Эти метрики должны включать информацию о размере (например, LoC, количество библиотек, количество классов или методов и т. Д.), Информацию о тестировании (например, покрытие) и информацию об ошибках (например, скорости поиска и исправления).

У ваших исключенных слоев будет 0% покрытия, а у ваших протестированных областей будет 60% покрытия, которое вы упомянули. Информация о размере позволит людям понять, сколько не проверено или протестировано. Информация об ошибке сообщит вам, возможно, вам следует создавать тесты для исключенных слоев и работают ли ваши существующие тесты.

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

Бен
источник