Services Blog English

cli2 chttpx : écriture automatisée de fixtures de test

| par jpic | cli cli2 chttpx devops dev

chttpx s’enregistre aussi comme plugin pytest, parce que comme vous le savez, je suis assez paresseux quand il s’agit d’écrire des tests répétitifs. C’est pour ça que j’ai développé django-dbdiff, django-responsediff et aussi cli2.test.autotest. Faisons la même chose avec chttpx !

Écrivons un test qui appelle les commandes de création et de suppression d’objet, par exemple dans le fichier tests/test_client_test.py :

@pytest.fixture
def test_name(ts, chttpx_vars):
    # ts is a fixture provided by this plugin which contains the timestamp
    # chttpx_vars is variables that will be attached to the test fixture
    # doing this ensures you get either the fixture saved test_name either
    # a new one, unique thanks to the timestamp
    return chttpx_vars.setdefault('test_name', f'test{ts}')


@pytest.mark.chttpx_mock
def test_object_story(test_name):
    obj = APIClient.cli['object']['create'](f'name={test_name}')
    assert obj.name == test_name

    with pytest.raises(chttpx.RefusedResponseError):
        # test_name already exists!
        APIClient.cli['object']['create'](f'name={test_name}')

    APIClient.cli['object']['delete'](f'{obj.id}')

La première fois que vous lancez ce test, notre APIClient d’exemple se connectera à localhost:8000, comme il est configuré par défaut, et de vraies requêtes seront exécutées :

[21/Mar/2025 10:35:11] "POST /objects/ HTTP/1.1" 201 38
Bad Request: /objects/
[21/Mar/2025 10:35:11] "POST /objects/ HTTP/1.1" 400 50
[21/Mar/2025 10:35:11] "GET /objects/121/ HTTP/1.1" 200 38
[21/Mar/2025 10:35:11] "DELETE /objects/121/ HTTP/1.1" 204 0

Et le marqueur pytest chttpx_mock écrira pour vous du nouveau contenu dans tests/fixtures/tests_test_client_test.py::test_object_story.yaml :

    - request:
        event: request
        json:
          name: test33312
        level: debug
        method: POST
        timestamp: '2025-03-21 10:38:29'
        url: http://localhost:8000/objects/
      response:
        event: response
        json:
          data: {}
          id: 122
          name: test33312
        level: info
        method: POST
        status_code: '201'
        timestamp: '2025-03-21 10:38:29'
        url: http://localhost:8000/objects/
    - request:
        event: request
        json:
          name: test33312
        level: debug
        method: POST
        timestamp: '2025-03-21 10:38:29'
        url: http://localhost:8000/objects/
      response:
        event: response
        json:
          name:
          - object with this name already exists.
        level: info
        method: POST
        status_code: '400'
        timestamp: '2025-03-21 10:38:29'
        url: http://localhost:8000/objects/
    # and so on ...

Vous êtes censé ajouter ce fichier dans git, parce que la prochaine fois que vous lancerez le test, le marqueur chttpx_mock provisionnera le httpx_mock de pytest-httpx avec toutes les requêtes/réponses enregistrées dans le fichier de fixture.

Ainsi, deux nouvelles options pytest sont ajoutées par le plugin chttpx :

  • --chttpx-live : ne pas utiliser de fixtures du tout, lancer contre le vrai réseau
  • --chttpx-rewrite : forcer la réécriture de toutes les fixtures

Quand les spécifications changent, vous pouvez supprimer une fixture de test donnée et relancer le test, ce qui la réécrira, ou lancer avec --chttpx-rewrite pour réécrire toutes les fixtures.

Comme vos fixtures sont dans git, cela provoquera un diff dans le fichier de fixtures que vous devrez relire. C’est votre responsabilité de relire ces changements correctement : nous écrivons seulement les fixtures de test pour vous, mais vous devez les relire !

Publié dans chttpx 5.1.2 !

Have fun and profit ;)

Ils nous font confiance

Contact

logo