2014-01-27 1 views
2

Можно ли использовать более одного макроса 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().

ответ

1

Нет, этот код будет работать должным образом. Детский процесс теста смерти знает, какой макрос теста смерти он был вызван, и будет выполнять только проверенную инструкцию, указанную в этом макросе. Например, в вашем коде дочерние процессы, вызванные во втором EXPECT_EXIT, макрос будет выполнять только g() и пропускать f().

+0

О, я вижу. Большое спасибо. Поэтому моя проблема на самом деле немного отличается. Первое тело макроса полностью пропущено, поэтому, если он выполняет некоторую реальную работу (например, создает файл), все утверждения, проверяющие результаты в середине между двумя макросами, не будут выполняться в дочернем процессе, порожденном вторым макросом. Вот почему мой код никогда не попадает во второй макрос. Есть ли возможности исправить это? – tkhomas

+0

Заявления о смерти не пропущены, они выполняются в дочернем процессе. Это означает, что эффекты такого выражения в памяти не будут отображаться в основном тесте или в других тестовых утверждениях. Если такой оператор создает файл, он будет виден - просто убедитесь, что он покраснел на диск. Но если вы сохраните его имя в переменной, это имя не будет видно снаружи. – VladLosev

+0

Кроме того, поскольку предыдущий тестовый код выполняется в каждом дочернем процессе теста смерти, избегайте использования функций uisng, генерирующих уникальные имена файлов в коде с критериями смертности - вместо этого вместо имен базовых временных имен файлов. См. Https://code.google.com/p/googletest/wiki/AdvancedGuide#Getting_the_Current_Test_s_Name о том, как получить доступ к имени теста. – VladLosev

Смежные вопросы