Guia de Desenvolvimento: Estratégia de Testes
Em um sistema de saúde, a qualidade do software impacta diretamente a segurança e a confiabilidade do atendimento. Nossa estratégia de testes é baseada na "Pirâmide de Testes", com foco em garantir que as regras de negócio e os fluxos críticos sejam validados automaticamente.
1. Testes de Unidade (Lógica Pura)
Testamos funções utilitárias, seletores do Redux e helpers de domínio. Estes testes são rápidos e não possuem dependências externas.
- Onde:
packages/modules/[module]/utils/*.test.tsoupackages/shared/utils/*.test.ts. - O que testar: Cálculos de doses, formatação de documentos (CPF/CNS), validadores de regras clínicas.
// Exemplo: Teste de Seletor
import { selectIsPatientEligible } from './selectors';
describe('Consultation Selectors', () => {
it('deve retornar verdadeiro se o paciente tiver mais de 18 anos', () => {
const state = { consultation: { patientAge: 20 } };
expect(selectIsPatientEligible(state)).toBe(true);
});
});2. Testes de Integração (Store & Sagas)
Validamos se o ciclo de vida do Redux (Action -> Saga -> Reducer -> State) funciona conforme o esperado.
- Onde:
packages/modules/[module]/store/*.test.ts. - O que testar: Se um erro na API dispara a action de falha, se a publicação de um evento de domínio ocorre após o sucesso.
// Exemplo: Teste de Saga
import { expectSaga } from 'redux-saga-test-plan';
import { handleFetchConsultation } from './sagas';
it('deve buscar consulta e atualizar o estado em caso de sucesso', () => {
return expectSaga(handleFetchConsultation, actions.fetchRequest('123'))
.provide([[call(api.getById, '123'), mockData]])
.put(actions.fetchSuccess(mockData))
.run();
});3. Testes de Máquina de Estado (XState)
Garantimos que as transições de estado e os guards protegem o fluxo conforme as especificações.
- O que testar: Se é possível transitar para o estado de "Finalizado" sem o diagnóstico, se os serviços de entrada/saída são disparados.
// Exemplo: Teste de Machine
import { interpret } from 'xstate';
import { teleconsultationMachine } from './machine';
it('não deve permitir iniciar vídeo sem aceitar os termos', () => {
const service = interpret(teleconsultationMachine).start();
service.send('START_VIDEO');
expect(service.state.value).toBe('aguardandoTermo');
});4. Testes de Componentes (Visual & Comportamento)
Utilizamos React Testing Library para garantir que a UI reage corretamente ao estado e às interações do usuário.
- Regra: Testamos o comportamento (o que o usuário vê), não a implementação interna.
it('deve exibir mensagem de erro quando a API falhar', async () => {
render(<ConsultationPage />);
// Simula falha...
expect(screen.getByText(/erro ao carregar/i)).toBeInTheDocument();
});Checklist de Qualidade do Desenvolvedor
- [ ] Cobriu as regras de negócio críticas do domínio com testes de unidade?
- [ ] Validou o fluxo feliz e os casos de erro nos Sagas?
- [ ] Testou se os Guards da State Machine impedem estados impossíveis?
- [ ] Garantiu que componentes de Shared (UI) são testados isoladamente no Storybook/Jest?
Lembre-se: Código sem teste é débito técnico imediato.