Wie testet man zeitkritische Software?

9

Mit zeitkritisch meine ich zum Beispiel ein Skript, das nur einmal im Monat ausgeführt wird, oder ein Skript, das kontinuierlich ausgeführt wird, aber nur einmal im Monat eine bestimmte Ausgabe liefert. Natürlich können Sie Unit-Tests für viele Fälle durchführen, aber es gibt Ausnahmen (nach meinem Verständnis).

Ein aktuelles Beispiel, auf das ich gestoßen bin, war das Einrichten eines Cron-Jobs, der am vorletzten Tag eines jeden Monats ausgeführt werden soll. Dies erforderte die Verwendung eines Shell-Skripts mit Cron-Tab, um den richtigen Tag des Monats für Cron zu erhalten.

1 0 [shell command] * * [my script]

Ich war mit dem Skript nicht vertraut und mit Shell-Skripten im Allgemeinen nicht vertraut und hatte daher keine gute Möglichkeit, es zu testen, außer auf das Ende des kommenden Monats zu warten und zu prüfen, ob das Skript korrekt ausgeführt wurde (tatsächlich bestand meine Lösung darin, ein Co-Skript zu finden) Arbeiter, der viel mehr über Cron- und Shell-Skripte wusste als ich).

Ich bin gespannt, ob es nützliche Lösungen zum Testen zeitkritischer Skripte gibt.

DanLeaningphp
quelle
3
Sie können dies auf einer VM ausführen und die Systemzeit auf eine geeignete Zeit einstellen, z. B. Mitternacht vor dem Tag, an dem das Skript ausgeführt werden soll, oder ähnliches.
Vitor Py
2
crontab führt reguläre Shell-Skripte aus. Sie können das Skript einfach von Hand ausführen (in einer Sandbox oder VM, wenn Sie Angst haben, was es tun wird), ohne auf crontab zu warten
krasisch
2
Meine Antwort ist vielleicht übertrieben für Ihren speziellen Fall: Führen Sie einfach das Skript aus. Die größere Frage würde jedoch Lösungen wie Virtualisierung und Instrumentierung erfordern.
Macneil

Antworten:

7

Neben Unit-Tests gibt es zwei weitere Strategien zum Einrichten automatisierter Tests, um ein betriebssystemspezifisches Problem zu lösen:

  • Virtualisierung : Sie richten mehrere Betriebssystemabbilder (z. B. mit VMWare ) mit den genauen Konfigurationen ein, richten eine Möglichkeit ein, die zu testende Binärdatei automatisch abzurufen (normalerweise durch Mounten eines speziellen Verzeichnisses in den VM-Bereich) und führen dann die aus Prüfung.

Oder:

  • Instrumentierung : Fügen Sie ifIhrem Programm manuell spezielle Bedingungen hinzu, die dazu führen, dass sich das Programm anders verhält. Unter Unix würde dies durch Überprüfen, ob eine bestimmte Umgebungsvariable gesetzt ist, wie z FOOBAR_TEST_TIME_WITH_T=500. Ihre automatisierten Tests verwenden dann nur unterschiedliche Einstellungen der Umgebungsvariablen und unterschiedliche Umgebungsvariablen, um das auszuführen, was Sie benötigen.

Sie können auch eine Verknüpfung zu verschiedenen Bibliotheken herstellen, wenn Ihre Interaktionen auf Bibliotheksebene ausgedrückt werden können, was Sie als Virtualisierung (wenn die "Bibliothek" der Betriebssystemkern ist) oder als Instrumentierungstechnik betrachten können. Beide Begriffe können verwendet werden, obwohl der heute verwendete Begriff Virtualisierung fast immer so etwas wie VMWare bedeutet. Eine Bibliothek speziell für die Rückgabe von vordefinierten Werten oder die erneute Ausführung bestimmter Interaktionen wäre ein Schein- oder Stub- Ansatz.

Es gibt auch automatische Instrumentierungswerkzeuge, mit denen Sie Ihre Binärdateien neu schreiben können, um andere gewünschte Effekte zu erzielen, z. B. wenn das Dateisystem voll ist.

