Esse tipo de teste consiste em testar os trechos essenciais para que uma funcionalidade funcione. Como exemplo, podemos pensar em um teste do CRUD de usuários. Nele, iremos testar cada rota do CRUD individualmente e garantir que os cenários que esperamos que aconteçam realmente estão sendo executados, como por exemplo: - Rota store: 1. Enviar dados válidos 2. Esperar que a validação passe com sucesso 3. Esperar que o controller insira os dados no banco 4. Esperar que o banco de dados tenha os dados inseridos 5. Esperar que um evento seja disparado após o usuário seja criado 6. Esperar que a rota retorne os dados corretos - Rota index: 1. Criar dados falsos no banco (Factories, Mocking) 2. Esperar que os dados retornados estejam paginados 3. Esperar que as informações necessárias estejam presentes
Você terá esse código após criar uma classe de teste pelo artisan:
Antes de prosseguir, devemos adicionar a trait \Illuminate\Foundation\Testing\DatabaseTransactions à classe, ela vai garantir que nossos testes serão executados em ambientes controlados e não irão ser afetados por outros testes.
Cada classe de teste contém um número de métodos, que testam individualmente uma parte da funcionalidade sendo testada. Iremos remover esse método de exemplo e adicionar nossos próprios métodos. Os métodos criados devem ser prefixados com test_ e devem seguir a convenção de snake_case para nomear cada teste individual.
e.g.: Um usuário deve conseguir criar bases caso ele mande dados válidos. → test_user_can_create_bases_with_valid_payload
No geral, os testes se baseiam em três seções:
- Arrange - Preparar
- Act - Agir
- Assert - Afirmar
Vamos criar um método para o exemplo anterior

Arrange:
Aqui nós iremos preparar qualquer recurso necessário para o passo Act. Isso inclui, mas não está limitado à:
- Criar dados falsos com factories
- Preparar um usuário para realizar a requisição
- Criar dados para serem enviados na requisição
// Arrange
Sanctum::actingAs($this->superAdminUser);
$payload = BaseRequestFactory::new()->create();Aqui, utilizamos o metódo actingAs do Sanctum para logar um usuário a força. A variável superAdminUser contém um usuário com todas as permissões necessárias, que é definida na classe pai TestCase
Em seguida, utilizamos uma Request Factory para criar dados falsos a serem utilizados na requisição
Act: Em seguida, é necessário escrever o código para agir como se um usuário estivesse realizando alguma ação. Neste caso, iremos simular um usuário enviando dados para criar uma base.
$response = $this->postJson('/api/bases', $payload);Esta é na maioria das vezes a parte mais simples, já que temos métodos como postJson e getJson para realizar as requisições. Guardamos o resultado em um variável $response para utilizar no Assert.
Assert:
Aqui é onde iremos garantir que tudo o que queremos que aconteça está de fato acontecendo.
Cada metódo utilizado aqui é chamado de uma assertion ou expectation, eles podem partir das variáveis $response (que definimos anteriormente) ou da $this (que contém assertions mais genéricas, não relacionadas a requisição)
$response->assertCreated();
$response->assertJsonStructure(
array_merge(
array_keys($payload),
['id', 'created_at', 'updated_at', 'is_active']
)
);
$this->assertDatabaseHas('bases', $payload);Aqui realizamos 3 assertions:
- Esperar que o status da resposta seja 201 (assertCreated)
- Esperar que o corpo da resposta contenha as chaves da entidade (assertJsonStructure)
- Esperar que o banco de dados contenha os valores que foram inseridos (assertDatabaseHas)
Esse é um dos casos mais simples, você pode ver uma lista de assertions disponíveis aqui: Database Testing - Laravel 11.x - The PHP Framework For Web Artisans e também na documentação do PHPUnit
Você pode ver o código completo desse teste nesta PR: feat: store base test by Zuruckt · Pull Request #320 · multintegradabr/samu360-server (github.com)