PHPUnit忽略Apache环境变量

时间:2016-08-14 19:14:34

标签: php mysql mysqli phpunit codeception

我正在使用Codeception,它利用PHPUnit作为其单元测试框架,并进行了大量的单元测试

我最近使用存储在php配置文件中的连接信息更新了我的数据库连接(而不是硬编码)。

$host = getenv('RDS_HOST');
$user = getenv('RDS_USER');
$password = getenv('RDS_PASSWORD');
$schema = getenv('RDS_SCHEMA');

$mysqli = new \mysqli($host, $user, $password, $schema);

我的应用在这些更改后工作正常。

问题是,我的许多单元测试现在都已损坏,运行单元测试导致错误消息:

  

[PHPUnit_Framework_Exception] mysqli :: mysqli():( HY000 / 2002):没有这样的文件或目录

我创建单元测试只是为了查看PHPUnit是否会读取我的环境变量。它似乎没有。似乎PHPUnit 忽略我的环境变量。

如何让PHPUnit/Codeception识别和使用Apache环境变量?

1 个答案:

答案 0 :(得分:3)

PHPUnit是通过cli运行的,Web应用程序是通过apache运行的,这就是为什么一个工作而另一个不工作的原因。

例如,如果您从命令行在Linux系统上运行测试,则可以导出环境变量。

$ export RDS_HOST=host; export RDS_USER=user; and so on... vendor/bin/phpunit 

然后可以通过getenv在php中获得这些环境变量。例如,在apache中,您可以将它们设置在虚拟主机中,这样当apache运行时,PHP就可以使用这些环境变量。

有很多方法可以解决这个问题,我不知道任何明确的解决方案。这取决于应用范围及其需求。 vlucas/phpdotenv是我能想到的唯一一个我认为有助于解决某些用例问题的软件包。

深入潜水:How Laravel Solves It