在mysql中,使用php和curl可以通过多个连接进行事务处理吗
我的任务是创建一些API的集成测试,我想知道是否可以做一些事情,比如开始一个事务;curl几个api调用;回滚数据库 示例伪代码在mysql中,使用php和curl可以通过多个连接进行事务处理吗,php,mysql,transactions,Php,Mysql,Transactions,我的任务是创建一些API的集成测试,我想知道是否可以做一些事情,比如开始一个事务;curl几个api调用;回滚数据库 示例伪代码 begin_long_transaction(); $userId = (new CURL('user/create', $dataArr))->post(); (new CURL("user/$userId", $updateDataArr))->put(); $userData = (new CURL("user/$userId"))->get(
begin_long_transaction();
$userId = (new CURL('user/create', $dataArr))->post();
(new CURL("user/$userId", $updateDataArr))->put();
$userData = (new CURL("user/$userId"))->get();
// assert userData is as expected
rollback_long_transaction();
看起来您正在使用CURL访问网络中其他地方实现的服务,该服务由具有自己的MySQL数据库连接池的服务实现 所以,你的问题的答案是否定的 下面是来自另一个SO问题的更多信息
是的,这是可能的。 通常,您会对此进行模拟,但也可以进行实时API测试。 您使用的是PHP,因此选择的工具是phpUnit 如果您使用phpUnit,我建议您扩展phpUnit_框架_测试用例或phpUnit_扩展_数据库_测试用例,并使用beginLongTransaction和rollbackLongTransaction以及api方法构建一个自定义类 让我们假设像request$type、$url、$data这样的东西,这样您就不必经常键入新的Curl$这->请求'GET',/somewhere',$data 在测试用例之前和之后,还可以进行设置和拆卸 注意超时&相应地设置PHP执行时间,因为由于依赖于外部API,一些测试可能会遇到连接超时。 您还可以将测试分组并单独运行,以避免超时
class MyApiTest1 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
// connection per test
public function testSomething()
{
$this->useConnection($connectionName);
$result = $this->request('GET', '/user/' . $this->getDb()->getUsername());
$this->assertEquals(200, $result->getResponse()->getStatusCode());
$this->closeConnection($connectionName);
}
}
class MyApiTest2 extends MyCustomAPI_PHPUnit_Framework_TestCase
{
public function setUp()
{
$this->useConnection($connectionName);
}
// connection per class
public function testSomething()
{
$result = $this->request('GET', '/test');
$this->assertEquals(200, $result->getResponse()->getStatusCode());
}
public function tearDown()
{
$this->closeConnection($connectionName);
}
}
用于处理多个db连接和一个请求方法的基类:
class MyCustomAPI_PHPUnit_Framework_TestCase extends PHPUnit_Framework_TestCase
{
static public $dbConnections = array();
function setupConnections()
{
// foreach array(databaseName => credentials)
{
// create connection object
// store connection object into array
self::$dbConnections[$databaseName] = $connection;
}
}
function getConnection($connectionName)
{
return self::$dbConnections[$connectionName];
}
function rollback($connectionName)
{
$con = $this->getConnection($connectionName);
// rollback hard
$con->deleteDatabase();
$con->insertDatabaseSchema();
$con->insertDatabaseData();
// = database @fresh start
}
function beginTransaction($connectionName)
{
$con = $this->getConnection($connectionName);
// do stuff on begin
return $con;
}
function request($type, $url, $data)
{
// do curl request
return $cURLdata;
}
}
那么,启用持久连接,然后在头中指定的第一个请求中序列化连接,或者在第一个api调用中重写destroy,这样当脚本结束时,连接不会关闭,并且每个中间脚本将重复使用连接,直到最后一个将回滚它的连接为止,怎么样?仅供参考:在测试期间不会使用其他任何东西。在设置中启动事务不会自然影响curl请求,因为这将是一个单独的过程。我不确定我是否遵守了我不确定你的意思。我会将连接设置为静态私有连接。这将使它在所有后续测试中保持打开状态。您可能想查看phpUnit手册的数据库一章,我已经为这些测试添加了一些基本的测试示例和基类。基类只是一个快速草案,包含一些伪代码元素。我希望这能更好地解释这一点。