我的任务是创建一些API的集成测试,并且想知道是否可以做一些像开始事务的事情;卷起几个api电话;回滚数据库。
示例伪代码
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();
答案 0 :(得分:0)
是的,可以这样做。 通常你会嘲笑这个,但它可以进行实时API测试。 您正在使用PHP,因此选择的工具是phpUnit。
如果您使用phpUnit,我建议扩展PHPUnit_Framework_TestCase或PHPUnit_Extensions_Database_TestCase,并使用您的beginLongTransaction()和rollbackLongTransaction()以及api()方法构建自定义类。
让我们假设像request($ type,$ url,$ data)这样的东西,所以你不必经常输入“new Curl”。 $this->request('GET, '/somewhere', $data);
还有一个setUp()和tearDown()用于在TestCase之前和之后执行操作。
留意超时时间&相应地设置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);
}
}
使用多个数据库连接和一个请求方法的基类:
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;
}
}
答案 1 :(得分:-1)
看起来你正在使用CURL通过一个拥有自己的MySQL数据库连接池的服务来点击网络中其他地方实现的服务。
所以,你的问题的答案是“不”。
以下是来自另一个SO问题的更多信息。