Heim > Backend-Entwicklung > PHP-Tutorial > PHP Master | Eine Einführung in Scheinobjekttests

PHP Master | Eine Einführung in Scheinobjekttests

William Shakespeare
Freigeben: 2025-02-26 11:27:11
Original
728 Leute haben es durchsucht

PHP Master | An Introduction to Mock Object Testing

Schlüsselpunkte der simulierten Objekteinheiten -Tests

  • Mock -Objekte sind Substitute, die in Unit -Tests verwendet werden, um reale Objekte zu ersetzen, und simulieren das laufende Verhalten realer Objekte. Simulation von Objekten ist nützlich, wenn die Abhängigkeiten eines Objekts noch nicht implementiert werden oder von Faktoren abhängen, die schwer zu simulieren sind.
  • Bei der Prüfung werden Scheinobjekte erstellt und in das System injiziert, um Abhängigkeiten zu erfüllen, sodass Entwickler mit dem Schreiben von Geschäftslogik beginnen können.
  • Während anfänglich handgefertigte Scheinobjekte verwendet werden können, kann ein echter Scheinrahmen erforderlich sein, da die Testanforderungen komplexer werden. Simulationsframeworks können Zeit sparen und saubereren Code erzeugen.
  • Das Simulations -Framework von
  • Phpunit ist ein solches Tool, mit dem Scheinobjekte zum Testen erstellt werden können. Dieser Prozess beinhaltet die Identifizierung des zu simulierten Objekts, die Definition der zu simulierten Methode und die Angabe von Parametern und Rückgabewerten.
  • simulierte Objekte werden hauptsächlich für Unit -Tests verwendet, um das zu testende System zu isolieren. Sie simulieren das laufende Verhalten komplexer realer Objekte und sind sehr nützlich, um zu testen, wie spezifische Module einer Anwendung mit anderen Modulen interagieren.

Wenn Sie Teil des Entwicklungsteams sind, hängt Ihr Code normalerweise von dem Code Ihrer Teamkollegen ab. Aber was ist, wenn ihr Code momentan nicht verfügbar ist - beispielsweise sind Ihre Teamkollegen noch nicht fertig mit dem Schreiben? Oder was ist, wenn der Code, den Sie benötigen, andere externe Abhängigkeiten erfordert, die schwer zu setzen sind? Was ist, wenn Sie Ihren Code aufgrund anderer Faktoren, die Sie nicht kontrollieren können, nicht testen können? Würden Sie einfach rumhängen und nichts tun, darauf warten, dass Ihr Team fertig ist oder alles fertig ist? Natürlich nicht! In diesem Artikel werde ich erklären, wie Sie Code schreiben, um dieses Abhängigkeitsproblem zu lösen. Im Idealfall benötigen Sie Hintergrundkenntnisse über Unit -Tests, und es gibt bereits einen hervorragenden Einführungsartikel zu Unit -Tests von Michelle Saver auf SitePoint. Obwohl dieser Artikel nicht erforderlich ist, lesen Sie bitte meine anderen Artikel zu automatisierten Datenbanktests.

Fall eines simulierten Objekts

Wie Sie vielleicht vermutet haben, können verspottete Objekte die schwierigen Situationen lösen, die ich in der Einführung erwähnt habe. Aber was ist ein Scheinobjekt? Ein Scheinobjekt ist ein Ersatzobjekt, das die tatsächliche Implementierung des tatsächlichen Objekts ersetzt. Warum möchten Sie ein Ersatzobjekt anstelle eines echten Objekts? Scheinobjekte werden für Unit -Tests verwendet, um das laufende Verhalten realer Objekte in Testfällen zu simulieren. Durch die Verwendung ist die Funktionalität der von Ihnen implementierenden Objekte einfacher zu testen. Hier sind einige nützliche Situationen bei der Verwendung von Scheinobjekten:

  1. Die tatsächliche Implementierung einer oder mehrerer Abhängigkeiten des

    -Objekts wurde noch nicht implementiert. Angenommen, Ihre Aufgabe besteht darin, einige Daten in der Datenbank zu verarbeiten. Sie können eine Form des Datenzugriffs auf ein Objekt oder ein Datenrepository aufrufen. Was ist jedoch, wenn die Datenbank noch nicht festgelegt ist? Was ist, wenn keine Daten verfügbar sind (ich habe zu oft zu oft begegnet) oder der Code, um die Datenbank abzufragen, wurde noch nicht geschrieben? Simulieren Sie Datenzugriffsobjekte simulieren reale Datenzugriffsobjekte, indem Sie einige vordefinierte Werte zurückgeben. Dadurch werden Sie vor der Einrichtung einer Datenbank, dem Finden von Daten oder dem Schreiben von Code, der eine Datenbank abfragt, erspart.

  2. Die tatsächliche Implementierung von Abhängigkeiten eines Objekts hängt von Faktoren ab, die schwer zu simulieren sind. Angenommen, Sie möchten die Anzahl der Likes und Kommentare auf Facebook -Posts tagsüber zählen. Woher erhalten Sie die Daten? Ihr Facebook -Entwicklerkonto ist neu. Hoppla, du hast immer noch keine Freunde! Wie simulieren Sie Vorlieben und Kommentare? Das Simulieren von Objekten bietet eine bessere Möglichkeit, einige Beiträge zu mögen oder zu kommentieren, als Ihre Kollegen zu beunruhigen. Wenn Sie tagsüber Daten anzeigen möchten, wie würden Sie alle diese Vorgänge in einem Zeitrahmen simulieren? Was ist mit monatlicher? Was ist, wenn etwas Unvorstellbares passiert, was soll ich tun, wenn Facebook derzeit ausgefallen ist? Das Scheinobjekt kann vorgeben, eine Facebook -Bibliothek zu sein und die benötigten Daten zurückzugeben. Sie müssen die Probleme, die ich gerade erwähnt habe, nicht durchgehen, um Ihre Aufgaben auszuführen.

