liteyagami
liteyagami

Reputation: 67

pytest assert multiple objects in single line

I am using pytest to assert multiple objects for same condition. Board of writing repetitive code. I wanted to know how these multiple objects can be clubbed together to test at once in a single line.

Below is my current code:

assert response['a'] is not None
assert response['b'] is not None
assert response['c'] is not None
assert response['d'] is not None

Essentially what I am looking for is something like this:
assert response['a'], response['b'], response['c'], response['d'] is not None

I did study about parametrixing fixtures but looks like that is not for my current use case.

Upvotes: 1

Views: 2079

Answers (2)

Christophe Brun
Christophe Brun

Reputation: 71

For identical tests, the parametrize decorator of pytest allows you to write a single test changing parameter(s).

The code readability is improved compared to a list comprehension because the test is simpler. More over your Junit or report is split into a single test for each attribute which highlights where the issue is:

enter image description here

Another issue is that testing the key is not None wil raise a KeyError if the key is absent and your test status will be error, not failed. Use the get method on the object to get None if the is absent.

Therefore I would write the test this way (assuming response can be a fixture):

import pytest

@pytest.fixture()
def response():
    return {"a": 1, "b": None}

@pytest.mark.parametrize("attribute", ('a', 'b', 'c', 'd'))
def test_attributes(attribute, response):
    assert response.get(attribute) is not None

Upvotes: 0

Shod
Shod

Reputation: 935

assert all(getattr(response, x) for x in ["a", "b", "c", "d"])

Upvotes: 1

Related Questions