Можно ли использовать более одного макроса EXPECT_EXIT в одном тесте на платформе Windows? Проблема возникает из-за того, что на тестах смертности платформы Windows работают в режиме «threadafe», поэтому процесс, созданный макросами EXPECT_EXIT, будет запускать все тесты с самого начала. Рассмотрим пример кода:googletest: тесты смерти: несколько expect_exit в одном тесте
TEST_F(MyFixtureDeathTest, Test1)
{
EXPECT_EXIT(f(), ::testing::ExitedWithCode(1), "message1");
//....
// actions after the exit (for instanse, emulation of the application correct restart)
//....
EXPECT_EXIT(g(), ::testing::ExitedWithCode(1), "message2");
}
Итак, когда тест получает второй EXPECT_EXIT макросов это сделает код для запуска с началом теста, поэтому он будет вызывать функцию F(), сделать выход есть и на самом деле никогда не к телу функции g(). Возможно, я не должен использовать GoogleTest для выполнения этой задачи, не так ли?
Любая помощь приветствуется. Благодарю.
UPD. (пояснение) На самом деле, я совершенно уверен, что в описанном фрагменте кода даже функция f() не будет вызываться из процесса, порожденного вторым макросом EXPECT_EXIT.
UPD. Теперь проблема кажется мне немного другой. Как сказал Владлосев, первый макрос будет полностью проигнорирован в дочернем процессе, порожденном вторым макросом. Но в случае каких-либо утверждений в промежутке между двумя макросами, основанными на некоторых результатах функции f(), дочерний процесс попадет в assert и выйдет туда, поэтому он не сможет добраться до g().
О, я вижу. Большое спасибо. Поэтому моя проблема на самом деле немного отличается. Первое тело макроса полностью пропущено, поэтому, если он выполняет некоторую реальную работу (например, создает файл), все утверждения, проверяющие результаты в середине между двумя макросами, не будут выполняться в дочернем процессе, порожденном вторым макросом. Вот почему мой код никогда не попадает во второй макрос. Есть ли возможности исправить это? – tkhomas
Заявления о смерти не пропущены, они выполняются в дочернем процессе. Это означает, что эффекты такого выражения в памяти не будут отображаться в основном тесте или в других тестовых утверждениях. Если такой оператор создает файл, он будет виден - просто убедитесь, что он покраснел на диск. Но если вы сохраните его имя в переменной, это имя не будет видно снаружи. – VladLosev
Кроме того, поскольку предыдущий тестовый код выполняется в каждом дочернем процессе теста смерти, избегайте использования функций uisng, генерирующих уникальные имена файлов в коде с критериями смертности - вместо этого вместо имен базовых временных имен файлов. См. Https://code.google.com/p/googletest/wiki/AdvancedGuide#Getting_the_Current_Test_s_Name о том, как получить доступ к имени теста. – VladLosev