30.3. Вариативные сравнительные файлы

Поскольку некоторые тесты по сути выдают результаты, зависящие от окружения, мы предлагаем несколько вариантов «ожидаемых» файлов результата. Каждый регрессионный тест может иметь несколько сравнительных файлов, показывающих возможные результаты на разных платформах. Существует два независимых механизма для определения, какой именно сравнительный файл будет выбран для каждого теста.

Первый механизм позволяет выбирать сравнительный файл для конкретной платформы. Есть файл сопоставления src/test/regress/resultmap, в котором определяется, какой сравнительный файл выбирать для каждой платформы. Чтобы устранить ложные «сбои» тестирования для конкретной платформы, для начала вы должны выбрать или создать вариант сравнительного файла, а потом добавить строку в файл resultmap.

Каждая строка в файле сопоставления выглядит как

testname:output:platformpattern=comparisonfilename

Имя теста (testname) здесь - просто название конкретного модуля регрессионного теста. Значение output показывает, вывод какого файла проверять. Для стандартного регрессионного теста это всегда out. Значение соответствует расширению выходного файла. platformpattern представляет собой шаблон в стиле Unix-утилиты expr (т. е. регулярное выражение с неявным ^ якорем в начале). Этот шаблон сравнивается с именем платформы, которое выводится из config.guess. comparisonfilename это имя сравнительного файла, который будет использован.

Например, некоторые системы интерпретируют очень маленькие числа с плавающей запятой как ноль, а не как ошибку потери значимости. Это приводит к расхождениям в регрессионных тестах для float8. Поэтому мы предлагаем вариант сравнительного файла float8-small-is-zero.out, который включает в себя результат, ожидаемый для таких систем. Чтобы замаскировать сообщение о ложном «сбое» на платформе OpenBSD, файл resultmap включает в себя:

float8:out:i.86-.*-openbsd=float8-small-is-zero.out

который сработает на любой машине, где выходное значение config.guess соответствует i.86-.*-openbsd. Другие строки в resultmap выбирают вариант сравнительного файла для других платформ, если это целесообразно.

Второй механизм выбора более автоматический: он просто выбирает «подходящую пару» из нескольких предлагаемых сравнительных файлов. Драйвер скрипта регрессионного теста рассматривает стандартный сравнительный файл для теста, имя_теста.out, вариативный файл имя_теста_цифра.out (где цифра любое однозначное число от 0 до 9). Если какой-нибудь из этих файлов полностью совпадает, тест считается пройденным. В противном случае для отчёта об ошибке выбирается файл с наименьшим различием. (Если в resultmap есть запись для конкретного теста, имя_теста будет заменено именем, полученным из файла resultmap.)

Например, для теста char сравнительный файл char.out содержит результаты, ожидаемые для локалей C и POSIX, тогда как файл char_1.out содержит результаты, характерные для многих других локалей.

Механизм "лучшей пары" был разработан, чтобы справляться с результатами, зависящими от локали, но он может применяться в любой ситуации, когда сложно предсказать результаты, исходя только из названия платформы. Ограниченность этого метода проявляется лишь в том, что драйвер теста не может сказать, какой вариант правилен для данного окружения; просто выбирается вариант, который кажется наиболее подходящим. Поэтому безопаснее всего использовать этот метод только для вариативных результатов, которые вы хотели бы видеть одинаково надёжными для любого контекста.