Movatterモバイル変換


[0]ホーム

URL:


콘텐츠로 이동
Join theFastAPI Cloud waiting list 🚀
Follow@fastapi onX (Twitter) to stay updated
FollowFastAPI onLinkedIn to stay updated
Subscribe to theFastAPI and friends newsletter 🎉
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor
sponsor

Test Client -TestClient

You can use theTestClient class to test FastAPI applications without creating an actual HTTP and socket connection, just communicating directly with the FastAPI code.

Read more about it in theFastAPI docs for Testing.

You can import it directly fromfastapi.testclient:

fromfastapi.testclientimportTestClient

fastapi.testclient.TestClient

TestClient(app,base_url="http://testserver",raise_server_exceptions=True,root_path="",backend="asyncio",backend_options=None,cookies=None,headers=None,follow_redirects=True,client=("testclient",50000),)

Bases:Client

Source code instarlette/testclient.py
373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
def__init__(self,app:ASGIApp,base_url:str="http://testserver",raise_server_exceptions:bool=True,root_path:str="",backend:Literal["asyncio","trio"]="asyncio",backend_options:dict[str,Any]|None=None,cookies:httpx._types.CookieTypes|None=None,headers:dict[str,str]|None=None,follow_redirects:bool=True,client:tuple[str,int]=("testclient",50000),)->None:self.async_backend=_AsyncBackend(backend=backend,backend_options=backend_optionsor{})if_is_asgi3(app):asgi_app=appelse:app=cast(ASGI2App,app)# type: ignore[assignment]asgi_app=_WrapASGI2(app)# type: ignore[arg-type]self.app=asgi_appself.app_state:dict[str,Any]={}transport=_TestClientTransport(self.app,portal_factory=self._portal_factory,raise_server_exceptions=raise_server_exceptions,root_path=root_path,app_state=self.app_state,client=client,)ifheadersisNone:headers={}headers.setdefault("user-agent","testclient")super().__init__(base_url=base_url,headers=headers,transport=transport,follow_redirects=follow_redirects,cookies=cookies,)

headerspropertywritable

headers

HTTP headers to include when sending requests.

follow_redirectsinstance-attribute

follow_redirects=follow_redirects

max_redirectsinstance-attribute

max_redirects=max_redirects

is_closedproperty

is_closed

Check if the client being closed

trust_envproperty

trust_env

timeoutpropertywritable

timeout

event_hookspropertywritable

event_hooks

authpropertywritable

auth

Authentication class used when none is passed at the request-level.

See alsoAuthentication.

base_urlpropertywritable

base_url

Base URL to use when sending requests with relative URLs.

cookiespropertywritable

cookies

Cookie values to include when sending requests.

paramspropertywritable

params

Query parameters to include in the URL when sending requests.

taskinstance-attribute

task

portalclass-attributeinstance-attribute

portal=None

async_backendinstance-attribute

async_backend=_AsyncBackend(backend=backend,backend_options=backend_optionsor{})

appinstance-attribute

app=asgi_app

app_stateinstance-attribute

app_state={}

build_request

build_request(method,url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,timeout=USE_CLIENT_DEFAULT,extensions=None)

Build and return a request instance.

  • Theparams,headers andcookies argumentsare merged with any values set on the client.
  • Theurl argument is merged with anybase_url set on the client.

See also:Request instances

Source code inhttpx/_client.py
340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
defbuild_request(self,method:str,url:URL|str,*,content:RequestContent|None=None,data:RequestData|None=None,files:RequestFiles|None=None,json:typing.Any|None=None,params:QueryParamTypes|None=None,headers:HeaderTypes|None=None,cookies:CookieTypes|None=None,timeout:TimeoutTypes|UseClientDefault=USE_CLIENT_DEFAULT,extensions:RequestExtensions|None=None,)->Request:"""    Build and return a request instance.    * The `params`, `headers` and `cookies` arguments    are merged with any values set on the client.    * The `url` argument is merged with any `base_url` set on the client.    See also: [Request instances][0]    [0]: /advanced/clients/#request-instances    """url=self._merge_url(url)headers=self._merge_headers(headers)cookies=self._merge_cookies(cookies)params=self._merge_queryparams(params)extensions={}ifextensionsisNoneelseextensionsif"timeout"notinextensions:timeout=(self.timeoutifisinstance(timeout,UseClientDefault)elseTimeout(timeout))extensions=dict(**extensions,timeout=timeout.as_dict())returnRequest(method,url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,extensions=extensions,)

