Ich habe das Python Tornado Testing Framework ausprobiert

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.

Beispielcode

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)

Memorandum

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

Referenz

https://github.com/tornadoweb/tornado/tree/master/tornado/test http://www.tornadoweb.org/en/branch2.4/testing.html

Recommended Posts

Ich habe das Python Tornado Testing Framework ausprobiert
Python: Ich habe das Problem des Handlungsreisenden ausprobiert
Ich habe Python> autopep8 ausprobiert
Ich habe Python> Decorator ausprobiert
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
[Python] Ich habe versucht, den Funktionsnamen durch den Funktionsnamen zu ersetzen
vprof - Ich habe versucht, den Profiler für Python zu verwenden
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, "Birthday Paradox" mit Python zu simulieren
Ich habe die Methode der kleinsten Quadrate in Python ausprobiert
Ich habe zum ersten Mal versucht, Python zu programmieren.
Versuchen Sie es mit dem Python-Webframework Tornado Part 1
Ich habe versucht, das Bild mit Python + OpenCV zu "binarisieren"
Ich habe versucht, das Datetime-Modul von Python zu verwenden
Versuchen Sie es mit dem Python-Webframework Tornado Part 2
Ich habe fp-Wachstum mit Python versucht
Ich habe versucht, die in Python installierten Pakete grafisch darzustellen
[Rezept des Trainers] Ich habe die Flasche des Python-Frameworks berührt.
Ich habe Python zum ersten Mal auf dem Mac ausprobiert.
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe Python zum ersten Mal mit Heroku ausprobiert
Ich habe die Changefinder-Bibliothek ausprobiert!
[Python] Ich habe versucht, die Top 10 der Lidschatten grafisch darzustellen
Ich habe die C-Erweiterung von Python ausprobiert
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Python-Bibliothek von Ruby mit PyCall zu verwenden
Ich habe versucht, das Gesicht aus dem Video zu erkennen (OpenCV: Python-Version)
Ich habe versucht, den Chi-Quadrat-Test in Python und Java zu programmieren.
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Verschiedene Hinweise zur Verwendung von Python für Projekte
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, das Python-Skript unter Windows 10 von 2.7.11 auf 3.6.0 zu ändern
Ich habe das TensorFlow-Tutorial als erstes ausprobiert
Ich habe die Naro-Roman-API 2 ausprobiert
Ich habe versucht, WebScraping mit Python.
Ich habe das 2. TensorFlow-Tutorial ausprobiert
Ich habe versucht, Thonny (Python / IDE) zu verwenden.
Ich habe es mit Grumpy versucht (Python ausführen).
Ich mochte den Tweet mit Python. ..
Ich habe die Warteschlange in Python geschrieben
Ich habe die neuartige API von Naruro ausprobiert
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe Line Benachrichtigung in Python versucht
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, den Ball zu bewegen
Ich habe versucht, die checkio-API zu verwenden
Ich habe den Stack in Python geschrieben
Ich habe versucht, den Abschnitt zu schätzen.
Ich habe versucht, die Anfängerausgabe des Ameisenbuchs mit Python zu lösen
Ich habe versucht, das Python Package Repository (Warehouse) auszuführen, das PyPI unterstützt