如何设置单元测试使用哪个 Symfony 环境?
How to setup which Symfony environment is used by unit tests?
我正在尝试设置一个名为 travis
的新 Symfony 环境,以便在 Travis 容器中进行 运行 单元测试。
我设置此环境是为了将其与 prod
和 dev
区分开来。
目前,我有:
- a
SYMFONY_ENV=travis
Travis 中的环境变量设置
- 包含我的 Travis 环境配置的
config_travis.yml
- 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
我的项目是这样的:
我运行宁的一些测试示例:
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 容器中的 travis
env 中进行单元测试。
如何设置我的 PHPUnit 以便它可以在 travis
环境中 运行 并使用我的 config_travis.yml
文件?
WebTestCase
的 createClient()
方法从 KernelTestCase
调用 bootKernel()
方法,后者又调用 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';
}
因此,在您的情况下,导出 config_travis.yml
文件中的 APP_ENV
变量并将其设置为 travis
应该可以解决问题。
PHPUnit 使用名为 APP_ENV
的环境变量来确定使用哪个环境。我必须在 Travis 中创建这个环境变量。
我正在尝试设置一个名为 travis
的新 Symfony 环境,以便在 Travis 容器中进行 运行 单元测试。
我设置此环境是为了将其与 prod
和 dev
区分开来。
目前,我有:
- a
SYMFONY_ENV=travis
Travis 中的环境变量设置 - 包含我的 Travis 环境配置的
config_travis.yml
- 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
我的项目是这样的:
我运行宁的一些测试示例:
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 容器中的 travis
env 中进行单元测试。
如何设置我的 PHPUnit 以便它可以在 travis
环境中 运行 并使用我的 config_travis.yml
文件?
WebTestCase
的 createClient()
方法从 KernelTestCase
调用 bootKernel()
方法,后者又调用 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';
}
因此,在您的情况下,导出 config_travis.yml
文件中的 APP_ENV
变量并将其设置为 travis
应该可以解决问题。
PHPUnit 使用名为 APP_ENV
的环境变量来确定使用哪个环境。我必须在 Travis 中创建这个环境变量。