stream

stream(method,url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)

Alternative tohttpx.request() that streams the response bodyinstead of loading it into memory at once.

Parameters: Seehttpx.request.

See also:Streaming Responses

Source code inhttpx/_client.py
827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877
@contextmanagerdefstream(self,method:str,url:URL|str,*,content:RequestContent|None=None,data:RequestData|None=None,files:RequestFiles|None=None,json:typing.Any|None=None,params:QueryParamTypes|None=None,headers:HeaderTypes|None=None,cookies:CookieTypes|None=None,auth:AuthTypes|UseClientDefault|None=USE_CLIENT_DEFAULT,follow_redirects:bool|UseClientDefault=USE_CLIENT_DEFAULT,timeout:TimeoutTypes|UseClientDefault=USE_CLIENT_DEFAULT,extensions:RequestExtensions|None=None,)->typing.Iterator[Response]:"""    Alternative to `httpx.request()` that streams the response body    instead of loading it into memory at once.    **Parameters**: See `httpx.request`.    See also: [Streaming Responses][0]    [0]: /quickstart#streaming-responses    """request=self.build_request(method=method,url=url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,timeout=timeout,extensions=extensions,)response=self.send(request=request,auth=auth,follow_redirects=follow_redirects,stream=True,)try:yieldresponsefinally:response.close()

send

send(request,*,stream=False,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT)

Send a request.

The request is sent as-is, unmodified.

Typically you'll want to build one withClient.build_request()so that any client-level configuration is merged into the request,but passing an explicithttpx.Request() is supported as well.

See also:Request instances

Source code inhttpx/_client.py
879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928
defsend(self,request:Request,*,stream:bool=False,auth:AuthTypes|UseClientDefault|None=USE_CLIENT_DEFAULT,follow_redirects:bool|UseClientDefault=USE_CLIENT_DEFAULT,)->Response:"""    Send a request.    The request is sent as-is, unmodified.    Typically you'll want to build one with `Client.build_request()`    so that any client-level configuration is merged into the request,    but passing an explicit `httpx.Request()` is supported as well.    See also: [Request instances][0]    [0]: /advanced/clients/#request-instances    """ifself._state==ClientState.CLOSED:raiseRuntimeError("Cannot send a request, as the client has been closed.")self._state=ClientState.OPENEDfollow_redirects=(self.follow_redirectsifisinstance(follow_redirects,UseClientDefault)elsefollow_redirects)self._set_timeout(request)auth=self._build_request_auth(request,auth)response=self._send_handling_auth(request,auth=auth,follow_redirects=follow_redirects,history=[],)try:ifnotstream:response.read()returnresponseexceptBaseExceptionasexc:response.close()raiseexc

close

close()

Close transport and proxies.

Source code inhttpx/_client.py
12631264126512661267126812691270127112721273
defclose(self)->None:"""    Close transport and proxies.    """ifself._state!=ClientState.CLOSED:self._state=ClientState.CLOSEDself._transport.close()fortransportinself._mounts.values():iftransportisnotNone:transport.close()

request

