【发布时间】:2014-05-29 19:17:39
【问题描述】:
我正在尝试使用 PHPUnit 测试我的 PHP Web,我需要测试数据库连接(如插入、更新和删除)。
我有两个数据库,一个用于产品,一个用于测试。现在我在每次测试前后手动替换数据库 URL。
当代码在测试模式下运行时,有什么方法可以自动替换 URL?
【问题讨论】:
标签: php phpunit integration-testing
我正在尝试使用 PHPUnit 测试我的 PHP Web,我需要测试数据库连接(如插入、更新和删除)。
我有两个数据库,一个用于产品,一个用于测试。现在我在每次测试前后手动替换数据库 URL。
当代码在测试模式下运行时,有什么方法可以自动替换 URL?
【问题讨论】:
标签: php phpunit integration-testing
可以在phpunit.xml中设置环境变量:
<php>
<env name="env" value="test" />
</php>
然后就可以根据这个环境变量的值来设置数据库的名字了:
$name = getenv('env') == 'test' ? 'test' : 'production';
【讨论】:
在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/phpunit 和 phpunit.xml 位于 /path/to/app/tests/phpunit.xml):
CWD:=$(PWD)
test:
vendor/bin/phpunit --configuration $(CWD)/tests/phpunit.xml
.PHONY test
现在,每次您运行测试(例如,make test)时,都会使用正确的凭据。
【讨论】:
使用sed
它几乎是一个在您指定的文件中搜索的 preg 替换。这就是你在盒子上使用它的方式
sed -i 's/proddatabase.expensivebusiness.com/devdatabase.expemsivebusiness.com/g' *.php
我有一个 shell 脚本,它遍历所有 prod 文件并放置开发标签(浮动通知、更改数据库地址并在必要时用测试用户名/密码替换用户名/密码)。制作一个脚本,将其放入您的 bin 中,然后在终端中键入“dev”或“prod”以在 dev 和 prod 值之间切换......除非您希望在 php 中同时拥有 dev 和 prod 代码,那么您只需要重新评估您的方法并暂时使用简单的 vim preg-replace 。
【讨论】: