परीक्षण
परीक्षण क्लाइंट पक्ष आपको उपयोग करने की अनुमति देता है httpx लाइब्रेरी आपके ASGI एप्लिकेशन के लिए अनुरोध करती है।
से te.आयात HT
से te.आयात Testent
Ac def ऐप (गुंजाइश, प्राप्त, भेजें):
गुंजाइश डालें ['type'] == 'htp'
प्रतिक्रिया = HT(')<html><body>नमस्ते दुनिया!</body></html>')
प्रतिक्रिया की प्रतीक्षा (गुंजाइश, प्राप्त, भेजें)
डेफ टेस्ट _ ऐप ():
क्लाइंट = टेस्टक्लाइंट (ऐप)
प्रतिक्रिया = ग्राहक ('/')
प्रतिक्रिया दें। status_code == 200
परीक्षण क्लाइंट पक्ष द्वारा उजागर इंटरफ़ेस किसी भी अन्य httpx सत्र के समान है। विशेष रूप से, अनुरोध करने वाला आह्वान सिर्फ एक मानक फ़ंक्शन कॉल है, न कि एक प्रतीक्षा योग्य वस्तु।
आप किसी भी का उपयोग कर सकते हैं httpx मानक एपीआई, जैसे प्रमाणीकरण, सत्र कुकी हैंडलिंग, या फ़ाइल अपलोडिंग।
उदाहरण के लिए, Testent पर हेडर सेट करने के लिए, आप निम्नलिखित कर सकते हैं:
क्लाइंट = टेस्टक्लाइंट (ऐप)
# भविष्य के अनुरोधों के लिए क्लाइंट पर हेडर सेट करें
ग्राहक = {"Authorization": "..."}
प्रतिक्रिया = ग्राहक ("/")
# प्रत्येक अनुरोध के लिए हेडर अलग से सेट करें
प्रतिक्रिया = ग्राहक ("/", हेडर ={"Authorization": "..."})
उदाहरण के लिए, फ़ाइल भेजने के लिए Testent का उपयोग करना:
क्लाइंट = टेस्टक्लाइंट (ऐप)
# एक एकल फ़ाइल भेजें
खोलने के साथ ("example.txt", "rb") च के रूप में:
प्रतिक्रिया = client.post ("/ form", फाइलें ={"file": f})
# कई फाइलें भेजें
खोलने के साथ ("example.txt", "rb") f1 के रूप में:
खोलने के साथ ("example.png", "rb") f2 के रूप में:
फाइलें = {"file1": f1, "file2": ("filename", f2, "image/png")}
प्रतिक्रिया = client.post ("/ form", फाइलें = फाइलें)
अधिक जानकारी के लिए, आप जांच सकते हैं httpx दस्तावेज़।
डिफ़ॉल्ट रूप से, TestClient एप्लिकेशन में होने वाले किसी भी अपवाद को फेंक देता है। कभी-कभी, आप क्लाइंट साइड को सर्वर अपवाद फेंकने की अनुमति देने के बजाय 500 त्रुटि प्रतिक्रिया की सामग्री का परीक्षण करना चाह सकते हैं। इस स्थिति में, आपको उपयोग करना चाहिए client = TestClient(app, raise_server_exceptions=False) ...
!!! ध्यान
यदि आप चाहते हैं `TestClient` चलाने के लिए `lifespan` हैंडलर,
आपको उपयोग करने की आवश्यकता होगी `TestClient` एक संदर्भ के रूप manager.It
ट्रिगर नहीं किया जाना चाहिए जब `TestClient` क्या instantiated.You इसके बारे में अधिक जान सकते हैं
[यहाँ](lifespan.md#running-lifespan-in-tests) हाँ।
अतुल्यकालिक बैकएंड चुनें
TestClient पैरामीटर स्वीकार करें backend (A string) और backend_options (A dictionary). इन विकल्पों को पारित किया जाएगा anyio.start_blocking_portal() स्वीकार्य बैकएंड विकल्पों के बारे में अधिक जानकारी के लिए, कृपया किसी भी प्रलेखन को देखें asyncio और इसके डिफ़ॉल्ट विकल्प।
क्षमा करें, मूल पाठ में " Trio "तथा" backend="trio" "अर्थ स्पष्ट नहीं है और इसका सटीक अनुवाद नहीं किया जा सकता है। यदि आप इन दो प्रतीकों के बारे में अधिक जानकारी प्रदान कर सकते हैं, तो मैं आपको अधिक सटीक अनुवाद प्रदान करने की पूरी कोशिश करूंगा।
डेफ टेस्ट _ ऐप ()
ग्राहक के रूप में Testent (ऐप, बैकएंड = "तिकड़ी") के साथ:
...
उपयोग करने के लिए uvloop दौड़ो asyncio , पर पारित करने की आवश्यकता है backend_options={"use_uvloop": True} उदाहरण के लिए:
डेफ टेस्ट _ ऐप ()
ग्राहक के रूप में Testent (app, backend_options ={"use_uvloop": True}) के साथ:
...
परीक्षण और वेबसॉकेट सत्र
आप परीक्षण क्लाइंट पक्ष का उपयोग करके वेबसॉकेट सत्रों का भी परीक्षण कर सकते हैं।
httpx लाइब्रेरी का उपयोग प्रारंभिक हैंडशेक बनाने के लिए किया जाएगा, जो माध्य आप HTऔर परीक्षण के बीच समान प्रमाणीकरण विकल्प और अतिरिक्त हेडर का उपयोग कर सकते हैं।
से te.आयात Testent
te.websocसे आयात करें
Ac def ऐप (गुंजाइश, प्राप्त, भेजें):
गुंजाइश ['प्रकार'] == 'वेबसॉकेट'
वेबसॉकेट = वेबसॉकेट (गुंजाइश, प्राप्त = प्राप्त, भेजें = भेजें)
प्रतीक्षा करें websocket.()
वेबसोकेट का इंतजार करें। भेजें _ पाठ ('Hello, world!')
प्रतीक्षा करें websocket.()
डेफ टेस्ट _ ऐप ():
क्लाइंट = टेस्टक्लाइंट (ऐप)
क्लाइंट के साथ। वेबसॉकेट _ कनेक्ट ('/') वेबसॉकेट के रूप में:
डेटा = websocket.recet_text ()
डेटा = = 'हैलो, दुनिया!'
एक सत्र पर संचालन मानक फ़ंक्शन कॉल हैं, न कि प्रतीक्षा योग्य वस्तुएं।
संदर्भ में प्रबंधित with ब्लॉक के भीतर सत्रों का उपयोग करना महत्वपूर्ण है। यह सुनिश्चित करता है कि पृष्ठभूमि थ्रेड्स जहां ASGI एप्लिकेशन रहता है, को सही ढंग से समाप्त कर दिया जाता है, और यह कि एप्लिकेशन के भीतर होने वाले किसी भी अपवाद को हमेशा परीक्षण क्लाइंट पक्ष द्वारा उठाया जाता है।
एक परीक्षण सत्र सेट करें
.websocket_connect(url, subprotocols=None, **options)- साथhttpx.get()मापदंडों के एक ही सेट को अपनाएं।
यदि एप्लिकेशन कनेक्शन स्वीकार नहीं करता है, तो इसका कारण हो सकता है starlette.websockets.WebSocketDisconnect ...
websocket_connect() संदर्भ प्रबंधक के रूप में उपयोग किया जाना चाहिए with ब्लॉक में)।
!!! ध्यान params पैरामीटर प्रभावित नहीं होते हैं websocket_connect समर्थन। यदि आपको क्वेरी मापदंडों को पास करने की आवश्यकता है, तो कृपया सीधे में हार्डकोडिंग करें।
```python
with client.websocket_connect('/path?foo=bar') as websocket:
...
```
डेटा भेजें
.send_text(data)- दिए गए पाठ को एप्लिकेशन को भेजें।.send_bytes(data)- दिए गए बाइट्स को एप्लिकेशन को भेजें।.send_json(data, mode="text")- दिए गए डेटा को एप्लिकेशन को भेजें। उपयोगmode="binary"JSको बाइनरी डेटा फ्रेम के माध्यम से भेजा जाता है।
डेटा प्राप्त करें
.receive_text()एप्लिकेशन द्वारा भेजे गए आने वाले पाठ की प्रतीक्षा करें और इसे वापस करें।.receive_bytes()- एप्लिकेशन द्वारा भेजे गए इनकमिंग बाइट स्ट्रिंग की प्रतीक्षा करें और इसे वापस करें।.receive_json(mode="text")- एप्लिकेशन द्वारा भेजे गए आने वाले json डेटा की प्रतीक्षा करें और वापस लौटें। उपयोगmode="binary"बाइनरी डेटा फ्रेम के माध्यम से JSप्राप्त करें।
पाठ "उठा सकता है starlette.websockets.WebSocketDisconnect । "यह पारंपरिक शब्दार्थ अभिव्यक्ति के अनुरूप नहीं लगता है, जिससे सटीक चीनी अनुवाद करना मुश्किल हो जाता है। यदि आपके पास अधिक प्रासंगिक जानकारी है या पाठ सामग्री की सटीकता की पुष्टि करते हैं, तो मैं आपको प्रदान करने की पूरी कोशिश करूंगा। अधिक संतोषजनक अनुवाद। वर्तमान में, शाब्दिक अनुवाद के अनुसार, इसका केवल अनुवाद किया जा सकता है: "सुधार हो सकता है starlette.websockets.WebSocketDisconnect "लेकिन यह अनुवाद व्यावहारिक नहीं हो सकता है।
कनेक्शन बंद करें
.close(code=1000)- कनेक्शन पर क्लाइंट साइड क्लोज संक्रिया करें।
अतुल्यकालिक परीक्षण
कभी-कभी आप अपने एप्लिकेशन के बाहर अतुल्यकालिक संचालन करना चाहते हैं। उदाहरण के लिए, आप अपने मौजूदा अतुल्यकालिक डेटाबेस क्लाइंट साइड / इन्फ्रास्ट्रक्चर का उपयोग करके अपने एप्लिकेशन को लागू करने के बाद अपने डेटाबेस की स्थिति की जांच करना चाह सकते हैं।
इन मामलों के लिए,TestClient का उपयोग करना मुश्किल है क्योंकि यह अपना स्वयं का इवेंट लूप बनाता है, और अतुल्यकालिक संसाधन, जैसे डेटाबेस कनेक्शन, अक्सर इवेंट लूप के बीच साझा नहीं किए जाते हैं।
इस समस्या को हल करने का सबसे आसान तरीका अपने पूरे परीक्षण को अतुल्यकालिक बनाना है और Httpx जैसे अतुल्यकालिक ग्राहक पक्ष का उपयोग करना है। AsyncClient।
यहाँ इस तरह के परीक्षण का एक उदाहरण है:
htpx से Acआयात
te.से आयात
स्टारलेट से। रूटिंग आयात मार्ग
स्टारलेट से। अनुरोध आयात अनुरोध
से te.आयात T
डेफ नरकo (request: Request) - > प्लेनटेक्स्टरिस्पांस:
प्लेनटेक्स्ट रिस्पांस लौटाता है ("Hello World!")
ऐप = स्टारलेट (मार्ग = [मार्ग) ("/", hello) ])
# यदि आप pyका उपयोग कर रहे हैं, तो आपको एक async मार्कर जोड़ना होगा:
#@pytest.mark.anyio # https://github.com/agronholm/anyio
# या pytest-asynci स्थापित और कॉन्फ़िगर करेंo (https://github.com/pytest-dev/pytest-asyncio)
Ac def test_app () -> कोई नहीं:
# नोट: आप _चाहिए_ सेट करें `base_url` काम करने के लिए "/" जैसे सापेक्ष urls के लिए
क्लाइंट के रूप में Acent (app=app, base_url="http: // testserver") के साथ Async:
आर = ग्राहक का इंतजार करें। ("/")
आर का आरोप लगाएं। status_code == 200
r.= "हैलो वर्ल्ड!"