Skip to content

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.ts ou packages/shared/utils/*.test.ts.
  • O que testar: Cálculos de doses, formatação de documentos (CPF/CNS), validadores de regras clínicas.
typescript
// 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.
typescript
// 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.
typescript
// 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.
tsx
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.