Я пытаюсь написать модульные тесты для набора классов, которые обращаются или изменяют глобальные переменные.
Первый глобальный, который я должен был закончить, был:
extern std::atomic<Foo> GlobalFoo;
куда Foo
является enum class
, Я написал 2 отдельных класса для обработки установки и получения значения. Я построил модульные тесты, которые прошли, как и ожидалось. В тестовые файлы я включаю переменные для копирования глобального состояния (плюс дополнительные объекты без состояния, которые я могу использовать для тестирования). Затем я могу использовать эти глобальные копии для восстановления значений после каждого теста. Например:
namespace Tests
{
// Global save state
const Framework::Foo originalGlobal = Framework::GlobalFoo;
// Test constants
const auto service = Framework::FooRetriever();
const auto testFoo = Framework::Foo::SomeValue;
TEST_CLASS(FooRetrieverUnitTests)
{
...
Следующий глобальный проект, над которым я начал работать, был:
extern const std::unordered_map<
std::vector<char>, std::vector<char>, std::hash<std::vector<char>> GlobalBar;
Я хочу создать класс, который будет возвращать общий указатель на эту глобальную коллекцию.
Я начинаю с написания моих тестовых констант:
namespace Tests
{
// Alias
using Collection = const std::unordered_map<
std::vector<char>, std::vector<char>, std::hash<std::vector<char>>;
// Global state
const std::shared_ptr<Collection> global =
std::make_shared<Collection>(Framework::GlobalBar);
TEST_CLASS(FooRetrieverUnitTests)
{
// TODO
};
}
Тем не менее, запуск теста в этот момент выдает следующее сообщение для всех моих тестов (т.е. не только этот новый тест):
Не удалось настроить контекст выполнения для запуска теста
Комментирование глобального позволяет запускать все тесты.
Если я переместить строку, прокомментированную как // Global state
в метод теста, то тест будет работать без проблем.
Я посмотрел на ошибку, но не смог найти ничего, что касалось моей проблемы. Я подозреваю, что сообщение об ошибке маскирует реальную проблему. Когда я запускаю тесты через командную строку, я не получаю никакой дополнительной информации. Я был убежден, что это возможно из-за отсутствующей DLL (хотя я обнаружил, что это маловероятно, поскольку я просто использовал стандартную библиотеку без дополнительных плат).
Мой проект представляет собой статическую библиотеку, а мои модульные тесты представлены в форме DLL (это подход по умолчанию, используемый в модуле модульного тестирования Microsoft Visual Studio).
Минус обычная рутина «не используй глобалы» (мне нужно несколько глобалов в этом приложении, в основном касающихся путей и языковых настроек), мне было интересно, может ли кто-нибудь дать некоторое представление о проблеме, с которой я сталкиваюсь. Возможно, я делаю что-то не так, делая копию глобальной коллекции в моем Tests
namespace или есть другая ошибка в модульном тестировании Visual Studio.
Код компилируется без ошибок или предупреждений, но модульные тесты не будут работать в этом состоянии.
Задача ещё не решена.
Других решений пока нет …