4 Stimmen

Wie man einen E-Mail-Client testet

Ich arbeite gerade an einem Desktop-E-Mail-Client, und ich möchte mein Backend einem Unit-Test unterziehen. Allerdings sehe ich keine Möglichkeit, das zu schaffen. Damit mein Code funktioniert, muss er sich mit einem funktionierenden Mailserver verbinden. Solange ich meine Unit-Tests nicht mit einem E-Mail-Konto verknüpfe und sicherstelle, dass das Konto dem Zustand entspricht, den meine Tests erwarten, sehe ich nicht, wie ich das bewerkstelligen kann.

Hat jemand eine Idee, wie man diese Art von Anwendung testen kann, wenn sie von externen Faktoren abhängt?

EDITAR:

Um einige Details hinzuzufügen: Ich arbeite an einer höheren C++-Mail-Client-Bibliothek für meine Anwendung, die libEtPan, eine C-Bibliothek, verwendet, um die Details der Verbindung mit dem Mail-Server und die Interaktion mit ihm zu behandeln.

7voto

Brian Agnew Punkte 260470

Ich würde Nachahmung den E-Mail-Server, und konfigurieren Sie das nachgebildete Objekt so, dass es E-Mails akzeptiert oder ablehnt (je nach Ihren Tests).

Um dies effektiv zu tun, benötigen Sie eine Schnittstelle, über die Sie mit Ihrem E-Mail-Server kommunizieren können. Zum Testen ist die Implementierung ein Mocking-Objekt. Für die Bereitstellung ersetzen Sie dieses durch eine Implementierung, die direkt mit einem E-Mail-Server kommuniziert.

Siehe dies SO Frage für C++ Mocking-Frameworks.

2voto

Michael Lloyd Lee mlk Punkte 14425

Ich gehe zu annehmen Wenn Sie das Backend testen, beziehen Sie sich auf den Teil des Codes, der tatsächlich mit dem E-Mail-Server kommuniziert, und um den Rest Ihrer Software zu testen, müssen Sie verhöhnt diese Ebene.

Je nach Ihrer Definitionseinheit kann es sich dabei um Integrationstests handeln oder auch nicht. Ehrlich gesagt ist es mir egal, wie Sie es nennen, aber wenn Sie einige automatisierte Tests schreiben, die schnell laufen und oft ausgeführt werden, dann könnten sie genauso gut dieselbe Plattform wie Ihre Unit-Tests verwenden.

Ich würde versuchen, dies zu schreiben, so dass es in mindestens die folgenden zwei Möglichkeiten funktionieren kann - Die erste wäre, dass es eine Verbindung zu einem prozesslokalen E-Mail-Server, die Sie einrichten und konfigurieren können, wie Sie benötigen. In Java verwende ich Müllcontainer aber ich bin sicher, dass es für C++ ähnliche Produkte gibt. Die zweite Möglichkeit wäre, sich mit mindestens einem lokalen E-Mail-Server zu verbinden, den Sie mit einem Skript versehen können. Einen, den man nach Belieben bespritzen kann (also NICHT real oder von Entwicklern gemeinsam genutzt¹) und gegen den man dieselbe Reihe von Tests laufen lässt. Der Grund dafür ist, dass die Entwickler von SMTP-Servern jeden hassen und Sie überprüfen wollen, ob Ihr Stub genauso funktioniert wie ein echter Server. Dies sehe ich als das Äquivalent zu Eine Datenbank pro Entwickler .

Wenn Sie keinen eigenen SMTP-Client geschrieben haben und nur eine Fassade um eine bestehende API eines Drittanbieters würde ich weniger wahrscheinlich einen "Integrationstest" durchführen, da ich davon ausgehe, dass die API des Drittanbieters bereits so stark in Mitleidenschaft gezogen wurde, dass die Bugs bereits herausgefallen sind. Ich würde versuchen, die API des Drittanbieters zu simulieren und zu überprüfen, ob die Fassade wie erwartet funktioniert.

1) Vielleicht könnte man dies nur während des CI-Zyklus tun, so dass alle Entwickler einen Satz von E-Mail-Servern gemeinsam nutzen und der lokale Lauf nur einen C++ Dumpster verwendet.

1voto

Thomas Weller Punkte 11508

Sie müssen nur einen Weg finden, das echte Ding durch einen Stummel zu ersetzen, der vollständig unter Ihrer Kontrolle steht. Normalerweise wird dies mit Mocking-Frameworks wie Rhino.Mocks .

Übrigens..: Wenn Sie ein "echtes" E-Mail-Konto verwenden würden, wäre es kein Unit-Test mehr, sondern ein Integrationstest...

0voto

sfussenegger Punkte 34431

Da Sie höchstwahrscheinlich die Verwendung von Sockets nicht testen wollen, könnten Sie darüber nachdenken, diesen Teil Ihres Codes durch eine Dummy-Server-Implementierung zu ersetzen, die keine TCP-Kommunikation beinhaltet. Programmieren Sie einfach die erwarteten Anfragen Ihres Clients und lassen Sie Ihren Dummy-Server entsprechend antworten.

0voto

iain Punkte 10659

Andrew hat Recht mit dem Mocking der Mail-API. Ihr Problem mit diesem Sein in C kann in einer von zwei Möglichkeiten angegangen werden.

  • bieten einen einfachen C++-Wrapper, der nachgebildet werden kann.
  • Verwenden Sie den Linker, um Ihre Test/Mock-Version der C-Api bereitzustellen. Sie müssen dieselben Header-Dateien verwenden, die die Bibliothek bereitstellt, aber Ihre Unit-Tests verknüpfen sich mit Ihren Mock-C-Funktionen anstelle der Bibliothek.

Es gibt ein großartiges Buch, das sich mit der Durchführung von Unit-Tests in schwierigen Situationen befasst: "Working Effectively with Legacy Code", ich kann dieses Buch nur wärmstens empfehlen. Lassen Sie sich nicht vom Titel abschrecken, das Buch betrachtet Legacy-Code als jeden Code ohne Unit-Tests.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X