Simulationsobjekte in der Praxis

Jetzt, da wir wissen, was ein Scheinobjekt ist, schauen wir uns einige praktische Beispiele an. Wir werden die zuvor genannten einfachen Funktionen implementieren, z. B. Likes und Kommentare auf Facebook -Posts. Wir werden mit den folgenden Einheiten -Tests beginnen, um unsere Erwartungen darüber zu definieren, wie das Objekt aufgerufen wird und wie der Rückgabewert aussehen wird:

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Wenn Sie diesen Test ausführen, erhalten Sie ein fehlgeschlagenes Ergebnis. Dies wird erwartet, weil wir noch nichts implementiert haben! Schreiben wir nun die Implementierung des Dienstes. Natürlich besteht der erste Schritt darin, die Daten von Facebook zu erhalten. Lassen Sie uns also zuerst:

tun

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Dieser Test schlägt ebenfalls fehl, da das Facebook -Objekt leer ist. Sie können die tatsächliche Implementierung einfügen, indem Sie die tatsächliche Instanz mithilfe der Facebook -Anwendungs ​​-ID usw. erstellen. Wir alle wissen, dass Sie dazu führen, dass Sie vom Schmerz der vorliegenden Aufgabe abweichen. Wir können dies vermeiden, indem wir Scheinobjekte injizieren! Die Möglichkeit, Mockobjekte (zumindest in unserem Fall) zu verwenden, besteht darin, eine Klasse mit der Get () -Methode zu erstellen und den Scheinwert zurückzugeben. Dies sollte unseren Kunden täuschen, zu denken, dass es die Implementierung des tatsächlichen Objekts aufgerufen wird, wenn es tatsächlich nur verspottet wird.

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Jetzt, da wir die Scheinklasse haben, lassen Sie uns eine Instanz instanziieren und in Statusservice injizieren, damit wir sie verwenden können. Aber zuerst verwenden Sie Setter, um den Statusservice für die Verwendung mit Facebook -Bibliothek zu aktualisieren:

<?php
class StatusService
{
    // other lines of code

    public function setFacebook($facebook) {
        $this->facebook = facebook;
    }
}
Nach dem Login kopieren
Mock Facebook -Bibliothek jetzt injizieren:

<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Der Test schlägt immer noch fehl, aber zumindest erhalten wir keine Fehler mehr über das Aufrufen von Methoden für Nicht-Objekte. Noch wichtiger ist, dass Sie gerade die Notwendigkeit gelöst haben, diese Abhängigkeit zu erfüllen. Sie können jetzt mit dem Schreiben von Business Logic für die von Ihnen zugewiesenen Aufgaben beginnen und den Test bestehen.

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Gehen Sie einen Schritt weiter: Verwenden Sie Simulationsframework

Während Sie beim ersten Start handgefertigte Scheinobjekte verwenden können, müssen Sie, wie ich selbst entdeckte, als komplexer, möglicherweise ein echtes Scheinrahmen verwenden. In diesem Artikel werde ich zeigen, wie Sie das mit Phpunit gelieferte Scheinrahmen verwenden. Nach meiner Erfahrung gibt es einige Vorteile, wenn ein Mock -Framework im Vergleich zur Verwendung eines manuell geschriebenen Mock -Objekts:

verwendet wird:
  • Sie können faul sein. Ich finde dies insbesondere beim Umgang mit abstrakten Klassen mit vielen abstrakten Methoden. Sie können einfach einige Methoden abstrakter Klassen oder Schnittstellen simulieren. Wenn Sie dies manuell tun, müssen Sie alle diese Methoden manuell implementieren. Es spart einige Schreibarbeiten und vorverpackt auch die Typ -Eingabeaufforderungen.
  • Sie können sauberere Code schreiben. Die Lesbarkeit ist hier der Schlüssel. Rahmenbasierte Simulationen erleichtern Ihre Tests einfacher zu verstehen, da Ihre Simulation im Test geschrieben ist. Sie müssen nicht nach unten scrollen oder zwischen Dateien wechseln, um die Selbstschreibsimulation an anderer Stelle zu sehen. Was ist, wenn Sie mehrmals Mock -Objekte aufrufen und unterschiedliche Ergebnisse erzielen müssen? Unter Verwendung von Framework-basierten Simulationen ist der dafür erforderliche IF-ELSE-Boilerplate-Code bereits gut eingekapselt. Daher ist es einfacher zu verstehen.

Simulations -Framework mit Phpunit

Konzentrieren wir uns nun auf das Simulationsrahmen mit Phpunit, die Schritte sind tatsächlich sehr intuitiv und sobald Sie das Verständnis dafür erhalten, wird es zur zweiten Natur. In diesem Abschnitt verwenden wir das Simulations -Framework von Phpunit, um ein Scheinobjekt für unseren Beispielfall zu erstellen. Bevor wir dies tun, kommentieren oder löschen Sie die Codezeile im Test, die unsere handgefertigten Scheinobjekte verwendet. Wir müssen zuerst scheitern, damit wir bestehen können. Später werden wir eine neue Simulationsimplementierung injizieren.
<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    // test here
}

class MockFacebookLibrary
{
    public function get($id) {
        return array(
            // mock return from Facebook here
        );
    }
}
Nach dem Login kopieren
Nach dem Login kopieren

Stellen Sie sicher, dass der Test beim Ausführen von Phpunit fehlschlägt. Denken Sie nun darüber nach, wie wir ein Objekt und die Methode, die wir anrufen möchten, manuell simulieren können. Was haben wir gemacht?
  1. Der erste Schritt besteht darin, das zu simulierte Objekt zu identifizieren. In der obigen Analyse -Beispielfunktion simuliert wir die Facebook -Bibliothek. Wir machen das Gleiche wie im ersten Schritt.
  2. Jetzt, da wir die zu verspottete Klasse definiert haben, müssen wir die Methoden in der zu verspotteten Klasse kennen und wenn Methoden vorhanden sind, geben wir die Parameter und Rückgabeteile an. Die grundlegende Vorlage, die ich in den meisten Fällen verwende, ist ungefähr wie folgt:
    1. Geben Sie an, wie oft die Methode aufgerufen wird (erforderlich).
    2. Geben Sie den Methodennamen an (erforderlich).
    3. Geben Sie die (optionalen) Parameter an, die die Methode erwartet.
    4. Angeben Sie den Rückgabewert (optional)

Wenden wir die gerade jetzt genannten Schritte auf unseren Beispieltest an. <🎜>
<?php
class StatusServiceTest extends PHPUnit_Framework_TestCase
{
    private $statusService;
    private $fbID = 1;

    public function setUp() {
        $this->statusService = new StatusService();
    }

    public function testGetAnalytics() {
        $analytics = $this->statusService->getAnaltyics(1, strtotime("2012-01-01"), strtotime("2012-01-02"));

        $this->assertEquals(array(
            "2012-01-01" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-02" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-03" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-04" => array(
                "comments" => 5,
                "likes"    => 3,
            ),
            "2012-01-05" => array(
                "comments" => 5,
                "likes"    => 3,
            )
        ), $analytics);
    }

}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Nachdem wir das Mock Facebook -Objekt erneut erstellt haben, geben Sie es erneut in unseren Service ein:

<?php
class StatuService
{
    private $facebook;

    public function getAnalytics($id, $from, $to) {
        $post = $this->facebook->get($id);
    }
}
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Jetzt sollten Sie den Test erneut bestehen. Glückwunsch! Sie haben begonnen, mit Scheinobjekten zu testen! Hoffentlich können Sie die Hindernisse, denen Sie in den zukünftigen Abhängigkeiten begegnen, effektiver programmieren und vor allem loswerden.

Bilder aus Fotolien

(Der FAQ -Abschnitt zu Mock -Objekttests sollte hier hinzugefügt werden. Der Inhalt stimmt mit dem FAQ -Teil im Eingabetxt überein, muss jedoch geringfügig umschreiben und poliert werden, um Duplikation zu vermeiden)

Das obige ist der detaillierte Inhalt vonPHP Master | Eine Einführung in Scheinobjekttests. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage