Korzystam z Gtestu testowania C++ Google. Chciałbym przetestować funkcję przeciwko jego czasowi wykonania , np. funkcja foo() kończy się niepowodzeniem, jeśli jej wykonanie trwa dłużej niż 3ms. Nie mogę znaleźć instrukcji ASSERT, aby to osiągnąć. Czy gtest nie zawiera takiej funkcji?Jak zapewnić czas wykonania w Google Test?
Odpowiedz
Prawdopodobnie nie istnieje jako błąd jest nadal otwarte: http://code.google.com/p/googletest/issues/detail?id=348
Dlaczego nie korzystać z takiego prostego rozwiązania?
//pseudo code
clock_t t = clock();
foo();
const double work_time = (clock() - t)/double(CLOCKS_PER_SEC);
ASSERT_TRUE(work_time <= 0.003);
Znalazłem sposób na wykorzystanie statystyk, które GoogleTest drukuje w tym celu. Jest to na poziomie programu, ale prawdopodobnie możesz zrobić to samo w TearDownTestCase()
, aby sprawdzić prędkość sprawdzania poprawności w podzbiorze. Dzieje się tak dlatego, że istnieje funkcja członkowska TestCase-level na poziomie elapsed_time
.
int main(int argc, char* argv[])
{
::testing::InitGoogleTest(&argc, argv);
auto result(RUN_ALL_TESTS());
::testing::internal::TimeInMillis elapsed(
::testing::UnitTest::GetInstance()->elapsed_time());
ASSERT_LT(elapsed, measurePerf ? 180 * 1000 : 215 * 1000);
return result;
}
Reprezentatywne wyniki:
[==========] 338 tests from 18 test cases ran. (207723 ms total) [ PASSED ] 338 tests.
YOU HAVE 13 DISABLED TESTS
FrameworkTest.cpp(39): error: Expected: (elapsed) < (measurePerf ? 190 * 1000 : 170 * 1000), actual: 207723 vs 170000
Obawiam precyzja nie jest wystarczająco wysoka .. Coś 'QueryPerformanceCounter()' będzie lepiej. – Chen
To tylko meta code, możesz użyć tego, czego chcesz zamiast zegara. – fghj
Tak, powinieneś to wskazać, ponieważ zwykle 'clock()' ma małą precyzję. – Chen