Ich habe mich gefragt, ob Unittest oder Pytest ausreichen würden, aber ich habe mich entschlossen, Tornados Test-Framework zu testen. Ich fand, dass es hilfreich wäre, Tornado HTTPServer im Testskript zu starten und es Tornado Mock Server zu nennen oder es auszuführen und zu testen, also entschied ich mich, es sofort zu implementieren und zu testen. .. Ich habe mich damals entschlossen, den Beispielcode als Memorandum zusammenzufassen. Da ich diesmal die 2.4-Serie ausprobiert habe, sind die Informationen möglicherweise etwas alt, aber die Grundlagen sollten sich nicht ändern.
test_tornadoweb.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#Importieren Sie die erforderlichen Module
import tornado.testing
import tornado.web
import mock
import urllib
from tornado.httpclient import HTTPRequest
#Hilfsfunktion
def urlencode_request_params(**params):
return urllib.urlencode(
dict(
[k, v.encode("utf-8") if isinstance(v, unicode) else v]
for k, v in params.items()
)
)
def prepare_kwargs(**params):
kwargs = dict(
body=urlencode_request_params(**params),
)
return kwargs
#Beispielhandler
class ProfileHandler(tornado.web.RequestHandler):
"""Um zu versuchen, Methode zu bekommen
"""
def get(self):
user_id = self.get_argument("user_id")
if user_id != "tornadoweb":
raise tornado.web.HTTPError(404)
self.finish("ok")
class AccountHandler(tornado.web.RequestHandler):
"""tornado.web.Tests bei Verwendung authentifizierter Dekorateure
Dinge die zu tun sind
"""
@tornado.web.authenticated
def get(self):
self.finish("I'm " + self.current_user)
@tornado.web.authenticated
def post(self):
bio = self.get_argument("bio")
self.finish("{error:0, msg:{bio:%s}}" % bio)
class TestSample(tornado.testing.AsyncHTTPTestCase):
"""Erben Sie AsyncHTTPTestCase und starten Sie den HTTP-Server
"""
def setUp(self):
"""Finden Sie einen freien Hafen in der Superklasse bekommen_Registriert in App
Tornado mit Handler als Anwendung starten
self.http_Kunde ist vorbereitet und selbst.http_client.fetch()
Kann auch benutzt werden
"""
super(TestSample, self).setUp()
def get_httpserver_options(self):
"""Sie können beim Starten des HTTP-Servers auch Optionen angeben
"""
return {}
def get_app(self):
"""Legen Sie das Routing des Handlers der Anwendung fest.
Wenn Sie Anwendungseinstellungen haben, können Sie diese hier angeben.
"""
application_settings = dict()
return tornado.web.Application([
("/profile", ProfileHandler),
("/account", AccountHandler),
("/account/update", AccountHandler),
], **application_settings)
def test_httprequest_sample(self):
"""Sie können eine Anfrage auch direkt über HTTPRequest stellen, also einen Test
"""
kwargs = dict()
test_url = 'http://snapdish.co'
request = HTTPRequest(test_url, **kwargs)
self.http_client.fetch(request, self.stop, **kwargs)
response = self.wait()
self.assertEqual(response.code, 200)
def test_profile(self):
"""Testen Sie, ob Sie das Profil normal erhalten können
"""
kwargs = dict(
user_id="tornadoweb"
)
path = "%s?%s" % ("/profile", urlencode_request_params(**kwargs))
response = self.fetch(path)
self.assertEqual(response.code, 200)
self.assertEqual(response.body, "ok")
def test_profile_404(self):
"""Testen Sie, ob die Profilanforderung 404 zurückgibt, wenn sie falsch ist
"""
kwargs = dict(
user_id="tornadoweb?"
)
path = "%s?%s" % ("/profile", urlencode_request_params(**kwargs))
response = self.fetch(path)
self.assertEqual(response.code, 404)
def test_account(self):
"""Wenn ein authentifizierter Dekorateur verwendet wird, verwenden Sie mock
current_Benutzer muss geändert werden"""
with mock.patch.object(AccountHandler, 'get_current_user') as m:
m.return_value = "tornadoweb"
path = "/account"
response = self.fetch(path)
self.assertEqual(response.code, 200)
self.assertEqual(response.body, "I'm tornadoweb")
def test_account_update(self):
"""Wenn ein authentifizierter Dekorateur verwendet wird, verwenden Sie mock
current_Benutzer muss geändert werden"""
with mock.patch.object(AccountHandler, 'get_current_user') as m:
m.return_value = "tornadoweb"
bio = "tornadoweb bio"
params = dict(bio=bio)
response = self.fetch("/account/update",
method="POST",
follow_redirects=False,
body=urlencode_request_params(**params))
self.assertEqual(response.code, 200)
self.assertEqual(response.body, "{error:0, msg:{bio:%s}}" % bio)
setUp() Es funktioniert, indem nach einem freien Port gesucht, http_client vorbereitet, ein Anwendungshandler festgelegt und Tornado HTTP Server gestartet wird. get_app() Es wird auf der Seite der Unterklasse implementiert und gibt den zu testenden Handler und seinen Pfad an. Sie können die Anwendung auch hier einrichten. Geben Sie template_path usw. an. fetch(path, **kwargs)
self.http_client.Selbst in Fetch Wrapper.get_url(path)Ich mache. selbst.get_url(path)Verwendet den als Argument übergebenen Pfad, um eine URL zu dem in diesem Test gestarteten HTTPServer zu generieren und die Anforderung auszuführen. Wenn Sie eine komplizierte Anfrage stellen möchten, selbst.http_client.fetch(request, self.stop, **kwargs)Anfragen direkt mit bearbeiten. Zu diesem Zeitpunkt ist die Antwort selbst.wait()Um sich daran zu gewöhnen.
## tornado.web.authenticated Dekorateure werden nicht unterstützt
Es scheint, dass es keine andere Wahl gibt, als mit Schein- oder Cheat-Cookies zu betrügen. Sie können auch HTTPRequest verwenden, sodass Sie je nach Implementierung verschiedene Aktionen ausführen können.
## Befehlszeilenausführung
Geben Sie den Modulnamen (Dateinamen) wie folgt an und führen Sie ihn aus.
```bash
$ python -m tornado.test.runtests test_tornadoweb
https://github.com/tornadoweb/tornado/tree/master/tornado/test http://www.tornadoweb.org/en/branch2.4/testing.html
Recommended Posts