Desafio Técnico de QA

Demonstre suas habilidades em testes de API e qualidade de software

Visão Geral

Bem-vindo ao desafio técnico de QA (Quality Assurance) da Novigi Solution. Este é um teste prático para avaliarmos suas habilidades em testes de API, análise crítica de requisitos e documentação.

API REST

Teste uma aplicação que gerencia produtos eletrônicos através de endpoints REST documentados.

Testes Automatizados

Crie testes automatizados cobrindo fluxos de sucesso e exceção.

Documentação

Documente sua estratégia, bugs encontrados e melhorias sugeridas.

Objetivos

O que será avaliado durante a correção do desafio:

Cobertura de Testes

Cobertura funcional dos cenários, incluindo fluxos de exceção. A completude dos testes é fundamental.

Qualidade do Código

Boas práticas de desenvolvimento, código limpo e bem estruturado usando a linguagem Java.

Clareza

Os testes devem ser claros e legíveis, facilitando sua compreensão e manutenção.

Documentação

README com informações do projeto, como executar, plano de testes, bugs e melhorias encontradas.

Requisitos Obrigatórios

  • Linguagem: Java
  • Código final na branch main
  • Boas práticas de desenvolvimento
  • Cobertura funcional de cenários e fluxos de exceção
  • Testes claros e bem estruturados
  • README com instruções de execução e documentação

Bônus

Relatório Automático

Gerar relatório automático com resultados dos testes.

+Pontos

Pipeline CI/CD

Configurar pipeline para execução automática dos testes.

+Pontos

Requisitos Técnicos

Pré-Requisitos

Java 11+

Java Development Kit (JDK) versão 11 ou superior instalado em sua máquina.

Maven ou Gradle

Gerenciador de dependências para o projeto Java.

Git

Controle de versão para versionamento do código.

Frameworks de Teste

JUnit 5+, TestNG ou equivalente. Cliente HTTP como RestAssured, HttpClient, etc.

Stack Sugerida

Language: Java
Test Framework: JUnit 5 ou TestNG
HTTP Client: REST Assured
Build Tool: Maven ou Gradle
Reporting: Allure, Surefire ou equivalente

Documentação da API

Endpoint base: https://dummyjson.com

GET /test

Descrição: Verificar o status da aplicação

Request

curl --location 'dummyjson.com/test'

Response 200 OK

{ "status": "ok", "method": "GET" }

GET /users

Descrição: Buscar usuários para autenticação

Importante: Os campos username e password são cruciais para o negócio.

Request

curl --location 'dummyjson.com/users'

Response 200 OK (Exemplo)

{ "users": [ { "id": 1, "firstName": "Terry", "email": "atuny0@sohu.com", "username": "atuny0", "password": "9uQFF1Lh", ... } ] }

POST /auth/login

Descrição: Criar token para autenticação

Request

curl --location 'https://dummyjson.com/auth/login' \ --header 'Content-Type: application/json' \ --data '{ "username": "emilys", "password": "emilyspass" }'

Request Body

{ "username": "emilys", "password": "emilyspass" }

Response 201 OK

