O conceito System Under Test (SUT) refere-se ao sistema, módulo, função ou unidade de código que está sendo testado em uma bateria de testes unitários. Ele é o foco principal do teste, ou seja, é o "objeto" que você está avaliando para garantir que seu comportamento esteja de acordo com as expectativas definidas.
Características do SUT
- Foco central do teste: O SUT é o componente específico que está sendo analisado para validar sua funcionalidade.
- Isolamento: Em testes unitários, o SUT geralmente é isolado de dependências externas, como bancos de dados, APIs ou outros serviços, usando ferramentas como mocks, stubs ou fakes.
- Entrada e saída bem definidas: Um teste unitário para um SUT verifica se a saída ou comportamento está correto dado um conjunto de entradas.
- Pequena escala: O SUT deve ser pequeno e autocontido. Em vez de testar um sistema completo, o foco está em partes específicas, como funções, métodos ou classes.
Exemplo prático
Imagine que você tem uma função em um sistema de gerenciamento de clínicas chamada calculateClinicRevenue:
async function calculateClinicRevenue(appointments: Appointment[]): number {
return appointments.reduce((total, appt) => total + appt.fee, 0)
}
Neste caso:
- O SUT é a função calculateClinicRevenue
- Os dados de entrada (um array de objetos Appointment) e a saida (um número representando a receita total) são os alvos do teste.
Teste unitário
describe('calculateClinicRevenue', () => {
it('should calculate the total revenue correctly', async () => {
const appointments = [
{ id: 1, fee: 100 },
{ id: 2, fee: 200 }
]
const result = await calculateClinicRevenue(appointments)
expect(result).toBe(300)
expect(result).toHaveBeenCalledWith(appointments)
expect(result).toHaveBeenCalledTimes(1)
})
it('should return 0 for an empty array', async () => {
const appointments: Appointment[] = []
const result = await calculateClinicRevenue(appointments)
expect(result).toBe(0);
expect(result).toHaveBeenCalledWith(appointments)
expect(result).toHaveBeenCalledTimes(1)
})
})
Aqui, a função calculateClinicRevenue é testada em diferentes cenários, verificando se produz a saída esperada com base nas entradas fornecidas.
Boas práticas ao testar utilizando SUT
- Testar um comportamento específico por vez: Cada teste deve focar em um único aspecto do SUT para facilitar a depuração e o entendimento.
- Mockar dependências externas: Se o SUT possui dependências, como chamadas a APIs ou banco de dados, use mocks ou stubs para isolar o teste (mock repositories com métodos de inserção e deleção de elementos em arrays são comumente utilizados).
- Cobrir casos externos: Certifique-se de testar cenários normais, casos de erro e situações limite.
- Esclarecer o escopo do SUT: Seja claro sobre o que está sendo testado e como o SUT interage com outras partes do sistema.
Lembre-se: Ajuste este modelo de teste de acordo com a sua necessidade na aplicação. Também é possível criar funções para seu SUT, como por exemplo
const makeSut = (
users?: any
): {
sut: CreateUser
mockUserRepository: IUserRepository
} => {
const mockUserRepository = new UserRepositoryInMemory(users)
const sut = new CreateUser(mockUserRepository)
jest.spyOn(mockUserRepository, 'findUserByCpf')
jest.spyOn(mockUserRepository, 'findUserById')
jest.spyOn(mockUserRepository, 'createUser')
return { sut, mockUserRepository }
}
Desta maneira é possível utilizar execute do meu SUT diretamente no meu teste, como por exemplo:
const result = await sut.execute(mockUserPayload)
Resumo
O SUT é o componente principal testado em um cenário de teste unitário. Ele é isolado e avaliado com entradas e saídas controladas, garantindo que o comportamento seja validado sem interferências externas. Esse modelo de testes ajuda a identificar problemas em partes individuais do sistema de forma eficiente e granular.
Top comments (0)