Я использовал библиотеку Boost Unit Test в аналогичных обстоятельствах с положительными результатами. Я хотел, чтобы у меня были автоматические тесты, чтобы увидеть, работает ли библиотека, как она должна работать при разветвлении. Хотя в моем случае это также было ближе к системному тестированию, я полностью использую доступные инструменты, если они достигают того, что вы хотите.
Одно препятствие, которое нужно преодолеть, - это сигнализация об ошибках дочернего процесса без использования макросов boost assert. Например, если BOOST_REQUIRE
будет использовано для преждевременного прерывания теста, и любые последующие тесты будут выполняться как в родительских, так и в дочерних процессах. Я закончил тем, что использовал код завершения процесса, чтобы сообщить об ошибке ожидающему родительскому процессу. Тем не менее, не используйте exit()
в качестве повышения, имеют atexit()
хуки, которые сигнализируют об ошибках в дочернем процессе, даже если их нет. Вместо этого используйте _exit()
.
Настройка, которую я использовал для тестов, была примерно такой.
BOOST_AUTO_TEST_CASE(Foo)
{
int pid = fork();
BOOST_REQUIRE( pid >= 0 );
if( pid == 0 ) // child
{
// Don't use Boost assert macros here
// signal errors with exit code
// Don't use exit() since Boost test hooks
// and signal error in that case, use _exit instead.
int rv = something();
_exit(rv);
}else{ // parent
// OK to use boost assert macros in parent
BOOST_REQUIRE_EQUAL(0,0);
// Lastly wait for the child to exit
int childRv;
wait(&childRv);
BOOST_CHECK_EQUAL(childRv, 0);
}
}