Home > Back-end >  Python unit testing with Docker and environment variables
Python unit testing with Docker and environment variables

Time:12-15

I am trying to run unit tests for my application with a Docker container (and possibly in a GitHub workflow), but I can't figure out how to correctly pass env variables to it.

So normally for the building process I have a pretty standard Dockerfile

FROM python:3.7-alpine3.15

WORKDIR /app

COPY requirements.txt requirements.txt

RUN pip3 install -r requirements.txt

COPY src/ .

CMD [ "python3", "main.py" ]

and a workflow that builds it and pushes the image to Docker Hub. Then of course the usual docker run --env-file=.env ... command to run the application fetching the variables from a file.

Now I am adding tests to the code. The application needs some env variables to function properly (auth keys and other stuff), and so of course also to run the tests. I don't want to export the variables in my system and run the test from my terminal, so I want to use Docker. But I'm not really sure how to properly do it.

My goal is to be able to run the tests locally and to also have a workflow that runs on PRs, without committing the variables in the repo.

This is what I've tried so far:

  • Add test to the Dockerfile: adding RUN python -m unittest -s tests doesn't really work because at build time Docker doesn't have access to the .env file
  • Add GitHub workflow with the test command: even using a GitHub environment to store secrets and deploying the job into that for some reason doesn't fetch the variables. Plus I would like to be able to test the code before pushing the changes, and have this workflow run only on PRs.
jobs:
  test:
    runs-on: ubuntu-latest
    environment: test
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      - name: Set up Python 3.7
        uses: actions/setup-python@v2
        with:
          python-version: 3.7
          cache: 'pip'
      - name: Install dependencies
        run: pip install -r requirements.txt
      - name: Run tests
        shell: bash
        env:
          EMAIL: ${{ secrets.EMAIL }}
          AUTH_KEY: ${{ secrets.AUTH_KEY }}
          ZONE_NAME: ${{ secrets.ZONE_NAME }}
          RECORD_ID: ${{ secrets.RECORD_ID }}
          CHECK_INTERVAL: ${{ secrets.CHECK_INTERVAL }}
          SENDER_ADDRESS: ${{ secrets.SENDER_ADDRESS }}
          SENDER_PASSWORD: ${{ secrets.SENDER_PASSWORD }}
          RECEIVER_ADDRESS: ${{ secrets.RECEIVER_ADDRESS }}
        run: |
          python -m unittest discover -t src -s tests

Here you can find the full source code if needed.

CodePudding user response:

Change

RUN python -m unittest -s tests

to

CMD python -m unittest -s tests

and unittest will be launched not at build stage but at tests container start, when you can use your env file

  • Related