2014-01-30 19 views
1

我一直負責創建API的一些集成測試,並且想知道是否可以做一些事情來開始一個事務;卷幾個API呼叫;回滾數據庫。是否有可能通過php和curl在mysql中的多個連接進行交易

例僞

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(); 

回答

-1

它看起來像你使用捲曲打你的網絡中實現別的地方服務,用自己的MySQL數據庫連接池的服務。

所以,你的問題的答案是「不」。

下面是來自另一個SO問題的更多信息。

MySQL: Transactions across multiple threads

+0

那麼,關於啓用持續連接然後串行化在第一請求(在所述第一連接中的報頭或東西指定api調用)並覆蓋銷燬,以便連接不會在腳本結束時關閉,並且每個中間腳本都會重新使用連接,直到最後一個將會回滾連接爲止。僅供參考:在測試過程中沒有其他人會使用該網站 – matthewdaniel

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; 
    } 

} 
+0

在設置中開始交易並不會自然影響捲曲請求,因爲這將是一個單獨的過程。我不確定我是否關注 – matthewdaniel

+0

我不確定你的意思。我將連接設置爲「static private $ pdoConnection」。這可以讓所有後續測試都保持開放。您可能需要查看phpUnit手冊的數據庫章節http://phpunit.de/manual/3.7/en/database.html –

+0

我已經爲這些測試添加了一些基本的測試示例和基類。基類只是一個快速草案,幷包含一些僞代碼元素。我希望這解釋得更好一點。 –

相關問題