TDD é uma sigla para Test Driven Development
, ou Desenvolvimento Orientado a Testes. A ideia do TDD é que você trabalhe em ciclos.
- entregar software de qualidade;
- testar procurando possíveis falhas;
- criar testes de integração, testes isolados (unitários);
- evitar escrever códigos complexos ou que não sigam os pré-requisitos necessários;
A proposta do TDD é que você codifique antes mesmo do código existir, isso nos garante mais qualidade no nosso projeto. Além de que, provavelmente se você deixar pra fazer os testes no final, pode acabar não fazendo. Com isso, sua aplicação perde qualidade e está muito mais propensa a erros.
Este documento traz informações do desenvolvimento de uma API em FastAPI a partir do TDD.
Essa aplicação tem como objetivo principal trazer conhecimentos sobre o TDD, na prática, desenvolvendo uma API com o Framework Python, FastAPI. Utilizando o banco de dados MongoDB, para validações o Pydantic, para os testes Pytest e entre outras bibliotecas.
Uma aplicação que:
- tem fins educativos;
- permite o aprendizado prático sobre TDD com FastAPI + Pytest;
Uma aplicação que:
- se comunica com apps externas;
Desenvolvimento de uma aplicação simples a partir do TDD, que permite entender como criar tests com o pytest
. Construindo testes de Schemas, Usecases e Controllers (teste de integração).
Diagrama de C4 da Store API |
Database - Store API |
sequenceDiagram
title Create Product
Client->>+API: Request product creation
Note right of Client: POST /products
API->>API: Validate body
alt Invalid body
API->Client: Error Response
Note right of Client: Status Code: 422 - Unprocessable Entity
end
API->>+Database: Request product creation
alt Error on insertion
API->Client: Error Response
note right of Client: Status Code: 500 - Internal Server Error
end
Database->>-API: Successfully created
API->>-Client: Successful Response
Note right of Client: Status Code: 201 - Created
sequenceDiagram
title List Products
Client->>+API: Request products list
Note right of Client: GET /products
API->>+Database: Request products list
Database->>-API: Successfully queried
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
sequenceDiagram
title Get Product
Client->>+API: Request product
Note right of Client: GET /products/{id}<br/> Path Params:<br/> - id: <id>
API->>+Database: Request product
alt Error on query
API->Client: Error Response
Note right of Client: Status Code: 500 - Internal Server Error
else Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
end
Database->>-API: Successfully queried
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
sequenceDiagram
title PUT Product
Client->>+API: Request product update
Note right of Client: PUT /products/{id}<br/> Path Params:<br/> - id: <id>
API->>API: Validate body
alt Invalid body
API->Client: Error Response
Note right of Client: Status Code: 422 - Unprocessable Entity
end
API->>+Database: Request product
alt Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
end
Database->>-API: Successfully updated
API->>-Client: Successful Response
Note right of Client: Status Code: 200 - Ok
sequenceDiagram
title Delete Product
Client->>+API: Request product delete
Note right of Client: DELETE /products/{id}<br/> Path Params:<br/> - id: <id>
API->>+Database: Request product
alt Product not found
API->Client: Error Response
Note right of Client: Status Code: 404 - Not Found
end
Database->>-API: Successfully deleted
API->>-Client: Successful Response
Note right of Client: Status Code: 204 - No content
- Create
- Mapear uma exceção, caso dê algum erro de inserção e capturar na controller
- Update
- Modifique o método de patch para retornar uma exceção de Not Found, quando o dado não for encontrado
- a exceção deve ser tratada na controller, pra ser retornada uma mensagem amigável pro usuário
- ao alterar um dado, a data de updated_at deve corresponder ao time atual, permitir modificar updated_at também
- Filtros
- cadastre produtos com preços diferentes
- aplique um filtro de preço, assim: (price > 5000 and price < 8000)
Vamos utilizar Pyenv + Poetry, link de como preparar o ambiente abaixo: