Possiamo effettivamente farlo abbastanza facilmente utilizzando le classi di estensione Codeception. Cosa faremo con le estensioni è la seguente:
Hook in "prima della prova" e "dopo la prova" gli eventi con la nostra estensione riconfigurare il modulo Db per puntare al nostro servizio web, ri-inizializzare il modulo e esegui Ripeti per ogni servizio Web Per iniziare, dobbiamo prima abilitare il modulo Db nei nostri test di accettazione. Seguire le istruzioni per l'installazione del modulo Db. Quello che è importante qui è che impostiamo populate e cleanup su false e che i dump puntano a un file valido. Impostiamo populate e cleanup su false perché non vogliamo che il modulo Db venga compilato e pulito dopo ogni test. Beh, tipo di fare, ma per impostazione predefinita il modulo Db comunica solo con un database in cui abbiamo bisogno di più.
In secondo luogo, seguire le istruzioni per creare un'estensione di Codeception di base. Dopo aver impostato la vostra classe, configurato e incluso nel vostro bootstrap, è possibile utilizzare il seguente codice come una guida:
class YourExtensionClass extends \Codeception\Platform\Extension {
// events to listen on
static $events = array(
'test.before' => 'beforeTest',
'test.after' => 'afterTest',
);
function beforeTest(\CodeCeption\Event\Test $e)
{
// get the test and groups
$test = $e->getTest();
$groups = $test->getScenario()->getGroups();
// only restore if annotated to do so
if (in_array('api', $groups)) {
// get the Db module
$db = $this->getModule('Db');
// re-initialize with web service one api config and execute
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config);
$db->_reconfigure($webserviceOneConfig);
$db->_initialize();
$db->_before($test);
// re-initialize with web service two api config and execute
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config);
$db->_reconfigure($webserviceTwoConfig);
$db->_initialize();
$db->_before($test);
}
}
function afterTest(\CodeCeption\Event\Test $e)
{
// get the test and groups
$test = $e->getTest();
$groups = $test->getScenario()->getGroups();
// only restore if annotated to do so
if (in_array('api', $groups)) {
// get the Db module
$db = $this->getModule('Db');
// re-initialize with web service one api config and execute
$webserviceOneConfig = $this->getWebServiceOneConfig($this->config);
$db->_reconfigure($webserviceOneConfig);
$db->_initialize();
$db->_after($test);
// re-initialize with web service two api config and execute
$webserviceTwoConfig = $this->getWebServiceTwoConfig($this->config);
$db->_reconfigure($webserviceTwoConfig);
$db->_initialize();
$db->_after($test);
}
}
private function getWebServiceOneConfig($config)
{
return array(
'dsn' => 'your first webservice db dsn',
'dump' => '/path/to/your/first/dump/file',
'populate' => true,
'cleanup' => true,
);
}
private function getWebServiceTwoConfig($config)
{
return array(
'dsn' => 'your second webservice db dsn',
'dump' => '/path/to/your/second/dump/file',
'populate' => true,
'cleanup' => true,
);
}
Se abbia il mio setup estensione a sparare solo se un dato test è annotato correttamente, che è :
// in a Cest
/**
* @group api
*/
public function hereIsSomeTest(WebGuy $I)
{
...
}
// in a Cept
$scenario->group('api');
$I = new WebGuy($scenario);
I ha installato l'estensione di aderire alla annotazione "api" così non ho avuto da installare e abbattere le mie basi di dati API su ogni singolo test, solo quelli che si occupano di dati. Tuttavia, si potrebbe facilmente modificare in base alle proprie esigenze.
Guardare il [file di origine] (https://github.com/Codeception/Codeception/blob/2.1/src/Codeception/Module/Db.php) mi fa pensare, non è possibile fuori dalla scatola . –