33.3. Вариативные сравнительные файлы #
Поскольку некоторые тесты по сути выдают результаты, зависящие от окружения, мы предлагаем несколько вариантов «ожидаемых» файлов результата. Каждый регрессионный тест может иметь несколько сравнительных файлов, показывающих возможные результаты на разных платформах. Существует два независимых механизма для определения, какой именно сравнительный файл будет выбран для каждого теста.
Первый механизм позволяет выбирать сравнительный файл для конкретной платформы. Есть файл сопоставления src/test/regress/resultmap
, в котором определяется, какой сравнительный файл выбирать для каждой платформы. Чтобы устранить ложные «сбои» тестирования для конкретной платформы, для начала вы должны выбрать или создать вариант сравнительного файла, а потом добавить строку в файл resultmap
.
Каждая строка в файле сопоставления выглядит как
testname:output:platformpattern=comparisonfilename
Имя теста (testname
) здесь - просто название конкретного модуля регрессионного теста. Значение output
показывает, вывод какого файла проверять. Для стандартного регрессионного теста это всегда out
. Значение соответствует расширению выходного файла. platformpattern
представляет собой шаблон в стиле Unix-утилиты expr
(т. е. регулярное выражение с неявным ^
якорем в начале). Этот шаблон сравнивается с именем платформы, которое выводится из config.guess
. comparisonfilename
это имя сравнительного файла, который будет использован.
Например, в некоторых системах нет функции strtof
или она работает некорректно, а с нашей заменой для неё возникают ошибки округления в регрессионном тесте float4
. Поэтому мы предлагаем вариант сравниваемого файла float4-misrounded-input.out
, который содержит результаты, ожидаемые в таких системах. Чтобы замаскировать сообщение о ложном «сбое» на платформах Cygwin, файл resultmap
содержит:
float4:out:.*-.*-cygwin.*=float4-misrounded-input.out
Указанный файл будет выбран в системе, в которой результат config.guess
совпадёт с .*-.*-cygwin.*
. В других строках resultmap
могут выбираться варианты сравниваемых файлов для других платформ, если это требуется.
Второй механизм выбора более автоматический: он просто выбирает «подходящую пару» из нескольких предлагаемых сравнительных файлов. Драйвер скрипта регрессионного теста рассматривает стандартный сравнительный файл для теста,
, вариативный файл имя_теста
.out
(где имя_теста
_цифра
.outцифра
любое однозначное число от 0
до 9
). Если какой-нибудь из этих файлов полностью совпадает, тест считается пройденным. В противном случае для отчёта об ошибке выбирается файл с наименьшим различием. (Если в resultmap
есть запись для конкретного теста, имя_теста
будет заменено именем, полученным из файла resultmap
.)
Например, для теста char
сравнительный файл char.out
содержит результаты, ожидаемые для локалей C
и POSIX
, тогда как файл char_1.out
содержит результаты, характерные для многих других локалей.
Механизм «лучшей пары» был разработан, чтобы справляться с результатами, зависящими от локали, но он может применяться в любой ситуации, когда сложно предсказать результаты, исходя только из названия платформы. Ограниченность этого метода проявляется лишь в том, что драйвер теста не может сказать, какой вариант правилен для данного окружения; просто выбирается вариант, который кажется наиболее подходящим. Поэтому безопаснее всего использовать этот метод только для вариативных результатов, которые вы хотели бы видеть одинаково надёжными для любого контекста.