Testando Aplicações Dart e Flutter
Conteúdo
- Estruturando Arquivos de Teste
- Escrevendo Testes
- Executando Testes
- Fluxo de Trabalho de Implementação de Testes
- Exemplos
Estruturando Arquivos de Teste
Organize os arquivos de teste para espelhar a estrutura do diretório lib e manter a previsibilidade.
- Coloque todo o código de teste dentro do diretório
testna raiz do pacote. - Anexe
_test.dartao final de todos os nomes de arquivos de teste (ex.:lib/src/utils.dartdeve ser testado emtest/src/utils_test.dart). - Se estiver escrevendo testes de integração, coloque-os em um diretório
integration_testna raiz do pacote.
Escrevendo Testes
Utilize package:test como a biblioteca de teste padrão para aplicações Dart.
- Importe
package:test/test.dart(oupackage:flutter_test/flutter_test.dartpara Flutter). - Agrupe testes relacionados usando a função
group()para fornecer contexto compartilhado. - Defina casos de teste individuais usando a função
test(). - Valide resultados usando a função
expect()junto com matchers (ex.:equals(),isTrue,throwsA()). - Escreva testes assíncronos usando a sintaxe padrão
async/await. O executor de testes aguarda automaticamente a conclusão daFuture. - Gerencie a configuração e limpeza dos testes usando callbacks
setUp()etearDown(). - Se estiver testando código que depende de injeção de dependência, use
package:mockitojunto compackage:testpara gerar objetos mock, configurar cenários fixos e verificar interações.
Executando Testes
Selecione o executor de teste apropriado com base no tipo de projeto e localização do teste.
- Se estiver trabalhando em um projeto Dart puro, execute os testes usando o comando
dart test. - Se estiver trabalhando em um projeto Flutter, execute os testes usando o comando
flutter test. - Se estiver executando testes de integração, especifique explicitamente o caminho do diretório, pois o executor padrão o ignora:
dart test integration_testouflutter test integration_test.
Fluxo de Trabalho de Implementação de Testes
Siga este fluxo de trabalho sequencial ao implementar novos conjuntos de testes. Copie a lista de verificação para acompanhar seu progresso.
Progresso da Tarefa
- 1. Crie o arquivo de teste no diretório
test/, garantindo o sufixo_test.dart. - 2. Importe
package:test/test.darte a biblioteca alvo. - 3. Defina uma função
main(). - 4. Inicialize recursos compartilhados ou mocks usando
setUp(). - 5. Escreva casos
test()agrupados por funcionalidade usandogroup(). - 6. Execute o conjunto de testes usando o comando CLI apropriado.
- 7. Loop de Feedback: Execute o teste -> Revise o stack trace para falhas -> Corrija a implementação ou asserções -> Reexecute até passar.
Exemplos
Conjunto de Teste Unitário Padrão
Demonstra agrupamento, configuração, teste síncrono e assíncrono.
import 'package:test/test.dart';
import 'package:my_package/calculator.dart';
void main() {
group('Calculator', () {
late Calculator calc;
setUp(() {
calc = Calculator();
});
test('adds two numbers correctly', () {
expect(calc.add(2, 3), equals(5));
});
test('handles asynchronous operations', () async {
final result = await calc.fetchRemoteValue();
expect(result, isNotNull);
expect(result, greaterThan(0));
});
});
}
Mock com Mockito
Demonstra a configuração de um objeto mock para teste de injeção de dependência.
import 'package:test/test.dart';
import 'package:mockito/mockito.dart';
import 'package:mockito/annotations.dart';
import 'package:my_package/api_client.dart';
import 'package:my_package/data_service.dart';
// Gere o mock usando build_runner: dart run build_runner build
@GenerateNiceMocks([MockSpec<ApiClient>()])
import 'data_service_test.mocks.dart';
void main() {
group('DataService', () {
late MockApiClient mockApiClient;
late DataService dataService;
setUp(() {
mockApiClient = MockApiClient();
dataService = DataService(apiClient: mockApiClient);
});
test('returns parsed data on successful API call', () async {
// Configure o mock
when(mockApiClient.get('/data')).thenAnswer((_) async => '{"id": 1}');
// Execute o sistema sob teste
final result = await dataService.fetchData();
// Verifique resultados e interações
expect(result.id, equals(1));
verify(mockApiClient.get('/data')).called(1);
});
});
}