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.
Antworten:
Neben Unit-Tests gibt es zwei weitere Strategien zum Einrichten automatisierter Tests, um ein betriebssystemspezifisches Problem zu lösen:
Oder:
if
Ihrem 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 zFOOBAR_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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle