Как настроить, какая среда Symfony используется модульными тестами?

Я пытаюсь настроить новую среду Symfony с именем travis для запуска модульных тестов в контейнере Travis.

Я настраиваю эту среду, чтобы отличать ее от prod и от dev.

В настоящее время у меня есть:

  • SYMFONY_ENV=travis настройка переменной среды в Travis
  • config_travis.yml, который содержит мою конфигурацию для среды Travis
  • a app_travis.php, которые указывают среду для загрузки
  • а .travis.yml:

>

language: php

php:
  - "7.2.17"

services:
  - mysql

install:
  - composer install --no-interaction
  - echo "USE mysql;\nUPDATE user SET password=PASSWORD('${MYSQL_PASSWORD}') WHERE user='root';\nFLUSH PRIVILEGES;\n" | mysql -u root
  - ./bin/console doctrine:database:create --env=travis
  - ./bin/console doctrine:migration:migrate --env=travis --no-interaction

script:
  - ./vendor/bin/simple-phpunit

Мой проект выглядит так:

Как настроить, какая среда Symfony используется модульными тестами?

Некоторые примеры тестов, которые я запускаю:

UserTest.php который тестирует User.php модель:

<?php
namespace Tests\AppBundle\Entity;

use AppBundle\Entity\User;
use PHPUnit\Framework\TestCase;
use AppBundle\Entity\Responsibility;

class UserTest extends TestCase
{
    public function testId()
    {
        $user = new User();
        $id = $user->getId();
        $this->assertEquals(-1, $id);
    }
}

LoginControllerTest.php который тестирует LoginController.php контроллер:

<?php
namespace Tests\AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Test\WebTestCase;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\BrowserKit\Cookie;
use Symfony\Component\HttpFoundation\Response;

class LoginControllerTest extends WebTestCase
{
    /*
     * Test the login form
     * Logins with (admin, password : a)
     */
    public function testLogin()
    {
        // Create a new client to browse the app
        $client = static::createClient();
        $crawler = $client->request('GET', '/login');
        $this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET ");
        // Get the form
        $form = $crawler->selectButton('Connexion')->form();
        // Fill the login form input
        $form['_username']->setValue('admin');
        $form['_password']->setValue('a');
        // Send the form
        $client->submit($form);
        $crawler = $client->followRedirect();
        $this->assertContains(
                'Bienvenue admin.' ,
                $client->getResponse()->getContent()
        );

        return array($client,$crawler);
    }
}

Моя проблема: все команды запускаются в среде travis, кроме модульных тестов. Я хочу иметь возможность запускать модульные тесты в dev env на моем компьютере, но в travis env в контейнере Travis.

Как я могу настроить свой PHPUnit, чтобы он мог работать в среде travis и использовать мой файл config_travis.yml?

Как выглядят модульные тесты? Они как-то загружают ядро ​​Symfony?

xabbuh 17.06.2019 13:36

Я обновил свой вопрос примером моих тестов, отвечает ли он на ваш вопрос или я неправильно его понял?

darckcrystale 17.06.2019 13:48
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
690
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Метод createClient() из WebTestCase вызывает метод bootKernel() из KernelTestCase, который, в свою очередь, вызывает createKernel(). В createKernel() есть следующий код, который определяет, в какой среде должно быть загружено ядро:

if (isset($options['environment'])) {
    $env = $options['environment'];
} elseif (isset($_ENV['APP_ENV'])) {
    $env = $_ENV['APP_ENV'];
} elseif (isset($_SERVER['APP_ENV'])) {
    $env = $_SERVER['APP_ENV'];
} else {
    $env = 'test';
}

Так что в вашем случае экспорт переменной APP_ENV в файл config_travis.yml и установка для нее значения travis должны решить эту проблему.

Ответ принят как подходящий

PHPUnit использует переменную среды с именем APP_ENV, чтобы определить, какая среда используется. Мне пришлось создать эту переменную среды в Travis.

screenshot of the Travis environment variables setting showing the environment variables I created

Другие вопросы по теме