request(method,url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
defrequest(# type: ignore[override]self,method:str,url:httpx._types.URLTypes,*,content:httpx._types.RequestContent|None=None,data:_RequestData|None=None,files:httpx._types.RequestFiles|None=None,json:Any=None,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:iftimeoutisnothttpx.USE_CLIENT_DEFAULT:warnings.warn("You should not use the 'timeout' argument with the TestClient. ""See https://github.com/Kludex/starlette/issues/1108 for more information.",DeprecationWarning,)url=self._merge_url(url)returnsuper().request(method,url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

get

get(url,*,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
461462463464465466467468469470471472473474475476477478479480481482
defget(# type: ignore[override]self,url:httpx._types.URLTypes,*,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().get(url,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

options

options(url,*,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
484485486487488489490491492493494495496497498499500501502503504505
defoptions(# type: ignore[override]self,url:httpx._types.URLTypes,*,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().options(url,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

head

head(url,*,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
507508509510511512513514515516517518519520521522523524525526527528
defhead(# type: ignore[override]self,url:httpx._types.URLTypes,*,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().head(url,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

post

post(url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
defpost(# type: ignore[override]self,url:httpx._types.URLTypes,*,content:httpx._types.RequestContent|None=None,data:_RequestData|None=None,files:httpx._types.RequestFiles|None=None,json:Any=None,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().post(url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

put

put(url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590
defput(# type: ignore[override]self,url:httpx._types.URLTypes,*,content:httpx._types.RequestContent|None=None,data:_RequestData|None=None,files:httpx._types.RequestFiles|None=None,json:Any=None,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().put(url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

patch

patch(url,*,content=None,data=None,files=None,json=None,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621
defpatch(# type: ignore[override]self,url:httpx._types.URLTypes,*,content:httpx._types.RequestContent|None=None,data:_RequestData|None=None,files:httpx._types.RequestFiles|None=None,json:Any=None,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().patch(url,content=content,data=data,files=files,json=json,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

delete

delete(url,*,params=None,headers=None,cookies=None,auth=USE_CLIENT_DEFAULT,follow_redirects=USE_CLIENT_DEFAULT,timeout=USE_CLIENT_DEFAULT,extensions=None)
Source code instarlette/testclient.py
623624625626627628629630631632633634635636637638639640641642643644
defdelete(# type: ignore[override]self,url:httpx._types.URLTypes,*,params:httpx._types.QueryParamTypes|None=None,headers:httpx._types.HeaderTypes|None=None,cookies:httpx._types.CookieTypes|None=None,auth:httpx._types.AuthTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,follow_redirects:bool|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,timeout:httpx._types.TimeoutTypes|httpx._client.UseClientDefault=httpx._client.USE_CLIENT_DEFAULT,extensions:dict[str,Any]|None=None,)->httpx.Response:returnsuper().delete(url,params=params,headers=headers,cookies=cookies,auth=auth,follow_redirects=follow_redirects,timeout=timeout,extensions=extensions,)

websocket_connect

websocket_connect(url,subprotocols=None,**kwargs)
Source code instarlette/testclient.py
646647648649650651652653654655656657658659660661662663664665666667
defwebsocket_connect(self,url:str,subprotocols:Sequence[str]|None=None,**kwargs:Any,)->WebSocketTestSession:url=urljoin("ws://testserver",url)headers=kwargs.get("headers",{})headers.setdefault("connection","upgrade")headers.setdefault("sec-websocket-key","testserver==")headers.setdefault("sec-websocket-version","13")ifsubprotocolsisnotNone:headers.setdefault("sec-websocket-protocol",", ".join(subprotocols))kwargs["headers"]=headerstry:super().request("GET",url,**kwargs)except_Upgradeasexc:session=exc.sessionelse:raiseRuntimeError("Expected WebSocket upgrade")# pragma: no coverreturnsession

lifespanasync

lifespan()
Source code instarlette/testclient.py
701702703704705706
asyncdeflifespan(self)->None:scope={"type":"lifespan","state":self.app_state}try:awaitself.app(scope,self.stream_receive.receive,self.stream_send.send)finally:awaitself.stream_send.send(None)

wait_startupasync

wait_startup()
Source code instarlette/testclient.py
708709710711712713714715716717718719720721722723
asyncdefwait_startup(self)->None:awaitself.stream_receive.send({"type":"lifespan.startup"})asyncdefreceive()->Any:message=awaitself.stream_send.receive()ifmessageisNone:self.task.result()returnmessagemessage=awaitreceive()assertmessage["type"]in("lifespan.startup.complete","lifespan.startup.failed",)ifmessage["type"]=="lifespan.startup.failed":awaitreceive()

wait_shutdownasync

wait_shutdown()
Source code instarlette/testclient.py
725726727728729730731732733734735736737738739
asyncdefwait_shutdown(self)->None:asyncdefreceive()->Any:message=awaitself.stream_send.receive()ifmessageisNone:self.task.result()returnmessageawaitself.stream_receive.send({"type":"lifespan.shutdown"})message=awaitreceive()assertmessage["type"]in("lifespan.shutdown.complete","lifespan.shutdown.failed",)ifmessage["type"]=="lifespan.shutdown.failed":awaitreceive()

[8]ページ先頭

©2009-2026 Movatter.jp