I have been developping a REST API at work using Flask, and wanted to test the response I got.
I started by testing directly the raw response using
response.data
,
which works for small responses. As soon as you want to
make it dynamic, it becomes a nightmare. Let’s say we start with the
following test
# Bad idea
def test_response_string():
response = client.get("/test")
assert response.status_code == 200
assert response.data == '{"key1": "value1", "key2": "value2"}'
Now, with just this test, adding a value or modifying it would be easy. But add other tests, or try to modify values…
To solve this, one solution is to decode the data received from the API, and
directly compare the decoded data with some expected values. To do this, it is
possible to use the
response.json
attribute which returns a decoded data structure from the response when its
mimetype is application/json
.
# Better idea
def test_response():
expected_dict = dict(
key1="value1",
key2="value2"
)
response = client.get("/test")
assert response.status_code == 200
assert response.json == expected_dict
This way, you can also use a tempate element and just modify some of its fields. Very useful in case of complicated structures, and much clearer in my opinion.
This is, the option I like the most for now. Do you see an other one for this?