{ "id": 1, "username": "emilys", "email": "emily.johnson@x.dummyjson.com", "firstName": "Emily", "lastName": "Johnson", "gender": "female", "image": "https://dummyjson.com/icon/emilys/128", "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }

GET /auth/products

Descrição: Buscar produtos com autenticação

Requer Autenticação: Bearer Token

Request

curl --location 'https://dummyjson.com/auth/products' \ --header 'Content-Type: application/json' \ --header 'Authorization: Bearer YOUR_TOKEN_HERE'

Response 200 OK

{ "products": [ { "id": 1, "title": "iPhone 9", "description": "An apple mobile...", "price": 549, "discountPercentage": 12.96, "rating": 4.69, "stock": 94, "brand": "Apple", "category": "smartphones", "thumbnail": "https://i.dummyjson.com/data/products/1/thumbnail.jpg" } ], "total": 100, "skip": 0, "limit": 30 }

Response 403 Forbidden

{ "message": "Authentication Problem" }

Response 401 Unauthorized

{ "name": "JsonWebTokenError", "message": "Invalid/Expired Token!" }

POST /products/add

Descrição: Criar um novo produto

Nota importante: Os produtos criados não serão persistidos.

Request

curl --location 'https://dummyjson.com/products/add' \ --header 'Content-Type: application/json' \ --data '{ "title": "Perfume Oil", "description": "Mega Discount, Impression of A...", "price": 13, "discountPercentage": 8.4, "rating": 4.26, "stock": 65, "brand": "Impression of Acqua Di Gio", "category": "fragrances", "thumbnail": "https://i.dummyjson.com/data/products/11/thumnail.jpg" }'

Request Body

{ "title": "Perfume Oil", "description": "Mega Discount, Impression of A...", "price": 13, "discountPercentage": 8.4, "rating": 4.26, "stock": 65, "brand": "Impression of Acqua Di Gio", "category": "fragrances", "thumbnail": "https://i.dummyjson.com/data/products/11/thumnail.jpg" }

Response 201 OK

{ "id": 101, "title": "Perfume Oil", "price": 13, "stock": 65, "rating": 4.26, "thumbnail": "https://i.dummyjson.com/data/products/11/thumnail.jpg", "description": "Mega Discount, Impression of A...", "brand": "Impression of Acqua Di Gio", "category": "fragrances" }

GET /products

Descrição: Buscar todos os produtos

Request

curl --location 'https://dummyjson.com/products'

Response 200 OK (Exemplo - resumido)

{ "products": [ { "id": 1, "title": "Essence Mascara Lash Princess", "description": "Popular mascara for volumizing...", "price": 9.99, "discountPercentage": 7.17, "rating": 4.94, "stock": 5, "brand": "Essence", "category": "beauty" } ], "total": 100, "skip": 0, "limit": 30 }

GET /products/{id}

Descrição: Buscar um produto específico pelo ID

Request

curl --location 'dummyjson.com/products/1'

Response 200 OK

{ "id": 1, "title": "Essence Mascara Lash Princess", "description": "The Essence Mascara Lash Princess is a popular mascara...", "category": "beauty", "price": 9.99, "discountPercentage": 7.17, "rating": 4.94, "stock": 5, "tags": ["beauty", "mascara"], "brand": "Essence", "sku": "RCH45Q1A", "weight": 2, "dimensions": { "width": 23.17, "height": 14.43, "depth": 28.01 }, "warrantyInformation": "1 month warranty", "shippingInformation": "Ships in 1 month", "availabilityStatus": "Low Stock", "reviews": [...] }

Response 404 Not Found

{ "message": "Product not found", "code": 404 }

Como Entregar o Desafio

Crie o repositório

Crie um repositório com visibilidade pública.

Implemente os Testes

Crie testes automatizados usando Java e frameworks de teste recomendados.

Documente

Adicione README com instruções, plano de testes, bugs e melhorias.

Push para Main

Envie seu código para a branch main do repositório.

README Deve Conter

  • Descrição do Projeto: O que é o desafio
  • Como Executar: Passo a passo para rodar os testes
  • Plano de Testes: Estratégia e cenários cobertos
  • Bugs Encontrados: Lista de bugs identificados (se houver)
  • Melhorias Sugeridas: Sugestões de melhoria (se houver)
  • Stack Utilizado: Versões das ferramentas e dependências

Exemplo de Execução

# Instalar dependências
mvn clean install
# Executar todos os testes
mvn test
# Executar testes com relatório
mvn test -Dgroups=@api

Dicas

Testes de Sucesso

Comece testando os cenários felizes (happy path) - quando tudo funciona como esperado.

Testes de Exceção

Não esqueça de testar casos de erro: autenticação inválida, dados malformados, etc.

Dados de Teste

Use dados realistas e cobra diferentes cenários com variações nos dados de entrada.

Automação

Automação de testes é crucial. Quanto mais automatizado, melhor!

Dúvidas?

Se tiver dúvidas sobre o desafio, entre em contato com o time de Recursos Humanos da Novigi Solution.

Não deixe de fazer seu melhor! Boa sorte!