Qt+GTest функциональное тестирование сетевых компонентов

Для тех кто не знает, что такое GTest отправляю на wiki: Google C++ Testing Framework(рус.). И путь вас не смущает, что это библиотека для модульного тестирования.

Использование фреймворка семейства xUnit, для функционального тестирования пришло в голову, когда реализовывал REST интерфейс к конфигурации Service Quality Management, в разработке которой я принимаю участие(на момент написания заметки). Это приложение на PHP с использованием SLIM, json-schema. PHPUnit использовался для автоматизированного тестирования функциональности. Косвенно тестировалась работа с базой, которая не тестируется при модульном тестировании. Все медленные операции(дисковые, взаимодействие с базой данной), а так же ненадежные операции(обрыв сети) заменяются специальной прослойкой и  mock-объектами.

Заканчиваю отступление и перехожу к теме. Сейчас развлекаюсь с MBaaS(mobile backend as a service) решением от QuickBlox. Что бы быть уверенным, что делаю все правильно, а так же для изучения поведения, стал писать тесты.

Еще одно отступление. В соответствие с книгой «Непрерывная интеграция: улучшение качества программного обеспечения и снижение риска» вместе с модульными тестами, можно размещать любые другие автоматические тесты, и если эти тесты довольно долго выполняются, то следует их выполнять по расписанию.

При использования Qt+GTest иногда требуется использовать свой код запуска тестов, т.к. внутри Qt используются то ли синглетоны, то ли статические переменные, которые должны быть инициализированы.

#include <QtCore/QCoreApplication>

#include "gtest/gtest.h"

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

Дальше используется привычное сочетание с QEventLoop(для него и нужен был инстанс QXXXApplication)
Пример запуска сессии:

#include "Auth.h"
#include "QBloxGlobal.h"

#include <QtCore/QCoreApplication>
#include <QtCore/QEventLoop>

#include "gtest/gtest.h"

using namespace QBlox;

TEST(Auth, startSession)
{
	Auth auth(QBLOX_API_SERVER, QBLOX_AUTH_KEY, QBLOX_AUT_SECRET, QBLOX_APP_ID);

	auth.startSession();

	QEventLoop loop;
	QObject::connect(&auth, &Auth::sessionStarted,
			&loop, &QEventLoop::quit);
	loop.exec();
	const auto token = auth.token();

	ASSERT_FALSE(token.isEmpty());
}