---
blogpost: true
author: MichaĆ Bultrowicz
language: English
tags: Python, quality_assurance, Docker
date: 2023-04-08
---
Developer workflow with local tests using Docker Compose
========================================================
Recently, I did a presentation about my development workflow for back-end applications.
English version of the video:
[YouTube link.](https://youtu.be/hjve48cYj_U)
Polish version of the video:
[YouTube link.](https://youtu.be/Ob-3YNgXYZc)
Slides are [here](https://github.com/butla/presentations/tree/master/2023-03_developer_workflow_with_local_tests_using_docker-compose).
The sample code is [here](https://github.com/butla/experiments/tree/master/testing__quality_assurance/sample_backend_app).
## Contents summary
- Docker Compose setup with the sample HTTP/REST app (written in Python) and a SQL database
- High-level tests using containers.
- Reloading the app container on code file changes.
- Running tests on code file changes.
- Makefiles to describe common development tasks.
- CI setup based on local tests.
## Abstract
Containers have revolutionized many aspects of software development. In particular - testing.
Testing applications with the same data bases (e.g. Postgres, Redis), queues (e.g. Kafka), etc.
that they'll rely on in production grants a substantially higher degree of confidence in the software,
than tests with mocks or in-memory fakes of real connectors.
In this presentation I'll show how I use docker-compose for local running and testing of the app being developed.
How to adjust the code and set the configuration to make your work faster, ease on-boarding of new team members,
and, above all, to increase the quality.
The presented techniques emerged from working on a couple projects across the last 5 years.
The example code will be a Python back-end app, but the techniques will apply in other programming languages,
and not only for back-end applications.
The presentation assumes at least a passing familiarity with Docker and docker-compose.
The subjects covered will include:
- separation of unit, integrated, and functional tests
- organizing the project so that a local instance of the app can be run with two commands: `git clone && make run`
- not resetting the test environment between tests
- local and CI test parity
- debugging code running in containers
- using "Docker mounts" to enable fast application reloading while editing code
- changes to the production code that make testing easier