Как настроить, какая среда Symfony используется модульными тестами? - PullRequest
0 голосов
/ 17 июня 2019

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

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

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

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

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

screenshot of the folders tree of my project

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

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?

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

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

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

0 голосов
/ 17 июня 2019

Метод 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 должен решить это.

...