Testing
The GraphiQL playground integrated with Strawberry available at
http://localhost:8000/graphql (if you run the schema
with strawberry server
) can be a good place to start testing your queries and
mutations. However, at some point, while you are developing your application (or even
before if you are practising TDD), you may want to create some automated tests.
We can use the Strawberry schema
object we defined in the
Getting Started tutorial to run our
first test:
def test_query(): query = """
query TestQuery($title: String!) {
books(title: $title) {
title
author
}
}
"""
result = schema.execute_sync( query, variable_values={"title": "The Great Gatsby"}, )
assert result.errors is None assert result.data["books"] == [ { "title": "The Great Gatsby", "author": "F. Scott Fitzgerald", } ]
This test_query
example:
- defines the query we will test against; it accepts one argument,
title
, as input - executes the query and assigns the result to a
result
variable - asserts that the result is what we are expecting: nothing in
errors
and our desired book indata
As you may have noticed, we explicitly defined the query variable title
, and we passed
it separately with the variable_values
argument, but we could have directly hardcoded
the title
in the query string instead. We did this on purpose because usually the
query's arguments will be dynamic and, as we want to test our application as close to
production as possible, it wouldn't make much sense to hardcode the variables in the
query.
Testing Async
Since Strawberry supports async, tests can also be written to be async:
@pytest.mark.asyncioasync def test_query_async(): ...
resp = await schema.execute(query, variable_values={"title": "The Great Gatsby"})
...
Testing Mutations
We can also write a test for our addBook
Mutation
example:
@pytest.mark.asyncioasync def test_mutation(): mutation = """
mutation TestMutation($title: String!, $author: String!) {
addBook(title: $title, author: $author) {
title
}
}
"""
resp = await schema.execute( mutation, variable_values={ "title": "The Little Prince", "author": "Antoine de Saint-Exupéry", }, )
assert resp.errors is None assert resp.data["addBook"] == { "title": "The Little Prince", }
Testing Subscriptions
And finally, a test for our count
Subscription:
import asyncioimport pytestimport strawberry
@strawberry.typeclass Subscription: @strawberry.subscription async def count(self, target: int = 100) -> int: for i in range(target): yield i await asyncio.sleep(0.5)
@strawberry.typeclass Query: @strawberry.field def hello() -> str: return "world"
schema = strawberry.Schema(query=Query, subscription=Subscription)
@pytest.mark.asyncioasync def test_subscription(): query = """
subscription {
count(target: 3)
}
"""
sub = await schema.subscribe(query)
index = 0 async for result in sub: assert not result.errors assert result.data == {"count": index}
index += 1
As you can see testing Subscriptions is a bit more complicated because we want to check the result of each individual result.