13. Teste de bancos de dados SQL e NoSQL


Teste de Bancos de Dados SQL e NoSQL: Garantindo a Integridade e a Coerência dos Dados

O banco de dados é o coração de muitas aplicações, armazenando e gerenciando as informações críticas que impulsionam os negócios. Para um Engenheiro de Qualidade, testar a integração da aplicação com o banco de dados e garantir a integridade, consistência e correção dos dados é uma habilidade fundamental. Este módulo irá aprofundar nas técnicas e conceitos para testar tanto bancos de dados relacionais (SQL) quanto não relacionais (NoSQL), incluindo consultas, operadores e operações CRUD.

Teste de Bancos de Dados SQL: O Mundo Relacional

Os bancos de dados SQL (Structured Query Language), como MySQL, PostgreSQL, SQL Server, Oracle, são baseados em tabelas com linhas e colunas e utilizam um esquema rígido. O teste de bancos de dados SQL foca em:

  • Validação de Dados: Garantir que os dados gravados pela aplicação estejam corretos no banco de dados e que os dados lidos do banco de dados pela aplicação também estejam corretos.
  • Integridade de Dados: Verificar se as restrições de chave primária, chave estrangeira, unicidade e não nulidade estão sendo respeitadas. Isso impede que dados inconsistentes sejam armazenados.
  • Performance de Consultas: Avaliar o tempo de execução de consultas complexas, especialmente sob carga, para identificar gargalos.
  • Conformidade com o Esquema: Garantir que a estrutura do banco de dados (tabelas, colunas, tipos de dados) esteja de acordo com as especificações.
  • Transações: Testar se as operações de banco de dados que envolvem múltiplas etapas são atômicas, consistentes, isoladas e duráveis (ACID).
  • Testes de Back-end vs. UI: Embora os testes de UI possam indiretamente verificar o banco de dados, o teste direto do banco de dados permite uma validação mais granular e abrangente da camada de persistência.

Teste de Consultas, Operadores, Junções e Wildcards

Para testar bancos de dados SQL, o Q.A. precisa ter um bom domínio da linguagem SQL. As atividades de teste incluem:

  • Comandos CRUD (Create, Read, Update, Delete):
    • CREATE (INSERT): Inserir novos registros e verificar se eles aparecem corretamente. Testar com dados válidos e inválidos.
    • READ (SELECT): Escrever consultas SELECT para verificar se os dados inseridos estão corretos, se os filtros funcionam e se os dados são recuperados como esperado pela aplicação.
    • UPDATE: Atualizar registros e verificar se as alterações são refletidas corretamente.
    • DELETE: Excluir registros e garantir que eles são removidos do banco de dados.
  • Operadores: Testar a aplicação de operadores de comparação (=, !=, >, <, >=, <=), lógicos (AND, OR, NOT) e outros (ex: IN, BETWEEN, LIKE).
  • Junções (JOINs): Testar consultas que combinam dados de múltiplas tabelas (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN), garantindo que os relacionamentos estão corretos e que os dados são unidos conforme o esperado.
  • Wildcards: Utilizar LIKE com _ (para um caractere) e % (para múltiplos caracteres) para testar padrões de busca e garantir que as consultas retornem os resultados esperados.
  • Funções Agregadas e Agrupamentos: Testar consultas que utilizam funções como COUNT(), SUM(), AVG(), MAX(), MIN() e a cláusula GROUP BY.
  • Stored Procedures e Triggers: Se o banco de dados utilizar, testar a lógica e o comportamento dessas construções.

Teste de Bancos de Dados NoSQL: O Mundo Flexível

Bancos de dados NoSQL (Not Only SQL), como MongoDB, Cassandra, Redis, DynamoDB, são projetados para lidar com grandes volumes de dados não estruturados ou semi-estruturados, oferecendo escalabilidade horizontal e flexibilidade de esquema. O teste de bancos de dados NoSQL exige uma abordagem ligeiramente diferente:

  • Flexibilidade de Esquema: Testar como a aplicação lida com diferentes estruturas de documentos/registros em uma mesma coleção/tabela.
  • Consistência Eventual: Entender e testar os modelos de consistência (forte, eventual) de cada banco de dados NoSQL e como isso impacta a leitura dos dados após uma escrita.
  • Particionamento e Sharding: Se o banco de dados estiver distribuído, testar como os dados são particionados e consultados em múltiplos nós.
  • Desempenho em Escala: Testar o desempenho sob grande volume de dados e requisições, explorando a natureza distribuída.
  • API Específicas: Cada banco de dados NoSQL tem sua própria API e métodos de consulta. O teste envolve a utilização dessas APIs.

