테스트
테스트 클라이언트 측에서는 httpx 라이브러리를 사용하여 ASGI 응용 프로그램에 대해 요청할 수 있습니다.
Starlette.에서 HTML 응답 가져오기
Starlette.testClient에서 TestClient 가져오기
비동기 def 앱(범위, 수신, 전송):
주장 범위 ['유형'] == 'http'
응답 = HTML 응답('<html><body>안녕하세요, 세계!</body></html>')
응답 대기 중(범위, 수신, 전송)
Def test_app ():
클라이언트 = TestClient (앱)
응답 = client.get ('/')
응답을 주장합니다. 상태 _ 코드 = = 200
테스트 클라이언트 측에서 노출된 인터페이스는 다른 httpx 세션과 동일합니다. 특히 요청을 하는 호출은 대기 가능한 개체가 아니라 표준 함수 호출일 뿐입니다.
인증, 세션 쿠키 처리 또는 파일 업로드와 같은 httpx 표준 API를 사용할 수 있습니다.
예를 들어 TestClient에서 헤더를 설정하려면 다음을 수행할 수 있습니다.
클라이언트 = TestClient (앱)
# 향후 요청에 대한 클라이언트의 헤더 설정
클라이언트.헤더 = {"Authorization": "..."}
응답 = client.get ("/")
# 각 요청에 대한 헤더를 별도로 설정
응답 = client.get ("/", 헤더 ={"Authorization": "..."})
예를 들어 TestClient를 사용하여 파일을 보내는 경우:
클라이언트 = TestClient (앱)
# 단일 파일 보내기
f로 열기("예: txt", "rb"):
응답=client.post("/양식", 파일={"file": f})
# 여러 파일 보내기
f1로 열기("예: txt", "rb"):
f2로 열기("예: png", "rb"):
파일 = {"file1": f1, "file2": ("filename", f2, "image/png")}
응답=client.post("/양식", 파일 = 파일)
자세한 내용은 httpx 설명서를 볼 수 있습니다.
기본적으로, TestClient 응용 프로그램에서 발생하는 예외를 던집니다. 때때로 클라이언트 측에서 서버 예외를 허용하지 않고 500 오류 응답의 내용을 테스트할 수 있습니다. 이 경우 사용해야 합니다. client = TestClient(app, raise_server_exceptions=False) ...
주의
당신이 원한다면 TestClient 실행하려면 lifespan 핸들러,
TestClient 를 컨텍스트로 사용해야 manager.It
TestClient 가 instantiated.You 그것에 대해 더 많이 배울 수 있을 때 트리거되지 않습니다.
여기.
비동기 백엔드 선택
TestClient 는 backend(문자열) 및 backend_options(사전) 인수를 수락합니다. 이러한 옵션은 anyio.start_blocking_portal() 로 전달됩니다. 허용 가능한 백엔드 옵션에 대한 자세한 내용은 anyio 설명서를 참조하십시오. 기본적으로 asyncio 및 해당 기본 옵션이 사용됩니다.
죄송합니다. 원문에서 "Trio"와 "backend="trio""의 의미가 불분명하고 정확하게 번역될 수 없습니다. 이 두 기호에 대해 더 많은 정보를 제공할 수 있다면 더 정확한 번역을 제공하기 위해 최선을 다하겠습니다.
Def test_app ()
TestClient(앱, 백엔드 = "트리오")를 클라이언트로 사용:
...
uvloop 로 asyncio 를 실행하려면 backend_options={"use_uvloop": True} 를 통과하십시오. 예를 들어:
Def test_app ()
TestClient(앱, backend_={"use_uvloop": True})를 클라이언트로 사용:
...
웹 소켓 세션 테스트
테스트 클라이언트 측을 사용하여 WebSocket 세션을 테스트할 수도 있습니다.
httpx 라이브러리는 초기 핸드셰이크를 구축하는 데 사용되며, 이는 HTTP 및 WebSocket 테스트 간에 동일한 인증 옵션과 추가 헤더를 사용할 수 있음을 의미합니다.
Starlette.testClient에서 TestClient 가져오기
스타렛에서.웹 소켓 가져오기 웹 소켓
비동기 def 앱(범위, 수신, 전송):
주장 범위 ['유형'] == '웹 소켓'
웹 소켓 = 웹 소켓(범위, 수신 = 수신, 송신 = 송신)
웹소켓을 기다리세요. 수락하세요 ()
웹 소켓을 기다립니다. send_gate ('안녕하세요, 세상!')
웹소켓을 기다리세요. 닫으세요 ()
Def test_app ():
클라이언트 = TestClient (앱)
client.websocket_Connect('/')를 웹 소켓으로 사용합니다.
데이터 = websocket._gate ()
데이터 주장 == '안녕하세요, 세상!'
세션의 작업은 대기 가능한 개체가 아니라 표준 함수 호출입니다.
컨텍스트 관리 with 블록 내에서 세션을 사용하는 것이 중요합니다. 이렇게 하면 ASGI 응용 프로그램이 있는 백그라운드 스레드가 올바르게 종료되고 응용 프로그램 내에서 발생하는 모든 예외가 항상 테스트 클라이언트 측에서 제기됩니다.
테스트 세션 설정
.websocket_connect(url, subprotocols=None, **options)-httpx.get()와 동일한 매개 변수 집합을 사용합니다.
응용 프로그램이 WebSocket 연결을 허용하지 않으면 starlette.websockets.WebSocketDisconnect 가 던져질 수 있습니다.
websocket_connect() 는 (with 블록에서) 컨텍스트 관리자로 사용해야 합니다.
!!! params 매개 변수는 websocket_connect 에서 지원되지 않습니다. 쿼리 매개 변수를 전달해야 하는 경우 URL에서 직접 하드 코딩하십시오.
```python
with client.websocket_connect('/path?foo=bar') as websocket:
...
```
데이터 보내기
.send_text(data)- 지정된 텍스트를 응용 프로그램으로 보냅니다..send_bytes(data)- 지정된 바이트를 응용 프로그램으로 보냅니다..send_json(data, mode="text")- 지정된 데이터를 응용 프로그램으로 보냅니다.mode="binary"를 사용하여 이진 데이터 프레임을 통해 JSON을 전송합니다.
데이터 받기
.receive_text()응용 프로그램에서 보낸 수신 텍스트를 기다렸다가 반환합니다..receive_bytes()- 응용 프로그램에서 보낸 수신 바이트 문자열을 기다렸다가 반환합니다..receive_json(mode="text")- 응용 프로그램에서 보낸 수신 JSON 데이터를 기다렸다가 반환합니다.mode="binary"를 사용하여 이진 데이터 프레임을 통해 JSON을 수신합니다.
"starlette.websockets.WebSocketDisconnect 를 올릴 수 있습니다"라는 텍스트는 기존의 의미 표현에 맞지 않는 것 같아서 정확한 중국어 번역을 하기가 어렵습니다. 더 많은 상황 정보를 가지고 있거나 텍스트 내용의 정확성을 확인한다면 더 만족스러운 번역을 제공하기 위해 최선을 다하겠습니다.
현재 문자 그대로의 번역은 "starlette.websockets.WebSocketDisconnect 를 개선할 수 있습니다"로만 번역될 수 있습니다. 그러나 이 번역은 실용적이지 않을 수 있습니다.
가까운 연결
.close(code=1000)- WebSocket 연결에서 클라이언트 측 닫기 작업을 수행합니다.
비동기 테스트
때때로 응용프로그램 외부에서 비동기 작업을 수행하려고 합니다. 예를 들어 기존 비동기 데이터베이스 클라이언트 측/인프라를 사용하여 응용프로그램을 호출한 후 데이터베이스 상태를 확인할 수 있습니다.
이러한 경우 TestClient 를 사용하는 것은 자체 이벤트 루프를 생성하기 때문에 어렵고 데이터베이스 연결과 같은 비동기 리소스는 이벤트 루프 간에 공유되지 않는 경우가 많습니다.
이 문제를 해결하는 가장 쉬운 방법은 전체 테스트를 비동기식으로 만들고 Httpx와 같은 비동기식 클라이언트 측을 사용하는 것입니다. AsyncClient.
다음은 이러한 테스트의 예입니다.
htpx에서 AsyncClient 가져오기
Starlette. 응용 프로그램이 Starlette에서 가져옵니다.
별자리에서. 라우팅 가져오기 경로
스타렛에서. 요청 가져오기 요청
Starlette.에서 일반 텍스트 응답을 가져옵니다.
데프 안녕하세요 (요청: 요청) -> 일반 텍스트 응답:
일반 텍스트 응답을 반환합니다("Hello World!")
앱=스타렛(루트=[루트("/", 안녕하세요)])
# pyest를 사용하는 경우 다음과 같은 비동기 마커를 추가해야 합니다.
#@pytest.mac.anyio 사용https://github.com/agronholm/anyio
# 또는 pytest-asyncio(https://github.com/pytest-dev/pytest-asyncio)를 설치하고 구성합니다.
Async def test_app () -> 없음:
# 참고: 당신 _필수_ 세트 `base_url` "/"와 같은 상대 URL이 작동하려면
AsyncClient(앱 = 앱, base_url = "http://testServer")를 클라이언트로 비동기화:
R = 클라이언트를 기다립니다. ("/")
주장 r. stast_code == 200
주장 r.tex== "안녕하세요 세계!"