Python TDD with Pytest -- Getting Started

January 28, 2019 · 2 minute read

Test-Driven Development is great. If you’re a Pythonista, it gets even better with pytest - a framework that makes building simple and scalable tests easy.

In this series, I’ll be exploring the cool features that pytest offers to help make testing Python code a breeze.

Preparing your python environment

Let’s set up our testing environment with virtualenv. We’ll be working with Python 3. cd into your working directory and create a new virtual environment:

python3 -m venv env

Activate the virtual environment:

source env/bin/activate

Installing pytest

pip install pytest

That’s all you need to do to get pytest ready. You can check the installed version by running:

pytest --version

Creating your first test

Say we need to create an app that says hello to the name you give it when it runs (I know, very original 😅).

# simple hello world test

def hello_world(name):
    pass

def test_hello():
    assert hello_world("World!") == "Hello World!"

You’ll notice that our test function name begins with the word test. That’s how pytest discoveres test methods. Also, :

Running pytest hello.py should return:

collected 1 item
hello.py F                         [100%]

===================== FAILURES ======================
    def test_hello():
>       assert hello_world("World!") == "Hello World!"
E       AssertionError: assert None == 'Hello World!'
E        +  where None = hello_world('World!')

hello.py:6: AssertionError

Pytest shows why the test failed: AssertionError: assert None == 'Hello World!’. Obviously, we have no code in our hello function so let’s fix that.

def hello_world(name):
    return "Hello {}".format(name)

def test_hello():
    assert hello_world("World!") == "Hello World!"

Running pytest hello.py should now return:

collected 1 item
hello.py .                       [100%]

==================== 1 passed in 0.04 seconds ======================

As you can see, it’s pretty easy to get started with testing in python with pytest. Now that we have everything set up, we’ll be going into more advanced features as the series continues.