Le_Traceur_Snork
@Le_Traceur_Snork
PHP-программист | Wordpress

Как предотвратить падение PHPUnit в GitLab CI от ошибки типа Warning, прилетающей из bootstrap-точки файла Wordpress-ядра?

Содержимое phpunit.xml:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         colors="true"
         bootstrap="wp-load.php"
         convertWarningsToExceptions="false"
         convertNoticesToExceptions="false"
>
    <testsuites>
        <testsuite name="All Tests from ./tests/">
            <directory>./tests</directory>
        </testsuite>
    </testsuites>
    <coverage>
        <include>
            <directory suffix=".php">./wp-content/themes/FOO/BAR/</directory>
        </include>
        <report>
            <html outputDirectory="./tests/report"/>
        </report>
    </coverage>
</phpunit>


Содержимое запускаемого stage (test.yml):
.test:
  stage: test
  only: [ branches ]
  interruptible: true

variables:
  MYSQL_HOST: mysql
  MYSQL_ROOT_PASSWORD: &mysql-root-password root_password
  MYSQL_DATABASE: &mysql-db db_name
  MYSQL_USER: &mysql-user db_user
  MYSQL_PASSWORD: &mysql-password db_password

.inside-app-image: # Job template: use application image for commands execution
  variables:
    APP_IMAGE: $CI_REGISTRY_IMAGE:$CI_COMMIT_REF_SLUG-branch # eg.: `registry.gitlab.com/group/repository:foo-branch
    WORDPRESS_DB_HOST: 'mysql:3306'
    WORDPRESS_DB_NAME: *mysql-db
    WORDPRESS_DB_USER: *mysql-user
    WORDPRESS_DB_PASSWORD: *mysql-password
    DB_NAME: *mysql-db
    DB_USER: *mysql-user
    DB_PASSWORD: *mysql-password
  image:
    name: "$APP_IMAGE"
    entrypoint: [ '' ]
  before_script:
    - cd /usr/src/wordpress # change working directory (path defined in Dockerfile)

# Run PHPUnit tests
phpunit:
  extends: [ .test, .inside-app-image ]
  services:
    - mysql:8.0
  script:
    - sleep 10
    - composer install
    - composer phpunit


Что реально получаю на пайплайне:
> @php ./vendor/bin/phpunit --no-coverage --color=always
[03-Mar-2023 13:13:58 UTC] PHP Warning:  Undefined array key "HTTP_HOST" in /usr/src/wordpress/wp-includes/functions.php on line 6065
Cleaning up project directory and file based variables
00:00
Job succeeded


Что получаю в докер-контейнере при локальном запуске тестов:
> @php ./vendor/bin/phpunit --no-coverage --color=always
PHPUnit 9.5.27 by Sebastian Bergmann and contributors.

................................................................. 65 / 96 ( 67%)
...............................                                   96 / 96 (100%)

Time: 00:00.017, Memory: 64.50 MB

OK (96 tests, 102 assertions)


Не понимаю, как предотвратить падение тестов от независящей от код-базы ошибки (даже не ошибки, а Warning'а)
  • Вопрос задан
  • 130 просмотров
Решения вопроса 2
TemaSM
@TemaSM
Fullstack, DevOps, InfSec
Проблема возникает скорее всего из-за того, что bootstrap-точка файла Wordpress-ядра вызывает необходимость доступа к суперглобальным переменным, таким как $_SERVER. Но в GitLab CI эти переменные не установлены, и поэтому возникает ошибка "Undefined array key "HTTP_HOST"".
При локальном запуске тестов этот массив определен и поэтому вы не видите ошибку.

Чтобы решить эту проблему, можно попробовать заменить bootstrap="wp-load.php" на bootstrap="tests/bootstrap.php".
После этого создайте файл tests/bootstrap.php со следующим содержимым:
<?php
// Подключаем файл wp-load.php, чтобы иметь доступ к функциям Wordpress
require_once dirname( __FILE__ ) . '/../wp-load.php';

// Устанавливаем значения для некоторых суперглобальных переменных, которые используются в Wordpress
$_SERVER['HTTP_HOST'] = 'localhost';
$_SERVER['SERVER_NAME'] = 'localhost';
$_SERVER['REQUEST_URI'] = '/';

Этот файл загружает файл wp-load.php, устанавливает значения для необходимых суперглобальных переменных и предотвращает возникновение ошибок "Undefined array key "HTTP_HOST"".

Либо можно переопределить значение этой переменной внутри вашего файла phpunit.xml

Для этого необходимо добавить php настройки внутри вашего phpunit.xml файла, которые переопределят значение HTTP_HOST, напр.:
<php>
    <server name="HTTP_HOST" value="localhost"/>
</php>

Это должно предотвратить появление ошибки.
Ответ написан
Комментировать
Le_Traceur_Snork
@Le_Traceur_Snork Автор вопроса
PHP-программист | Wordpress
Фактически, решение было сходно с Tema Smirnov, но немного другим:
Прокинул в phpunit.xml две константы WP_HOME и WP_SITEURL подобным образом:
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
         colors="true"
         bootstrap="wp-load.php"
         convertWarningsToExceptions="false"
         convertNoticesToExceptions="false"
>
    <testsuites>
        ...
    </testsuites>
    <coverage>
        ...
    </coverage>
    <php>
        <const name="WP_HOME" value="http://example.com"/>
        <const name="WP_SITEURL" value="http://example.com/wp"/>
    </php>
</phpunit>
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы