Services
Blog
English
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 fixturesQuand 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 ;)