Python tox in GitHub Actions
Wenn man mit dem Pythonprojekt tox Unittests durchführt, dann muss die Maschine, auf der die Unittests ausgeführt werden, mehrere Pythoninstallationen installiert haben. In GithHub Actions kann man die Tests auch auf verschiedenen Runnern laufen lassen, von denen jeder Runner eine andere Pythonversion installiert hat. Dazu kann man die Matrix-Strategie in GitHub verwenden. Das kann dann z.B. folgendermaßen aussehen:
name: Run python tests on: push: branches: [ '**' ] paths: [ '**' ] pull_request: branches: [ '**' ] paths: [ '**' ] workflow_dispatch: jobs: unittests: runs-on: ${{ matrix.os }} strategy: matrix: os: [ ubuntu-latest, windows-latest ] python-version: [ '3.6', '3.7', '3.8', '3.9' ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | python -m pip install --upgrade pip pip install tox tox-gh-actions - name: Tests with tox run: | tox
Mit der Matrixstrategie lassen wir die Tests sowohl auf den aktuellsten Linux- und Windowssystem laufen. Dabei sollen die Pythonversionen 3.6, 3.7, 3.8 und 3.9 verwendet werden. Damit tox korrekt läuft, muss noch über pip neben dem Paket tox das Paket tox-gh-actions installiert werden. Im letzten Schritt wird dann tox gestartet.
Jetzt fehlt aber noch eine Kleinigkeit. Die tox.ini muss noch für GitHub Actions angepasst werden. Folgende Zeilen müssen noch in die tox.ini rein:
[gh] python = 3.6: py36 3.7: py37 3.8: py38 3.9: py39
Eine komplette tox.ini könnte dann so aussehen:
[tox] minversion = 3.8.0 envlist = py36, py37, py38, py39 [gh] python = 3.6: py36 3.7: py37 3.8: py38 3.9: py39 [testenv] deps = -rrequirements_dev.txt commands= pytest --basetemp={envtmpdir}
Mit den eingefügten Zeilen wird eine Verbindung zwischen GitHub und tox geschaffen. Normalerweise erwartet tox verschiedene Pythoninstallationen auf einer Maschine. Doch durch die eingefügten Zeilen wird tox gesagt, dass z.B. das Laufen der Unittests in einem Runner mit der Pythonversion 3.6 (auf der dann aber nur Python 3.6 installiert ist) als getestet gilt für die Version 3.6.