С помощью этого трюка вы можете собирать отдельные тестовые отчеты xml во временные буферы / файлы; все из одного тестового двоичного файла. Позволяет использовать QProcess для сбора отдельных результатов теста из одного двоичного файла; тест вызывает себя с измененными аргументами. Во-первых, мы вводим специальный аргумент командной строки, который использует правильные подтесты - все это все еще в вашем тестовом исполняемом файле. Для нашего удобства мы используем перегруженную функцию qExec, которая принимает QStringList. Затем мы можем легче вставить / удалить наш аргумент "-subtest".
// Source code of "Test"
int
main( int argc, char** argv )
{
int result = 0;
// The trick is to remove that argument before qExec can see it; As qExec could be
// picky about an unknown argument, we have to filter the helper
// argument (below called -subtest) from argc/argc;
QStringList args;
for( int i=0; i < argc; i++ )
{
args << argv[i];
}
// Only call tests when -subtest argument is given; that will usually
// only happen through callSubtestAndStoreStdout
// find and filter our -subtest argument
size_t pos = args.indexOf( "-subtest" );
QString subtestName;
if( (-1 != pos) && (pos + 1 < args.length()) )
{
subtestName = args.at( pos+1 );
// remove our special arg, as qExec likely confuses them with test methods
args.removeAt( pos );
args.removeAt( pos );
if( subtestName == "test1" )
{
MyFirstTest test1;
result |= QTest::qExec(&test1, args);
}
if( subtestName == "test2" )
{
MySecondTest test2;
result |= QTest::qExec(&test2, args);
}
return result;
}
В вашем скрипте / вызове командной строки:
./Test -subtest test1 -xml ... >test1.xml
./Test -subtest test2 -xml ... >test2.xml
и вот вы - у нас есть средства для разделения результатов тестов. Теперь мы можем продолжать использовать возможность QProcess для сбора stdout для вас. Просто добавьте эти строки в свою главную. Идея состоит в том, чтобы снова вызвать наш исполняемый файл, если не требуется никаких явных тестов, но с нашим специальным аргументом:
bool
callSubtestAndStoreStdout(const String& subtestId, const String& fileNameTestXml, QStringList args)
{
QProcess proc;
args.pop_front();
args.push_front( subtestId );
args.push_front( "-subtest" );
proc.setStandardOutputFile( fileNameTestXml );
proc.start( "./Test", args );
return proc.waitForFinished( 30000 ); // int msecs
}
int
main( int argc, char** argv )
{
.. copy code from main in box above..
callSubtestAndStoreStdout("test1", "test1.xml", args);
callSubtestAndStoreStdout("test2", "test2.xml", args);
// ie. insert your code here to join the xml files to a single report
return result;
}
Тогда в вашем скрипте / вызове командной строки:
./Test -xml # will generate test1.xml, test2.xml
Действительно, мы надеемся, что будущие версии QTestLib облегчат эту задачу.