如何设置单元测试使用哪个Symfony环境?

时间:2019-06-17 11:22:26

标签: symfony phpunit environment-variables travis-ci symfony-3.4

我正在尝试建立一个名为travis的新Symfony环境,以在Travis容器中运行单元测试。

我设置了此环境,以使其与proddev有所区别。

当前,我有:

  • 在Travis中设置SYMFONY_ENV=travis环境变量
  • 一个config_travis.yml,其中包含我对Travis环境的配置
  • 一个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

我的项目看起来是这样的:

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环境中但在Travis容器的travis环境中运行单元测试。

如何设置PHPUnit,使其可以在travis环境中运行并使用config_travis.yml文件?

2 个答案:

答案 0 :(得分:0)

createClient()的{​​{1}}方法从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应该可以解决此问题。

答案 1 :(得分:0)

PHPUnit使用一个名为APP_ENV的环境变量来确定所使用的环境。我必须在Travis中创建此环境变量。

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