Spec-Zone.ru › Qt 6.1

Функции тестирования

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

См. также Функции замены.

Встроенные функции тестирования

Базовые функции тестирования реализованы как встроенные функции.

cache(variablename, [set|add|sub] [transient] [super|stash], [source variablename])

Это внутренняя функция, которую вам обычно не нужно использовать.

Эта функция была введена в Qt 5.0.

CONFIG(config)

Эта функция может использоваться для проверки переменных, размещенных в переменной CONFIG. Это то же самое, что и области видимости, но с добавлением преимущества, что вторым параметром можно передать активную конфигурацию. Поскольку порядок значений важен в переменных CONFIG, (т.е., последняя заданная будет считаться активной конфигурацией для взаимоисключающих значений) второй параметр может использоваться для указания набора значений для рассмотрения. Например:

CONFIG = debug
CONFIG += release
CONFIG(release, debug|release):message(Release build!) #will print
CONFIG(debug, debug|release):message(Debug build!) #no print

Поскольку релиз считается активным значением (для анализа функций) он будет использоваться для генерации файла сборки. В общем случае второй параметр не нужен, но для специфических проверок взаимоисключающих значений он незаменим.

contains(variablename, value)

Возвращает успех, если переменная variablename содержит значение value; в противном случае возвращает неудачу. Можно указать регулярное выражение для параметра value.

Вы можете проверить возвращаемое значение этой функции, используя область видимости.

Например:

contains( drivers, network ) {
    # drivers contains 'network'
    message( "Configuring for network build..." )
    HEADERS += network.h
    SOURCES += network.cpp
}

Содержимое области видимости обрабатывается только в том случае, если переменная drivers содержит значение network. В таком случае, соответствующие файлы добавляются в переменные SOURCES и HEADERS.

count(variablename, number)

Возвращает успех, если переменная variablename содержит список с указанным number количеством значений; в противном случае возвращает неудачу.

Эта функция используется для того, чтобы гарантировать, что объявления внутри области видимости обрабатываются только в том случае, если переменная содержит правильное количество значений. Например:

options = $$find(CONFIG, "debug") $$find(CONFIG, "release")
count(options, 2) {
    message(Both release and debug specified.)
}

debug(level, message)

Проверяет, запускается ли qmake на указанном уровне отладки. Если да, возвращает true и выводит сообщение отладки.

defined(name[, type])

Проверяет, определена ли функция или переменная name. Если type опущено, проверяются все функции. Чтобы проверить только переменные или определенный тип функций, укажите type. Возможные значения:

  • test - проверяются только функции тестирования
  • replace - проверяются только функции замены
  • var - проверяются только переменные

equals(variablename, value)

Проверяет, что variablename равно строке value.

Например:

TARGET = helloworld
equals(TARGET, "helloworld") {
    message("The target assignment was successful.")
}

error(string)

Эта функция никогда не возвращает значение. qmake отображает string как сообщение об ошибке пользователю и завершает работу. Эту функцию следует использовать только для невосстановимых ошибок.

Например:

error(An error has occurred in the configuration process.)

eval(string)

Вычисляет содержимое строки с использованием правил синтаксиса qmake и возвращает true. В строке можно использовать определения и присваивания для изменения значений существующих переменных или создания новых определений.

Например:

eval(TARGET = myapp) {
    message($$TARGET)
}

Примечание: Кавычки могут использоваться для ограничения строки, и возвращаемое значение можно игнорировать, если оно не требуется.

exists(filename)

Проверяет, существует ли файл с заданным filename именем. Если файл существует, функция возвращает успех; в противном случае возвращает неудачу.

Аргумент filename может содержать подстановки. В этом случае функция возвращает успех, если какой-либо файл соответствует.

Например:

exists( $(QTDIR)/lib/libqt-mt* ) {
      message( "Configuring for multi-threaded Qt..." )
      CONFIG += thread
}

Примечание: "/" следует использовать в качестве разделителя каталогов, независимо от используемой платформы.

export(variablename)

Экспортирует текущее значение variablename из локального контекста функции в глобальный контекст.

for(iterate, list)

Инициализирует цикл, который перебирает все значения в list, устанавливая iterate на каждое значение по очереди. Для удобства, если list равно 1..10, iterate перебирает значения от 1 до 10.

