Venho trabalhando muito com TDD ultimamente (acredito que agora seja pra valer) e percebo certas diferenças ao rodar os testes em ambientes em que você utiliza X framework comparados ao CakePHP.
O CakePHP possui o console que pode ser utilizado para executar testes. O test console do cake é apenas uma interface para o executável phpunit no entanto justamente a divisão por grupo simplesmente é ignorada, você até passa o parâmetro --group NomeDoGrupo mas ao completar os demais parâmetros necessários que são [app|core] NomeDoTeste simplesmente o --group não faz mais sentido, perceba nas imagens abaixo.
Definimos um grupo de testes na classe desejada.
Rodamos o testes informando que queremos somente o grupo User
É triste, mas falhamos miseravelmente.
Mas calma há uma solução, não idêntica ao Group do PHPUnit mas ainda sim é uma forma de agrupar. Basta criarmos suítes de testes. Como assim o Cake já não tem sua suíte de testes? Tem. Mas nós podemos criar as nossas também.
Supomos que quero testar todos os Models, basta na pasta Test/Case criarmos uma suíte que abranja a pasta model. Crie um arquivo chamado AllModelTest.php e adicione o seguinte conteúdo: (nos comentários a explicação)
<?php
App::uses('CakeTestSuite', 'TestSuite');
class AllModelTest extends CakeTestSuite {
public static function suite() {
//Criando a nova suite de testes (ou grupo de testes)
$suite = new CakeTestSuite('All Model Tests');
// Adicionando diretório onde os testes se encontram
$suite->addTestDirectory(TESTS . 'Case' . DS . 'Model');
return $suite;
}
}
Com isso se rodarmos novamente o test console, desta vez nem precisamos passar o parâmetro --group.
Perceba que existe um caso de teste chamado AllModel. Ele pode ser executado com os seguintes comandos ./app/Console/cake test app e selecionando a opção 1 ou simplesmente ./app/Console/cake test app AllModel. Perceba que existem 26 testes pois o mesmo executou apenas os testes que encontram-se estritamente dentro de Test/Case/Model... mas se tivermos Behaviors? O caminho dos behaviors, helpers e components sempre estão dentro das pastas Model/Behavior, View/Helper e Controller/Component respectivamente.
Há duas soluções, adicionar em nossa suíte de testes além da pasta Model, também a pasta Model/Behavior ou simplesmente adicionar as pastas recursivamente. como mostrado no novo AllModelTest.php
<?php
App::uses('CakeTestSuite', 'TestSuite');
class AllModelTest extends CakeTestSuite {
public static function suite() {
//Criando a nova suite de testes (ou grupo de testes)
$suite = new CakeTestSuite('All Model Tests');
/*
// Adicionando diretório onde os testes se encontram
$suite->addTestDirectory(TESTS . 'Case' . DS . 'Model');
$suite->addTestDirectory(TESTS . 'Case' . DS . 'Model/Behavior');
*/
// Ou o mais indicado
$suite->addTestDirectoryRecursive(TESTS . 'Case' . DS . 'Model');
return $suite;
}
}
Com isso rodamos nossos testes novamente e perceba que existem mais de 26 testes como anteriormente
Com este conceito em mãos basta aplicar testes para todos os controllers e views também e por último sugiro a criação de uma suíte chamada All, sendo seu arquivo AllTest.php e seu conteúdo a seguir
<?php
App::uses('CakeTestSuite', 'TestSuite');
class AllTest extends CakeTestSuite {
public static function suite() {
$suite = new CakeTestSuite('All tests');
$suite->addTestDirectoryRecursive(TESTS . 'Case' . DS . 'Controller');
$suite->addTestDirectoryRecursive(TESTS . 'Case' . DS . 'Model');
$suite->addTestDirectoryRecursive(TESTS . 'Case' . DS . 'View');
return $suite;
}
}
Rodando os testes com o comando ./app/Console/cake test app All todos os testes são executados de uma vez.
E isto é refletido na suíte de testes via browser que o CakePHP fornece.
E rodando todos via browser temos este resultado
Por hoje é isso, é uma configuração bem simples mas que no CakePHP pode deixar muitos desenvolvedores frustrados por não conseguirem rodar todos os testes simultaneamente.
Sugiro a leitura de CakePHP e Composer