C ++ / GoogleTest - Как запустить программу установки для каждого теста в каталоге ссылок - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь перехватить стандартный вывод в начале каждого отдельного теста, и если тест не пройден, только после этого вывести стандартный вывод. Мне нужно, чтобы это выполнялось для каждого TEST и TEST_F в каталоге, поэтому я смотрю, могу ли я применить глобальное тестовое приспособление, если это возможно, к основному.

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

struct dummyFixture : public ::testing::Test
{
    // --- Need to apply this globally ---
    void SetUp()
    {
        backup = std::cout.rdbuf();
        std::cout.rdbuf(testingSink.rdbuf());
    }
    void TearDown()
    {
        std::cout.rdbuf(backup);
        if (::testing::Test::HasFailure())
            std::cout << testingSink.str() << std::endl;
        testingSink.str(std::string());
    }
    private:
        std::stringstream testingSink;
        std::streambuf *backup;
};

TEST(dummyTest, test_pass)
{
    // should not print log to console
    std::cout << "DUMMY TEST" << std::endl;
    EXPECT_TRUE(true);
}
TEST_F(dummyFixture, test_fail)
{
    // should print log to console
    std::cout << "DUMMY TEST FIXTURE" << std::endl;
    EXPECT_TRUE(false);
}

int main(int argc, char **argv)
{
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

1 Ответ

0 голосов
/ 31 мая 2019

Поскольку вы не хотите изменять какие-либо текстовые фикстуры и хотите запускать это так же, как SetUp () и TearDown () тестового фикстура, вы можете попробовать использовать следующий подход.

class Logger
{
 Logger()
    {
        backup = std::cout.rdbuf();
        std::cout.rdbuf(testingSink.rdbuf());
    }
    ~Logger()
    {
        std::cout.rdbuf(backup);
        if (::testing::Test::HasFailure())
            std::cout << testingSink.str() << std::endl;
        testingSink.str(std::string());
    }
    private:
        std::stringstream testingSink;
        std::streambuf *backup;
};

Теперь вы можете получить все ваши тестовые классы (производные от :: testing :: test) из этого класса Logger.

struct dummyFixture : public ::testing::Test, **public Logger**
{
};

GTest также имеет методы CaptureStdout () и GetCapturedStdout () для получения захваченной строки stdout, вы также можете использовать их.

Это обеспечит достижение того, что вы пытаетесь сделать, с минимальными изменениями кода.

...