2017-09-03 2 views
3

Ich habe einige Methoden in einer Serviceklasse erstellt, um über Guzzle mit API POST Request eine Verbindung zu einem externen Service/Provider herzustellen.phpunit - gefälschte API-Antwort oder echte Antwort Verbindung zum Dienst?

Ich verwende gerne phpunit zum Testen - sollte ich die HTTP JSON-Antwort fälschen, ohne eine Verbindung zu einem Dienst herzustellen, oder sollte sie eine Verbindung zu einem Dienst herstellen, um eine echte Antwort vom Dienst zu erhalten?

+0

Wenn Sie den Dienst verwerfen, können Sie eine Vielzahl von Antworten zurückgeben, insbesondere solche, die schwer zu testen sind (z. B. Fehler). –

+0

@NigelRen Sie sollten mit mehr Details beantworten und wie man den Dienst spotten –

+0

Wenn Sie etwas Code hatten, kann es helfen, weiß nicht, was ich antworten soll. Versuchen Sie, http://guzzle3.readthedocs.io/testing/unit-testing.html durchzusehen. –

Antwort

2

Eine allgemeine Lehre in der Prüfung ist "Spotten Sie nicht, was Sie nicht besitzen". Verspotten diese API-Aufrufe macht Ihre Tests weniger zuverlässig und geben Ihnen ein falsches Gefühl der Sicherheit, wie Sie wahrscheinlich bekommen werden false positive.

Zum Beispiel, wenn die API unerwartet eine brechende Änderung einführt, werden Ihre Tests grün und sobald Sie die Produktion bereitstellen, werden Sie endlich feststellen, dass etwas nicht stimmt. Dies ist wahrscheinlich, was Sie wollen Ihre Tests zu fangen.

Wenn Sie gegen die echte API testen, erhalten Sie ein Gefühl der Zuverlässigkeit. Scheitern Ihre Tests häufig aufgrund von Serviceausfällen oder Timeouts? Wenn dies der Fall ist, können Sie Maßnahmen wie einen Wiederholungsmechanismus, Schutzschalter oder das Entkoppeln der API-Aufrufe vom Rest Ihrer Anwendung einführen.

Wenn Sie die API verspotten, können Sie nur feststellen, dass sich Ihr Code gemäß einer (möglicherweise veralteten) Spezifikation des Dienstes verhält. Das ist in Ordnung, aber nicht annähernd so nützlich wie sich auf den eigentlichen Dienst zu verlassen.

Sie könnten Gruppen verwenden, um diese Tests separat auszuführen. Dies wird es Ihnen erleichtern, diese möglicherweise langsamen und manchmal flockigen Tests von Ihren verbleibenden Tests ein- oder auszuschließen. Dies hilft auch bei der Ratenbegrenzung, z. indem Sie nur diese Tests auf kritischen Zweigen ausführen.

+0

Sie haben einen sehr guten Punkt zum Test gegen die echte API gemacht. Während der Produktion - Gibt es eine Möglichkeit, jede x Stunde automatisch einen Test durchzuführen - das garantiert mir, dass der echte API-Service noch funktioniert? –

+1

Ja, ich kenne Orte, an denen Tests in Intervallen durchgeführt werden, zusätzlich zum Branchentest. Sie müssen nur vorsichtig sein, die Daten irgendwie zu markieren, um sie von echten Daten unterscheiden zu können, besonders wenn Sie E-Commerce betreiben. Sie können z. B. mit Jenkins geplante Jobs einrichten und dann in der Anfrage einen speziellen X-TEST-Header verwenden, der von Ihrer Anwendung erkannt wird. – dbrumann

+1

Sie können dies auch mit Cron-Jobs tun, die die Testsuite ausführen, wenn Ihr CI/CD-Server geplante Jobs nicht problemlos unterstützt. Wenn Sie dies tun, seien Sie vorsichtig, z. mit Operationen, die den Datenbankstatus ändern (oder schlechter die Datenbank bereinigen). Ich empfehle eine separate Test-Suite, um das Risiko schädlicher Nebenwirkungen zu reduzieren. – dbrumann

Verwandte Themen