我正在尝试使用PHPUnit测试我的PHP Web,我需要测试数据库连接(如插入,更新和删除)。
我有两个数据库,一个用于prod,另一个用于测试。现在我在每次测试之前和之后手动替换数据库URL。
当代码在测试模式下运行时,有没有办法自动替换URL?
答案 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/phpunit
且phpunit.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。