Например:

LIST = 1 2 3
for(a, LIST):exists(file.$${a}):message(I see a file.$${a}!)

greaterThan(variablename, value)

Проверяет, что значение variablename больше, чем value. Сначала функция пытается выполнить числовое сравнение. Если хотя бы один из операндов не может быть преобразован, функция выполняет сравнение строк.

Например:

ANSWER = 42
greaterThan(ANSWER, 1) {
    message("The answer might be correct.")
}

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

Например:

VALUE = 123
TMP_VALUE = x$$VALUE
greaterThan(TMP_VALUE, x456): message("Condition may be true.")

См. также lessThan().

if(condition)

Вычисляет condition. Используется для группировки булевых выражений.

Например:

if(linux-g++*|macx-g++*):CONFIG(debug, debug|release) {
    message("We are on Linux or Mac OS, and we are in debug mode.")
}

include(filename)

Включает содержимое файла, указанного filename, в текущий проект в той точке, где оно включается. Функция возвращает успех, если filename включен; в противном случае возвращает неудачу. Включенный файл обрабатывается немедленно.

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

include( shared.pri )
OPTIONS = standard custom
!include( options.pri ) {
    message( "No custom build options specified" )
OPTIONS -= custom
}

infile(filename, var, val)

Возвращает успех, если файл filename (при парсинге самим qmake) содержит переменную var со значением val; в противном случае возвращает неудачу. Если вы не укажете val, функция проверит, была ли переменная var задана в файле.

isActiveConfig

Это псевдоним для функции CONFIG.

isEmpty(variablename)

Возвращает успех, если переменная variablename пуста; в противном случае возвращает неудачу. Это эквивалентно count( variablename, 0 ).

Например:

isEmpty( CONFIG ) {
CONFIG += warn_on debug
}

isEqual

Это псевдоним для функции equals.

lessThan(variablename, value)

Проверяет, что значение variablename меньше value.

Работает как greaterThan().

Например:

ANSWER = 42
lessThan(ANSWER, 1) {
    message("The answer might be wrong.")
}

load(feature)

Загружает файл функции (.prf) указанный feature, если функция еще не загружена.

log(message)

Выводит сообщение в консоль. В отличие от функции message, не добавляет текст в начало и не добавляет перевод строки в конец.

Эта функция была введена в Qt 5.0.

См. также message().

message(string)

Всегда возвращает успех и отображает string как общее сообщение пользователю. В отличие от функции error(), эта функция позволяет продолжить обработку.

message( "This is a message" )

Вышеприведенная строка записывает "Это сообщение" в консоль. Использование кавычек необязательно, но рекомендуется.

Примечание: По умолчанию сообщения выводятся для каждого файла Makefile, сгенерированного qmake для данного проекта. Если вы хотите гарантировать, что сообщения отображаются только один раз для каждого проекта, проверьте переменную build_pass в сочетании с областью видимости, чтобы отфильтровать сообщения во время сборки. Например:

!build_pass:message( "This is a message" )

mkpath(dirPath)

Создает путь к каталогу dirPath. Эта функция является оберткой вокруг функции QDir::mkpath.

Эта функция была введена в Qt 5.0.

requires(condition)

Вычисляет condition. Если условие ложно, qmake пропускает этот проект (и его SUBDIRS) во время сборки.

Примечание: Вы также можете использовать переменную REQUIRES для этой цели. Однако мы рекомендуем использовать эту функцию вместо этого.

system(command)

Выполняет заданную command команду в дочерней оболочке. Возвращает успех, если команда завершается с кодом возврата 0; в противном случае возвращает неудачу. Вы можете проверить возвращаемое значение этой функции, используя область видимости.

Например:

system("ls /bin"): HAS_BIN = TRUE

См. также вариант замены system().

touch(filename, reference_filename)

Обновляет метку времени filename для соответствия метке времени reference_filename.

Эта функция была введена в Qt 5.0.

unset(variablename)

Удаляет variablename из текущего контекста.

Например:

NARF = zort
unset(NARF)
!defined(NARF, var) {
    message("NARF is not defined.")
}

versionAtLeast(variablename, versionNumber)

