在PHPUnit测试上重定向数据库连接

时间:2014-05-29 19:17:39

标签: php phpunit integration-testing

我正在尝试使用PHPUnit测试我的PHP Web,我需要测试数据库连接(如插入,更新和删除)。
我有两个数据库,一个用于prod,另一个用于测试。现在我在每次测试之前和之后手动替换数据库URL。

当代码在测试模式下运行时,有没有办法自动替换URL?

3 个答案:

答案 0 :(得分:1)

您可以在phpunit.xml中设置环境变量:

<php>
  <env name="env" value="test" />
</php>

然后,您可以根据此环境变量的值设置数据库的名称:

$name = getenv('env') == 'test' ? 'test' : 'production';

答案 1 :(得分:0)

phpunit.xml中,将bootstrap设为bootstrap.php

<phpunit
 bootstrap="bootstrap.php"
>

然后,在bootstrap.php

$GLOBALS['db'] = new c_database(
 'testhost', // Host
 'testuser', // Username
 'testpass', // Password
 'testdb' // Database
);

现在,您可以从应用中使用$db访问数据库连接。在您的应用中,您可以执行以下操作:

if(!isset($db)){
 $db = new c_database(
  'livehost', // Host
  'liveuser', // Username
  'livepass', // Password
  'livedb' // Database
 );
}

运行测试时,请务必指定phpunit.xml的位置。您可以使用Makefile轻松完成此操作(假设phpunit位于/path/to/app/vendor/bin/phpunitphpunit.xml位于/path/to/app/tests/phpunit.xml):

CWD:=$(PWD)

test:
    vendor/bin/phpunit --configuration $(CWD)/tests/phpunit.xml

.PHONY test

现在,每次运行测试(例如make test)时,都会使用正确的凭据。

答案 2 :(得分:-2)

使用sed

它几乎是一个preg替换,可以在您指定的文件中搜索。这就是你在盒子上使用它的方法

sed -i 's/proddatabase.expensivebusiness.com/devdatabase.expemsivebusiness.com/g' *.php

我有一个shell脚本,遍历所有prod文件并放置dev标签(浮动通知,更改数据库地址,并在必要时用测试代码替换用户名/密码)。制作一个剧本,将其放入你的垃圾箱,然后输入“开发”。或者&#39; prod&#39;在终端中切换dev和prod值...除非你想在php中同时使用dev和prod代码,否则你只需要重新评估你的方法并暂时使用简单的vim preg-replace。