That test script will simply call pytest. We will use this script within our GitHub action.
In order to also prepare our GitHub action to give us more vebose information, we will also be passing a -v flag to our call to pytest.
We can test things are working as expected by running pipenv run test -v from our terminal:
$ pipenv run test -v
========================== test session starts ===========================
platform darwin -- Python 3.9.6, pytest-6.2.4, py-1.10.0, pluggy-0.13.1 -- /Users/dennisokeeffe/code/blog-projects/hello-pytest/.venv/bin/python
cachedir: .pytest_cache
rootdir: /Users/dennisokeeffe/code/blog-projects/hello-pytest-github-actions
collected 3 items
tests/test_math.py::test_add PASSED [ 33%]
tests/test_math.py::test_subtract PASSED [ 66%]
tests/test_math.py::test_multiply PASSED [100%]
=========================== 3 passed in 0.02s ============================
The verbose flag gives us more information about which test ran and passed. This can be helpful for debugging in CI.
Adding the GitHub action
We are now ready to add the GitHub action. Within the .github/workflows/pytest.yml file that we created earlier, add the following:
# .github/workflows/app.yaml
name: PyTest
on: push
jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository code
uses: actions/checkout@v2
# Setup Python (faster than using Python container)
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: "3.x"
- name: Install pipenv
run: |
python -m pip install --upgrade pipenv wheel
- id: cache-pipenv
uses: actions/cache@v1
with:
path: ~/.local/share/virtualenvs
key: ${{ runner.os }}-pipenv-${{ hashFiles('**/Pipfile.lock') }}
- name: Install dependencies
if: steps.cache-pipenv.outputs.cache-hit != 'true'
run: |
pipenv install --deploy --dev
- name: Run test suite
run: |
pipenv run test -v
Here we are doing a couple of things:
Creating a job call PyTest.
Running this job on a push event to the repository.
Running the job on ubuntu-latest.
Setting a custom timeout of 10 minutes (albeit this is overkill, feel free to omit).
Setting up the Python environment for the latest in version 3.x.
Install pipenv and wheel.
Install dependencies with a cache set to be the hash of the lockfile.
Running the test suite that we setup the command and tested before.
That is all that we need for this repo to be working!
Be sure at this stage that you have set up your own origin remote for the repo.
At this stage, all we need to do is commit the code and push the repo and the job will be available under the actions tab in the GitHub UI.
Action working as expected
Summary
Today's post demonstrated how to use GitHub actions to test Python code on a push to the remote repository. We used the pytest testing framework to test our code.