Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit53b21c8

Browse files
Merge branch 'tiangolo:master' into master
2 parents81087d0 +d3cdd3b commit53b21c8

File tree

2 files changed

+96
-0
lines changed

2 files changed

+96
-0
lines changed

‎docs/en/docs/release-notes.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ hide:
3333

3434
###Translations
3535

36+
* 🌐 Add Portuguese translation for`docs/pt/docs/advanced/async-tests.md`. PR[#11808](https://github.com/tiangolo/fastapi/pull/11808) by[@ceb10n](https://github.com/ceb10n).
3637
* 🌐 Add Ukrainian translation for`docs/uk/docs/tutorial/first-steps.md`. PR[#11809](https://github.com/tiangolo/fastapi/pull/11809) by[@vkhoroshchak](https://github.com/vkhoroshchak).
3738
* 🌐 Add Portuguese translation for`docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md`. PR[#11804](https://github.com/tiangolo/fastapi/pull/11804) by[@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda).
3839
* 🌐 Add Chinese translation for`docs/zh/docs/fastapi-cli.md`. PR[#11786](https://github.com/tiangolo/fastapi/pull/11786) by[@logan2d5](https://github.com/logan2d5).
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#Testes Assíncronos
2+
3+
Você já viu como testar as suas aplicações**FastAPI** utilizando o`TestClient` que é fornecido. Até agora, você viu apenas como escrever testes síncronos, sem utilizar funções`async`.
4+
5+
Ser capaz de utilizar funções assíncronas em seus testes pode ser útil, por exemplo, quando você está realizando uma consulta em seu banco de dados de maneira assíncrona. Imagine que você deseja testar realizando requisições para a sua aplicação FastAPI e depois verificar que a sua aplicação inseriu corretamente as informações no banco de dados, ao utilizar uma biblioteca assíncrona para banco de dados.
6+
7+
Vamos ver como nós podemos fazer isso funcionar.
8+
9+
##pytest.mark.anyio
10+
11+
Se quisermos chamar funções assíncronas em nossos testes, as nossas funções de teste precisam ser assíncronas. O AnyIO oferece um plugin bem legal para isso, que nos permite especificar que algumas das nossas funções de teste precisam ser chamadas de forma assíncrona.
12+
13+
##HTTPX
14+
15+
Mesmo que a sua aplicação**FastAPI** utilize funções normais com`def` no lugar de`async def`, ela ainda é uma aplicação`async` por baixo dos panos.
16+
17+
O`TestClient` faz algumas mágicas para invocar a aplicação FastAPI assíncrona em suas funções`def` normais, utilizando o pytest padrão. Porém a mágica não acontece mais quando nós estamos utilizando dentro de funções assíncronas. Ao executar os nossos testes de forma assíncrona, nós não podemos mais utilizar o`TestClient` dentro das nossas funções de teste.
18+
19+
O`TestClient` é baseado no <ahref="https://www.python-httpx.org"class="external-link"target="_blank">HTTPX</a>, e felizmente nós podemos utilizá-lo diretamente para testar a API.
20+
21+
##Exemplo
22+
23+
Para um exemplos simples, vamos considerar uma estrutura de arquivos semelhante ao descrito em[Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} e[Testing](../tutorial/testing.md){.internal-link target=_blank}:
24+
25+
```
26+
.
27+
├── app
28+
│   ├── __init__.py
29+
│   ├── main.py
30+
│   └── test_main.py
31+
```
32+
33+
O arquivo`main.py` teria:
34+
35+
```Python
36+
{!../../../docs_src/async_tests/main.py!}
37+
```
38+
39+
O arquivo`test_main.py` teria os testes para para o arquivo`main.py`, ele poderia ficar assim:
40+
41+
```Python
42+
{!../../../docs_src/async_tests/test_main.py!}
43+
```
44+
45+
##Executá-lo
46+
47+
Você pode executar os seus testes normalmente via:
48+
49+
<divclass="termy">
50+
51+
```console
52+
$pytest
53+
54+
---> 100%
55+
```
56+
57+
</div>
58+
59+
##Em Detalhes
60+
61+
O marcador`@pytest.mark.anyio` informa ao pytest que esta função de teste deve ser invocada de maneira assíncrona:
62+
63+
```Python hl_lines="7"
64+
{!../../../docs_src/async_tests/test_main.py!}
65+
```
66+
67+
!!! tip "Dica"
68+
Note que a função de teste é`async def` agora, no lugar de apenas`def` como quando estávamos utilizando o`TestClient` anteriormente.
69+
70+
Então podemos criar um`AsyncClient` com a aplicação, e enviar requisições assíncronas para ela utilizando`await`.
71+
72+
```Python hl_lines="9-10"
73+
{!../../../docs_src/async_tests/test_main.py!}
74+
```
75+
76+
Isso é equivalente a:
77+
78+
```Python
79+
response= client.get('/')
80+
```
81+
82+
...que nós utilizamos para fazer as nossas requisições utilizando o`TestClient`.
83+
84+
!!! tip "Dica"
85+
Note que nós estamos utilizando async/await com o novo`AsyncClient` - a requisição é assíncrona.
86+
87+
!!! warning "Aviso"
88+
Se a sua aplicação depende dos eventos de vida útil (*lifespan*), o`AsyncClient` não acionará estes eventos. Para garantir que eles são acionados, utilize o`LifespanManager` do <ahref="https://github.com/florimondmanca/asgi-lifespan#usage"class="external-link"target="_blank">florimondmanca/asgi-lifespan</a>.
89+
90+
##Outras Chamadas de Funções Assíncronas
91+
92+
Como a função de teste agora é assíncrona, você pode chamar (e`esperar`) outras funções`async` além de enviar requisições para a sua aplicação FastAPI em seus testes, exatamente como você as chamaria em qualquer outro lugar do seu código.
93+
94+
!!! tip "Dica"
95+
Se você se deparar com um`RuntimeError: Task attached to a different loop` ao integrar funções assíncronas em seus testes (e.g. ao utilizar o <ahref="https://stackoverflow.com/questions/41584243/runtimeerror-task-attached-to-a-different-loop"class="external-link"target="_blank">MotorClient do MongoDB</a>) Lembre-se de instanciar objetos que precisam de um loop de eventos (*event loop*) apenas em funções assíncronas, e.g. um*"callback"*`'@app.on_event("startup")`.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2026 Movatter.jp