Testando JSON, Consultas e Operadores em NoSQL

A maioria dos bancos de dados NoSQL baseados em documentos armazena dados em formato JSON ou BSON (Binary JSON).

  • Teste de JSON: Validar a estrutura e o conteúdo dos documentos JSON que são armazenados e recuperados.
    • Estrutura: Verificar se os campos esperados estão presentes, se os tipos de dados estão corretos e se a hierarquia do JSON está preservada.
    • Conteúdo: Validar os valores dos campos, incluindo arrays e objetos aninhados.
  • Consultas e Operadores: Cada banco de dados NoSQL tem sua própria linguagem de consulta.
    • MongoDB (com MQL – MongoDB Query Language): Testar consultas usando operadores como $eq, $gt, $lt, $in, $and, $or, $regex para buscar documentos baseados em critérios complexos.
    • Cassandra (com CQL – Cassandra Query Language): Testar SELECT com WHERE e operadores específicos para chaves de partição e clustering.
    • Redis (Chave-Valor): Testar operações de GET, SET, HGETALL, LPUSH, RPUSH para diferentes tipos de dados (strings, hashes, listas, sets, sorted sets).
    • Testes de Índices: Verificar se os índices criados estão sendo utilizados corretamente pelas consultas para otimizar o desempenho.

Ferramentas e Abordagens para Teste de Banco de Dados

  • Ferramentas de Gerenciamento de Banco de Dados: Ferramentas como DBeaver, DataGrip, pgAdmin (PostgreSQL), MongoDB Compass, SQL Developer (Oracle) são essenciais para executar consultas manuais, inspecionar dados e validar o esquema.
  • Testes Automatizados de API: Como as aplicações interagem com o banco de dados via APIs, testar as APIs (Módulo 4) é uma forma indireta e eficiente de testar a persistência de dados. Após uma operação via API (ex: POST para criar um usuário), você pode fazer uma consulta direta ao banco de dados para validar que o usuário foi inserido corretamente.
  • Testes de Integração: Desenvolver testes que conectam diretamente ao banco de dados usando drivers da linguagem de programação (ex: psycopg2 para Python-PostgreSQL, mongoose para Node.js-MongoDB) para executar comandos SQL/NoSQL e validar os resultados.
  • Data Masking/Geração de Dados: Em ambientes de teste, é crucial usar dados realistas, mas não dados de produção sensíveis. Ferramentas de geração de dados e mascaramento são úteis.
  • Testcontainers (Revisão): Ferramenta essencial para iniciar bancos de dados (SQL ou NoSQL) em contêineres Docker descartáveis para cada execução de teste, garantindo um ambiente limpo e consistente.

Atividades: Para consolidar o conhecimento em teste de bancos de dados:

  • Execute e Relate Integrações de Banco de Dados SQL e NoSQL, e Comandos CRUD:
    • Escolha um banco de dados SQL (ex: PostgreSQL com um conjunto de dados de exemplo) e um banco de dados NoSQL (ex: MongoDB). Você pode configurar instâncias locais via Docker ou usar serviços em nuvem.
    • Para o banco de dados SQL:
      • Escreva e execute comandos INSERT, SELECT, UPDATE, DELETE manualmente para um cenário específico (ex: gerenciamento de produtos ou usuários).
      • Crie e execute consultas com JOINs, operadores (AND, OR), e LIKE com wildcards.
      • Descreva os resultados e valide a integridade dos dados após cada operação.
    • Para o banco de dados NoSQL:
      • Insira, consulte, atualize e delete documentos JSON.
      • Utilize consultas com operadores específicos do NoSQL (ex: $gt, $in no MongoDB) para buscar documentos.
      • Valide a estrutura e o conteúdo do JSON retornado.
    • Relate suas descobertas: Documente as consultas executadas, os resultados esperados vs. obtidos, e quaisquer anomalias ou bugs encontrados na integração da aplicação com o banco de dados. Se possível, integre essa etapa em um teste de API automatizado, onde uma operação da API é seguida por uma consulta direta ao banco de dados para validação.

Qual o maior desafio de testar bancos de dados NoSQL em comparação com os bancos de dados SQL tradicionais?