Insgesamt ist es Ihr Ziel, Fehler zu finden. Um nach seltsamen Fällen zu suchen, in denen das Dateisystem überfüllt ist, ist es am einfachsten und effektivsten, Ihr Programm nur manuell zu instrumentieren und den Weg der Virtualisierung oder manuellen Maschinenkonfiguration selten oder nie zu gehen.

Macneil
quelle
Ich denke, Ihre 'Bibliotheksvirtualisierung' ist besser bekannt als Verspotten oder besser gesagt als Verwenden einer Scheinbibliothek.
Javier
10

Am effektivsten - Ändern Sie das Datum der Maschine, auf der Sie testen. Stellen Sie es kurz ein, bevor es ausgeführt werden muss, und überprüfen Sie, wann es startet und ob es ordnungsgemäß ausgeführt wird. Dies ist jedoch nicht immer möglich, wenn mehrere Maschinen beteiligt sind oder wenn Ressourcen erforderlich sind, über die Ihr Unternehmen keine Kontrolle hat. Stellen Sie jedoch sicher, dass Sie dies mehrere Monate lang tun, und stellen Sie sicher, dass Sie das Jahr ein paar Mal ändern, um den Februar zu testen.

Lyndon Vrooman
quelle
1
Wenn Sie Software mit einer (n Evaluierungs-) Lizenz für eine begrenzte Zeit installiert haben, kann das Basteln mit der Uhr dazu führen, dass sie ihre Ausführung blockieren.
Marjan Venema
In einigen Unternehmen sollten alle im Netzwerk angemeldeten Arbeitsstationen nicht um 5 Minuten von der "Server" -Zeit abweichen. Andernfalls wird die Arbeitsstation gesperrt. Es ist mir passiert :-)
OnesimusUnbound
1

Ich weiß nichts über Ihr Skript, aber ich versuche, einen Parameter zu verwenden, mit dem ich das Datum einstellen kann. Wenn in Ihrem Fall kein Datum angegeben ist, wird standardmäßig das Monatsende verwendet. Nehmen Sie in Ihrem Code den Datumsparameter und führen Sie ihn aus, wenn der heutige Tag zwei Tage vorher liegt. Sie können es nicht nur testen (in zwei Tagen), sondern auch am nächsten Tag ausführen, falls es unter normalen Umständen (Stromausfall, Serverausfall usw.) nicht ausgeführt werden konnte.

JeffO
quelle
1

Da Sie crontab erwähnt haben, gehe ich davon aus, dass Sie in einer Nix-Umgebung ausgeführt werden. In diesem Fall lohnt es sich meiner Meinung nach, sich libfaketime anzusehen:
http://www.code-wizards.com/projects/libfaketime/

Durch die Magie von LD_PRELOAD können wir benutzerdefinierte Versionen von Bibliotheksfunktionen laden, solange diese mit der Schnittstelle übereinstimmen. Libfaketime lädt Versionen der Zeitsystemaufrufe, mit denen Sie ihr Verhalten über Umgebungsvariablen anpassen können. Sie können time () zwingen, einen fest codierten Wert oder einen Offset von der aktuellen Zeit zurückzugeben, ohne dass dies Auswirkungen auf andere Personen in der Box hat.

frankc
quelle
0

Es besteht nicht viel Bedarf, Cron zu testen, da es seit vielen Generationen getestet wurde ("Produktionstest"). Wenn Sie mit einem Shell-Skript arbeiten, können Sie natürlich Datum und Uhrzeit in einer virtuellen Maschine festlegen.

Der bevorzugte Weg, um damit umzugehen, ist das "Verspotten der Uhr", wobei der eine oder andere Programmiertrick verwendet wird, um die Zeit zu fälschen. In Shell-Skripten können Sie die Syntax $ {: -} verwenden, um ein in einer Umgebungsvariablen festgelegtes Datum zu verwenden und auf die tatsächliche Zeit zurückzugreifen, wenn dies nicht erzwungen wurde.

In anderen Sprachen verwenden wir Scheinbibliotheken oder erstellen rund um die Uhr eine Abstraktion.

Die Scheinuhr ist gut, weil Sie sie automatisieren können, anstatt Ihren Test manuell einrichten zu müssen. Dies ist ein sehr großer Vorteil, wenn Sie das Skript / den Code später ändern möchten, und Sie können leicht feststellen, ob es noch funktioniert oder nicht.

Tim Ottinger
quelle