(Wie) führen Sie automatisch "Funktionstests" für Ihre Dienste durch?


7

Stellen Sie sich einen einfachen FreeBSD-Computer vor, auf dem ein SMTP-Server ausgeführt wird. Wie kann ich automatisch überprüfen, ob er das Richtige tut (z. B. eingehende SMTP-Verbindungen für bestimmte Empfänger akzeptieren und die E-Mail in einem Maildir ablegen)?

Wir verwenden bereits Serverüberwachungssoftware (in diesem Fall Nagios) und führen natürlich manuelle Tests durch, aber ich habe mich gefragt: Gibt es eine übliche Möglichkeit, automatische Funktionstests für Serverdienste durchzuführen?

Ein Beispiel für das, woran ich denke: Bei der Neukonfiguration unseres Servers (was normalerweise zu Testzwecken in einer VM geschieht) denke ich darüber nach

  1. Übertragen Sie einige manuell erstellte SMTP-Sitzungen in netcat, das eine Verbindung zum SMTP-Port unseres Servers herstellt, und dann
  2. Führen Sie auf dem Server eine Art Überprüfungsskript aus, das sicherstellt, dass die erwarteten Zusicherungen gültig sind (z. B.: Neue Dateien mit erwarteten Inhalten wurden auf dem Server angezeigt, Protokolleinträge wurden erstellt usw.).

Ich kann mir vorstellen, dass das Ausführen einer Reihe solcher Tests für andere Dienste (z. B. das Testen, ob Sicherungen erstellt werden können, das Testen, ob der IMAP-Server Verbindungen für bestimmte Benutzer akzeptiert und die richtigen E-Mails auflistet) zum Testen von Konfigurationsänderungen hilfreich sein kann, oder um zu überprüfen, ob wiederhergestellte Systemsicherungen wie erwartet funktionieren.

Antworten:


3

Sie können erwarten , mit dem Dienst zu interagieren, z

#!/usr/bin/expect -f
set timeout 1
spawn telnet localhost 25
expect "220 *"
send -- "helo localhost\n"
expect -- "250*Hello\ localhost*"
send -- "mail from: root@localhost\n"
expect -- "250\ OK"
send -- "rcpt to: root@localhost\n"
expect -- "250\ Accepted"
send -- "data\n"
expect -- "354*"
send -- "functional test\n.\n"
expect -- "250\ OK*"
send -- "quit\n"
expect "221*closing\ connection"

nenne das obige so

/path/to/expect.script | grep -q "250 OK"
if [ $? = 0 ]
then
    echo "Message queued successfully"
else
    echo "Message Failed to queue"

Anschließend können Sie überprüfen, ob die Nachricht korrekt an den Mailspool oder Maildir oder was auch immer übermittelt wurde. Sie können localhost für den Remote-Host Ihrer Wahl ändern, obwohl dies die Zustellungsprüfung erschwert. Sie können jedoch immer erwarten, dass Sie sich anmelden - dies ist ein sehr leistungsfähiges Tool.


+1: Das ist wirklich ordentlich, ich habe Netcat bisher verwendet, bin mir nicht in den Sinn gekommen, es dafür zu verwenden expect. :-)
Frerich Raabe

Ich akzeptiere das, da ich mich dafür entschieden habe.
Frerich Raabe

4

Diese Art von Tests kann mehr oder weniger einfach als Nagios-Test geschrieben werden (wie einfach dies ist, hängt vom jeweiligen Dienst ab). Denken Sie daran, ein Nagios-Test ist eine einfache Sache , zumindest die Schnittstelle zu Nagios. Es ist nur ein Programm oder ein Shell-Skript, das eine genau definierte Antwort (einen Rückkehrcode und einen Informationstext) zurückgibt.

Außerdem sind bereits viele Module für alle Arten von Diensten verfügbar. Überprüfen Sie den Nagios-Austausch . Eine Lösung für Ihr Mail-Beispiel ist dies .


+1: In der Tat denke ich, dass Nagios ziemlich gut funktionieren würde. Der Nachteil ist, dass Nagios den Server in erster Linie kennen muss, was bei Test-Setups, die in einer VM ausgeführt werden, nicht der Fall ist.
Frerich Raabe

2

Ich benutze NAGIOS.

Wenn ich daran interessiert bin, eine einzelne Funktion zu testen, die einen Schritt in einer Kette darstellt, die einen Geschäftsdienst bereitstellt, teste ich Folgendes: Um einen SMTP-Server zu testen, verwende ich das SMTP-Plugin, das eine Verbindung zu Port 25 herstellt und nach einem sucht geeignetes Banner; ebenso ein IMAP-Server; und so weiter.

Wenn ich daran interessiert bin, eine End-to-End-Sequenz, den Erfolg oder Misserfolg der gesamten Kette zu testen, überprüfe ich, ob sie erfolgreich abgeschlossen wurde. Um eine Kette zu testen, wie Sie sie beschreiben, habe ich möglicherweise einen Cron-Job, der alle 30 Minuten E-Mails mit einer bestimmten Testzeichenfolge an eine bestimmte Adresse sendet, und ich habe ein NAGIOS-Plugin, das im Empfängerpostfach nach dieser Zeichenfolge sucht, und prüft, ob es regelmäßig aktualisiert wird.

Normalerweise mache ich beides. Wenn der End-to-End-Test in den Status ALERT wechselt, wird voraussichtlich auch einer oder mehrere der Zwischenschritte alarmiert - möglicherweise ist der SMTP-Empfänger ausgefallen oder das Netzwerk Die Verbindung zwischen den beiden ist fehlgeschlagen oder die Disc ist auf dem Empfänger voll - und das gibt mir einen ersten Hinweis bei der Untersuchung des End-to-End-Fehlers. Oft werde ich die einzelnen Stufentests und den End-to-End-Test in einer einzigen Servicegruppe zusammenfassen, um eine schnelle und einfache Ansicht fehlerhafter Komponenten zu erhalten.

Ich bin jedoch der Meinung, dass einzelne NAGIOS-Plugins immer klein und leicht sein sollten . Beachten Sie also, wie der obige End-to-End-Test nur den endgültigen Erfolg oder Misserfolg der Kette testet . Es tut nichts, um die Schritte der Kette zu testen. Je komplexer ein einzelnes Plugin ist, desto eher scheitert es auf unerwartete Weise und desto wahrscheinlicher ist es, dass ich von meinem Überwachungssystem falsch positive (oder schlimmer noch falsch negative) Ergebnisse erhalte.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.