Проверяет, что номер версии из variablename больше или равен versionNumber. Номер версии рассматривается как последовательность неотрицательных десятичных чисел, разделенных точкой; любая нечисловая часть строки будет проигнорирована. Сравнение выполняется по сегментам слева направо; если одна версия является префиксом другой, она считается меньшей.

Эта функция была введена в Qt 5.10.

versionAtMost(variablename, versionNumber)

Проверяет, что номер версии из variablename меньше или равен versionNumber.

Работает как versionAtLeast().

Эта функция была введена в Qt 5.10.

warning(string)

Всегда возвращает успех и отображает string как предупреждение пользователю.

write_file(filename, [variablename, [mode]])

Записывает значения variablename в файл с именем filename, каждое значение на отдельной строке. Если variablename не указан, создает пустой файл. Если mode равно append, и файл уже существует, добавляет в него данные вместо перезаписи.

Эта функция была введена в Qt 5.0.

Библиотека функций тестирования

Функции сложных тестов реализованы в библиотеке файлов .prf.

packagesExist(packages)

Использует механизм PKGCONFIG для определения наличия указанных пакетов на момент разбора проекта.

Это может быть полезно для выборочного включения или выключения функций. Например:

packagesExist(sqlite3 QtNetwork QtDeclarative) {
    DEFINES += USE_FANCY_UI
}

А затем, в коде:

#ifdef USE_FANCY_UI
    // Use the fancy UI, as we have extra packages available
#endif

prepareRecursiveTarget(target)

Обеспечивает создание целевых проектов на весь проект, аналогичных цели install, подготавливая целевой объект, который перебирает все подкаталоги. Например:

TEMPLATE = subdirs
SUBDIRS = one two three
prepareRecursiveTarget(check)

Подкаталоги, в которых указаны have_no_default или no_<target>_target в их файле .CONFIG, исключаются из этого целевого объекта:

two.CONFIG += no_check_target

Вы должны вручную добавить подготовленный целевой объект в QMAKE_EXTRA_TARGETS:

QMAKE_EXTRA_TARGETS += check

Чтобы сделать целевой объект глобальным, приведенный выше код необходимо включить в каждый подкаталог подпроекта. Кроме того, для функционирования этих целевых объектов подпроекты, не являющиеся подкаталогами, должны включать соответствующий код. Наиболее простой способ достижения этого - создание пользовательского файла функций. Например:

# <project root>/features/mycheck.prf
equals(TEMPLATE, subdirs) {
    prepareRecursiveTarget(check)
} else {
    check.commands = echo hello user
}
QMAKE_EXTRA_TARGETS += check

Файл функций необходимо вводить в каждый подпроект, например, через .qmake.conf:

# <project root>/.qmake.conf
CONFIG += mycheck

Эта функция была введена в Qt 5.0.

qtCompileTest(test)

Создаёт тестовый проект. Если тест пройден, возвращается true, и config_<test> добавляется в переменную CONFIG. В противном случае возвращается false.

Чтобы сделать эту функцию доступной, необходимо загрузить соответствующий файл функций:

# <project root>/project.pro
load(configure)

Это также устанавливает переменную QMAKE_CONFIG_TESTS_DIR в подкаталог config.tests родительского каталога проекта. Это значение можно переопределить после загрузки файла функций.

Внутри каталога тестов должен быть один подкаталог на тест, содержащий простой проект qmake. Следующий фрагмент кода иллюстрирует файл .pro проекта:

# <project root>/config.tests/test/test.pro
SOURCES = main.cpp
LIBS += -ltheFeature
# Note that the test project is built without Qt by default.

Следующий фрагмент кода иллюстрирует основной файл .cpp проекта:

// <project root>/config.tests/test/main.cpp
#include <TheFeature/MainHeader.h>
int main() { return featureFunction(); }

Следующий фрагмент кода демонстрирует вызов теста:

# <project root>/project.pro
qtCompileTest(test)

Если тестовый проект успешно построен, тест проходит.

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

Чтобы подавить повторное использование кэшированных результатов, передайте CONFIG+=recheck в qmake.

См. также load().

Эта функция была введена в Qt 5.0.

qtHaveModule(name)

Проверяет, присутствует ли модуль Qt, указанный значением name. Список возможных значений см. в QT.

Эта функция была введена в Qt 5.0.1.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qmake-test-function-reference.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API