Как протестировать частные методы из тестов Boost?

#c #testing #boost

Вопрос:

Я испытываю разочарование при тестировании с помощью Boost, и мне интересно, есть ли более чистый/лучший способ справиться с этим.

У меня есть некоторый метод myFunc (), который является частью MyClass.

  • myFunc() действительно должен быть частным — он предназначен только для внутреннего использования MyClass, больше ничего не нужно знать об этом или использовать.
  • Я должен проверить myFunc(). Это небольшая, но важная часть более крупного класса. Если это не удается, функциональность класса неверна для некоторых применений.

Однако именно здесь мы сталкиваемся с проблемой:

  • Тестовые случаи повышения (настроенные с BOOST_AUTO_TEST_SUITE BOOST_AUTO_TEST_CASE помощью, и т.д.) Не могут получить доступ к закрытым участникам

Итак, я знаю только о двух вариантах, оба одинаково уродливы по разным причинам:

  1. Сделайте функцию общедоступной. Это будет сбивать с толку тех, кто смотрит на класс, так как они подумают, что myFunc() может быть чем-то, что они могли бы использовать внешне, даже если этого не следует делать.
  2. Вызовите один из немногих общедоступных методов, предлагаемых MyClass, таким образом, чтобы вызывалась функция myFunc (), и посмотрите на результаты. По нескольким причинам это полный бардак. Это требует значительно большей настройки в тесте, потому что эти методы делают больше, чем просто то, что делает myFunc (). Это также означает, что если в другом месте кода возникла проблема, это может привести к сбою теста myFunc (), даже если на самом деле все в порядке. Наконец, мне, возможно, потребуется добавить дополнительные общедоступные методы для получения состояния класса, чтобы я знал достаточно, чтобы сказать, является лиmyFunc() работал правильно или нет — поэтому, в конце концов, я добавляю больше общедоступных методов, которые в любом случае никто другой не должен вызывать.

В C есть концепция friend , но поскольку это всего лишь файл .cpp со многими BOOST_AUTO_TEST_CASE внутри, нет никакого класса, с которым можно подружиться.

Я уверен, что другие сталкивались с этим раньше, когда использовали Boost для тестирования. Какие еще существуют решения?

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

1. При всем уважении, детали реализации тестирования (частные лица) — это тестирование, выполненное неправильно. Это неправильное разделение для единиц измерения (в чем суть модульного тестирования). Проверьте поведение класса и выберите тестовые случаи, в которых используется этот закрытый член. Используйте инструменты покрытия, чтобы точно указать их. Затем, если вам нужно изменить детали реализации, тесты все равно передают смысл.

2. Лично я с этим не согласен. Это делает модульные тесты в нашем случае довольно раздутыми по размеру, их сложнее поддерживать при изменении кода, они медленнее запускаются и, в конце концов, требуют больше ненужных общедоступных методов для получения состояния, которое мне нужно было бы проверить, верны ли результаты. Я думаю, что тесты-это хорошее место, чтобы хотя бы немного «нарушить» правила конвенции, поскольку они не являются частью основного кода.