Использование qExec для создания набора тестов Qt

QTest рекомендует организовывать модульные тесты в виде отдельных исполняемых файлов. Для этого есть специальный макрос, который генерирует основную функцию: QTEST_MAIN.

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

Qt: запуск модуля тесты из нескольких тестовых классов и суммировать результаты всех из них

http://www.davideling.it/2014/01/qtest-multiple-unit-test-classes/

https://alexhuszagh.github.io/2016/using-qttest-efficiently/< /а>

Решение состояло в том, чтобы отказаться от использования макроса QTEST_MAIN и написать свою собственную функцию main, в которой вы выполняете тесты, которые хотите выполнить:

int main(int argc, char *argv[])
{
   int status = 0;

   {
       TestA ta;
       status |= QTest::qExec(&ta, argc, argv);
   }

   {
       TestB tb;
       status |= QTest::qExec(&tb, argc, argv);
   }

   return status;
}

Я нашел, что это отличная идея, однако, есть проблема. В документации Qt для qExec есть часть, которая звучит так:

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

Решение, предложенное этими людьми, предполагает именно это: выполнение qExec более одного раза. Может ли кто-нибудь объяснить мне, что именно означает command-line options for logging test output to files and executing individual test functions will not behave correctly?

Что именно может пойти не так при таком подходе?


person Jacob Krieg    schedule 22.09.2017    source источник
comment
FWIW, этот очевидный недостаток меня тоже озадачил. Я бы просто использовал другую среду запуска тестов (например, GoogleTest). Его можно комбинировать со специфичным для Qt механизмом для слотов и сигналов. Кроме того, комментарии на stackoverflow.com/a/3804999/14637 могут ответить на ваш вопрос.   -  person Thomas    schedule 22.09.2017


Ответы (1)


В документации, вероятно, говорится о параметрах ведения журнала. Если вы вызовете qMain дважды и передадите параметр -o обоим вызовам, второй вызов, вероятно, перезапишет файл журнала из первого вызова. Если вы знаете, что этого никогда не произойдет, вы можете проигнорировать предупреждение. Вы также не можете передавать аргументы командной строки в qExec, таким образом вы принудительно выведете вывод на стандартный вывод, но, конечно, вы потеряете возможность передавать другие аргументы.

Если вы хотите запускать тестовые примеры из Qt Creator, вам также не следует вызывать qExec более одного раза. Каждый тестовый класс будет отображаться в списке тестов, но при запуске одного будут запущены все, поэтому вы получите результат для каждого класса, отображаемого для одного класса. И если вы запустите все тесты (по умолчанию), вы получите квадрат результатов.

Поэтому, если вам не нравится подход с несколькими исполняемыми файлами, просто используйте Google Test. У него нет ни одной из вышеперечисленных проблем, и Создатель обеспечивает его поддержку. Настройка очень проста: мастер поможет вам создать проект автотеста. Единственное, что вам нужно сделать, это загрузить Google Test. Тестовые случаи Google будут отображаться рядом с тестовыми примерами Qt в тестовых представлениях.

person SteakOverflow    schedule 24.09.2017