# Getting Started

Sanic Testing is the *official* testing client for Sanic. Its primary use is to power the tests of the Sanic project itself. However, it is also meant as an easy-to-use client for getting your API tests up and running quickly.

## Minimum requirements

- **Python**: 3.7+
- **Sanic**: 21.3+

Versions of Sanic older than 21.3 have this module integrated into Sanic itself as `sanic.testing`.

## Install

Sanic Testing can be installed from PyPI:

```
pip install sanic-testing
```

## Basic Usage

As long as the `sanic-testing` package is in the environment, there is nothing you need to do to start using it.

### Writing a sync test

In order to use the test client, you just need to access the property `test_client` on your application instance:

```python
import pytest
from sanic import Sanic, response

@pytest.fixture
def app():
    sanic_app = Sanic("TestSanic")

    @sanic_app.get("/")
    def basic(request):
        return response.text("foo")

    return sanic_app

def test_basic_test_client(app):
    request, response = app.test_client.get("/")

    assert request.method.lower() == "get"
    assert response.body == b"foo"
    assert response.status == 200
```

### Writing an async test

In order to use the async test client in `pytest`, you should install the `pytest-asyncio` plugin.

```
pip install pytest-asyncio
```

You can then create an async test and use the ASGI client:

```python
import pytest
from sanic import Sanic, response

@pytest.fixture
def app():
    sanic_app = Sanic(__name__)

    @sanic_app.get("/")
    def basic(request):
        return response.text("foo")

    return sanic_app

@pytest.mark.asyncio
async def test_basic_asgi_client(app):
    request, response = await app.asgi_client.get("/")

    assert request.method.lower() == "get"
    assert response.body == b"foo"
    assert response.status == 200
```
