Code testen, der twisted.web.client.getPage() verwendet
Hallo, ich schreibe eben an einer Test-Suite für alten Code, der twisted.web.client.getPage() verwendet. Ich dachte erst, dass ich die Testdaten liefern kann, indem ich einen "file:"-URL angebe. Aber weit gefehlt: twisted.web.client.getPage() kann nur mit http(s)-URLs umgehen. Wi kann ich diesen Code testen, ohne einen Mini-Webserver zu erstellen? (Den möchte ich schon deshalb nicht, weil dann die Test-Suite ein funktionierendes Netzwerk ohne Host-Firewall voraussetzt.) -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Information Security Management, Security Governance, Secure Software Development Goebel Consult, Landshut http://www.goebel-consult.de Blog: http://www.goebel-consult.de/blog/sag-nein-zum-routerzwang Kolumne: http://www.cissp-gefluester.de/2010-08-scheingefechte-um-rim Goebel Consult ist Mitglied bei http://www.7-it.de/
Hi Hartmut,
für die Unittests würde ich mit Hilfe von mock (https://pypi.python.org/pypi/mock, ab Python 3.3 im Standard) die Funktion twisted.web.client.getPage patchen und - wenn nötig - per side_effect Strings zurückgeben.
Wenn Netzwerkkommunikation auf localhost möglich ist, könntest Du für die Funktions- / Integrationstests statische Seiten mit 'python -m SimpleHTTPServer PORT‘ aus dem lokalen Dateisystem zum Testen liefern.
hth
Karsten
Am 2014-06-29 um 23:29 schrieb Hartmut Goebel
Hallo,
ich schreibe eben an einer Test-Suite für alten Code, der twisted.web.client.getPage() verwendet. Ich dachte erst, dass ich die Testdaten liefern kann, indem ich einen "file:"-URL angebe. Aber weit gefehlt: twisted.web.client.getPage() kann nur mit http(s)-URLs umgehen.
Wi kann ich diesen Code testen, ohne einen Mini-Webserver zu erstellen? (Den möchte ich schon deshalb nicht, weil dann die Test-Suite ein funktionierendes Netzwerk ohne Host-Firewall voraussetzt.)
-- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Information Security Management, Security Governance, Secure Software Development Goebel Consult, Landshut http://www.goebel-consult.de
Blog: http://www.goebel-consult.de/blog/sag-nein-zum-routerzwang Kolumne: http://www.cissp-gefluester.de/2010-08-scheingefechte-um-rim
Goebel Consult ist Mitglied bei http://www.7-it.de/
_______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de
Am 30.06.2014 07:05, schrieb Karsten Schulz:
für die Unittests würde ich mit Hilfe von mock (https://pypi.python.org/pypi/mock, ab Python 3.3 im Standard) die Funktion twisted.web.client.getPage patchen und - wenn nötig - per side_effect Strings zurückgeben.
Herzlichen dank für den Tipp (auch an Stefan). Ich hatte schon Code-Beispiele gesehen, die mock benutzen, aber nicht gewusst, dass das in die Std-Lib geht – darum wollte ich es vermeiden. Aber damit geht das super einfach. Ich verwende mock.patch als Context-Manager. Hier ein Beispiel und unten die Funktionen, die ich dafür verwende. (Mögen sie andern nützlich sein.) class TextInvalidDescriptionXML(DescriptionNotFound): """ Same as DescriptionNotFound, except now we pass a description which is invalid XML. Results should be the same, except for scpdXML. """ def setUp(self): with mock.patch('coherence.upnp.core.utils.getPage', fakeGetPage('<x>')): self.setUp_main() def raiseError(url): "Behaves as if the file was not read." def _raiseError(*args): raise Exception('Meaningless Error') d = Deferred() d.addCallback(_raiseError) return d def fakeGetPage(content): def returnEmptyPage(url): "Behaves as if the file contains `content`." d = Deferred() d.callback((content, {})) return d return returnEmptyPage Und für die ursprüngliche Frage, damit einen extra-simplen "Web-Server" zu implementieren: def fakeGetPageURL(url): """ Returns the content of the file with the name taken from the final component of a url-path. Example: http://1.2.3.4/a/b/c/some.xml -> <module-dir>/some.xml """ path = urlparse.urlparse(url).path path = posixpath.normpath(path) words = path.split('/') file = FilePath(os.path.join(FILE_BASE, words[-1])) d = Deferred() d.callback((file.open().read(), {})) return d -- Schönen Gruß Hartmut Goebel Dipl.-Informatiker (univ), CISSP, CSSLP Information Security Management, Security Governance, Secure Software Development Goebel Consult, Landshut http://www.goebel-consult.de Blog: http://www.goebel-consult.de/blog/kritik-an-change.org-datensammler Kolumne: http://www.cissp-gefluester.de/2010-07-passwoerter-lieben-lernen Goebel Consult ist Mitglied bei http://www.7-it.de/
Hi Hartmut, On 2014-06-29 23:29, Hartmut Goebel wrote:
ich schreibe eben an einer Test-Suite für alten Code, der twisted.web.client.getPage() verwendet. Ich dachte erst, dass ich die Testdaten liefern kann, indem ich einen "file:"-URL angebe. Aber weit gefehlt: twisted.web.client.getPage() kann nur mit http(s)-URLs umgehen.
Wi kann ich diesen Code testen, ohne einen Mini-Webserver zu erstellen? (Den möchte ich schon deshalb nicht, weil dann die Test-Suite ein funktionierendes Netzwerk ohne Host-Firewall voraussetzt.)
was mir spontan einfällt, wäre, `twisted.web.client.getPage` per Monkey-Patching für die Dauer des Tests durch eine für dich passende Funktion zu ersetzen. Das kannst du mit `mock.patch` (wenn du das verwenden kannst/willst) oder "zu Fuß" mit `try`/`finally` machen. Die Funktion muss nur einen Deferred zurückliefern, der je nach Test von `twisted.internet.defer.Deferred`, `twisted.internet.defer.succeed` oder gegebenenfalls `twisted.internet.defer.fail` kommen könnte. Viele Grüße Stefan
participants (3)
-
Hartmut Goebel
-
Karsten Schulz
-
Stefan Schwarzer