Aplicação de testes
Como eu poderia implementar testes tanto para o tenant quanto para as outras tabelas?tem algum material sobre isso?
Olá, Cleison!
Tudo bem?
Em alguns cursos aqui da Academy trabalho com testes E2E.
Você pode usar como base este: https://academy.especializati.com.br/curso/laravel-api-com-cache
Nesse sentido e necessário criar 2 bancos para teste?
Consegui fazer,mas estou com uma duvida
Qunado eu passo
-> postJson( 'https://' . $this->company->subdomain .'/api/v1/logout' );
ele entente a minha rota e executa com sucesso
Mas se eu passo
-> postJson( $this->company->subdomain .'/api/v1/logout' );
Ele não acha a rota e da 404,sabe me dizer se existe solução pra isso?
Não precisa dois bancos, se você usar sqlite (até recomendo, porque deixa os testes muito mais rápidos)
---
Está passando um subdomínio realmente válido?
De onde vem esse $this->company?
Preciso de mais detalhes do código, para entender e conseguir te ajudar.
Está em um repositório privado,mas eu poderia te enviar o link das classes de teste para você analisar?
Estou usando apenas um banco.
https://github.com/CleisonPaiva/Files-Test esse e o link dos arquivos
A classe TenantCompany cria o company e baseado no id desse company roda o comando de criar o tentant
Na classe UserTest eu extendo de TenantCompany (Company e a minha model da tabela companies)
$this->company = Company ::firstOrFail(); aqui eu recupero a company criada em TenantCompany
$this->company->subdomain aqui eu pego o subdominio para poder usar na url e executar os testes no tenant ,como nesse exemplo:
public function test_get_users_unauthenticated()
{
$response = $this -> getJson( 'https://' . $this->company->subdomain . '/api/v1/users' );
(Aqui eu tenho um problema pois ele não funciona se eu não colocar https:// no inicio das rotas)
$response -> assertStatus( 401 );
}
Outro problema que eu estou enfrentando e a lentidão na execução dos testes,depois que eu implementei o multitenant e faço os testes como o exemplo acima ele começou a demorar muito mais tempo,o que eu poderia melhorar no meu fluxo?(Obs. Estou usando sqlite e Refreshdatabase)
Isso daqui tem apenas a URL da company crua, sem o http, certo?
dd($this->company->subdomain); // subdomonio.example.com.br
Então está certo, você vai precisar passar o http manualmente mesmo. Algo que pode te ajudar é definir no arquivo .env o https em uma variável de ambiente.
--
Essa URL, realmente existe? Digo, o projeto responde por ela?
dd('https://' . $this->company->subdomain . '/api/v1/users'); // Pega a URL daqui e debuga ela no browser
Isso daqui tem apenas a URL da company crua, sem o http, certo?
Sim,exato .Eu tenho uma factory que fica gerando subdominio
Essa URL, realmente existe? Digo, o projeto responde por ela?
/api/v1/users e a minha rota e sim funciona,o $this->company->subdomain passa a existir durante o teste ,pois e quando a factory e executada.
Sobre a lentidão na execução tem alguma coisa que eu possa fazer para melhorar ?
Factory para gerar o subdomínio? Por que?
Se foi um valor fake que criou, a sua maquina não vai responder a este domínio (subdomínio), portanto só vai responder com 404 mesmo.
---
Sobre a lentidão, se não tiver querys demais, pode ser o próprio ambiente, se for Docker no Windows, trabalha com Ws2: https://www.youtube.com/watch?v=TweB6klWAgM
Factory para gerar o subdomínio? Por que?
Por que eu preciso gerar um subdominio para executar os testes da tabela de posts por exemplo,e essa tabela e criada baseada num subdominio que foi cadastrado na tabela de company,isso tem funcionado,não da 404,so aumentou a demora de execução dos testes
Se você gerou uma URL nova (subdomínio) com uma factory, e tentar acessar ela, realmente vai dar erro 404, porque essa URL não existe (ou seja, a sua maquina não responde ela)
O que você pode fazer?
Teste de integração, aí sim, você insere os dados no banco de dados, e valida se está inserindo certinho (por exemplo, você pode fazer um teste de integração, para validar que realmente está criando o db do tenant e as tabelas)
O teste end-to-end neste caso não faz muito sentido, justamente porque não vai responder. Você até pode fazer o teste E2E (igual fez $this->postJson), mas para isso você pode gerar um tenant real (com uma URL fixa)
Pegou a ideia amigo?
Acho que voce ainda não entendeu o que eu fiz,o meu problema não e 404,ate por que como voce disse eu preciso por o https
Eu tenho a classe de teste TenantCompany que executa o comando de criar as migrations base onde tenho a tabela de companies
Artisan::call('migrate', [
'--force' => true,
'--path' => [
'/database/migrations/',
]
]);
E apos isso eu crio um TENANT
$test=Company ::factory() -> create();
Com o TENANT criado eu executo as migrations para esse respectivo TENANT
$this -> artisan( "tenants:migrations {$test->id}" );
Na execução dos testes eu chamo esse tenant criado e pego o seu subdominio,e ate aqui enhum problema,isso funciona ,o ponto de eu sempre precisa colcoar https na frente da rota eu entendi ,a minha grande duvida é:
Essa forma de fazer esta correto??
Como posso melhorar o desempenho?pq testes locais que demoravam um minuto e meio passou a demorar seis minutos,e no github esse test com multitenat esta demorando 20 minutos,estou usando SQLITE.Faz sentido eu rodar o comando de criar tenant nos testes?
Realmente não entendi amigo, justamente porque aqui você disse que estava com erro 404... \0/ (https://prnt.sc/ZPIKywfLniAn)
-------
Não vejo problemas você usar http na request, justamente porque está acessando uma URL externa.
Mas, algo aqui não encaixou, pelo menos não ficou claro.
Criou um novo tenant com sucesso, certo?
Logo, o subdomínio dele é: novotenant.dominio.com.br, certo?
No GitHub actions, não era para passar;
A não ser que você está apontando o teste para um domínio real, e este domínio responde essa request. Aí está aqui o segredo da lentidão, a cada teste ele bate no endpoint externo para validar a request (não rodou local).
----
Sobre o SqLite fez o certo, é a melhor opção para rodar os testes, é o mais rápido.
Você está fazendo um refresh dos dados do banco a cada teste?
https://github.com/especializati/curso-laravel-api-ead/blob/main/tests/TestCase.php#L10
Precisa estar logado para conseguir responder a este ticket!
Clique Aqui Para Entrar!