модульные тесты gtest путь к целевому файлу конфигурации

#c #unit-testing #googletest

#c #модульное тестирование #googletest

Вопрос:

В моем приложении на C у меня есть текстовый файл (dataFile.txt), который установлен на целевой машине Linux по следующему пути:

 /SoftwareHomeDir/Configuration/Application/dataFile.txt
  

Этот файл существует в моей среде исходного кода Rational ClearCase по пути:

 /ProjectName/config/Application/dataFile.txt
  

Я разрабатываю unitTest в gtest, который выполняет следующее:

Прочитайте определенные данные из dataFile.txt , если данные не существуют, затем запишите их в файл.

1) Я избегаю создавать переменную среды, чтобы проверить, нахожусь ли я в среде компиляции или на целевой машине. Затем добавьте дополнительный тестовый код в финальную версию. Я действительно хочу отделить тестовый код от конечного кода.

2) Я не использую никакой IDE (ни visual studio, ни qt и т.д.), Только notepad

3) Компиляция. сервер является общим (доступ с именем пользователя, однако корневая папка «/» является общей. Это означает, что если я создам путь "/SoftwareHomeDir/Confiugration/Application/dataFile.txt" , он будет виден всем пользователям, и если другой пользователь запускает свой gtest unitTest, он может перезаписать мой файл.

4) В конечном коде путь к файлу данных жестко запрограммирован, и реализация метода filesearch (filename) для поиска файла на всем жестком диске перед чтением файла обходится очень дорого (выполнение займет несколько секунд).

Вопрос:

Я ищу решение для модульного тестирования моего кода в среде компиляции, которая использует /ProjectName/config/Application/dataFile.txt

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

1. Либо настройте свое приложение для работы в обеих средах, либо измените обе среды в соответствии с вашим приложением. Поскольку ваше приложение не может быть настроено (вы говорите, что путь к файлу жестко запрограммирован), возможно, вы можете изменить свою среду? Например, можете ли вы использовать символическую ссылку с ожидаемым приложением путем, который указывает на фактический файл в вашей тестовой среде?

2. Я нашел элегантное решение, включающее Google gtest и gmock. Таким образом, я не вношу изменений в код выпуска. Решение состоит в том, чтобы фактически создать функцию getPath, которая возвращает в реальном приложении жестко закодированный путь, т.е. /AppInstallationFolder/Configuration/dataFile.txt Я узнал о делегировании gmock для fake. Таким образом, я вызываю поддельную функцию getPath, которая возвращает тестовый путь (или путь к моему файлу конфигурации в clearcase) с использованием gmock github.com/google/googletest/blob/master/googlemock/docs /…

Ответ №1:

Решением моей проблемы было объединить gmock с gtest, как описано по ссылке

https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#delegating-calls-to-a-fake

Единственное изменение, которое я внес в свой код, заключается в том, что вместо определения пути к данным конфигурации с помощью #define я создал функцию getConfigFilePath(), которая возвращает жестко заданный путь к файлу конфигурации в установленном приложении. Отсюда я издевался над классом и в своем макете вызывал поддельный getConfigFilePath(), который возвращает при выполнении реального кода жестко заданный путь к файлу конфигурации в дереве проекта в ClearCase. Это именно то, что я искал.