2009-03-08 8 views
10

Ich habe eine Java-Anwendung, die auf Linux läuft, die viele Ereignisse und Geschäftslogik hat, die sich um Zeiten und Daten drehen."schnellere Zeit" in Linux simulieren

Zum Testen, ist es möglich, etwas schneller in die Zeit zu zwängen. Lassen Sie uns sagen, machen Sie ein ganzes Computerjahr in einer Stunde Wandzeit fertig?

+0

Ruft das Programm beim Systemaufruf "time" und "date" auf? –

+0

was ist mit einem Skript Einstellung der Zeit jede Sekunde eine Sekunde auseinander :) –

+0

Ist dieses Programm auf eine Datenbank oder andere externe Programme angewiesen? – jmucchiello

Antwort

9

Sie können eine Wrapper-Schnittstelle für Ihre Zeit/Datum-Anrufe schreiben. Haben Sie eine echte Implementierung, die echte Systemaufrufe durchführt, und eine Testimplementierung, die alles tun kann, was Sie wollen (schneller, langsamer, gefälschte Daten usw.).

+0

Guter Ansatz, aber wenn die "Long Running Test" externe Elemente wie überprüfen müssen: Web/Application Server-Protokolldateien verwalten, Speicherverbrauch, oder Sie möchten testen alle Komponenten arbeiten zusammen (Ihre App, sql/no-sql db, Cron wie Dienste/Jobs, etc.). Diese Art von Tests erfordert eine Änderung der Hardware-Uhr, um alle Parteien "auszutricksen". Siehe [Endurance Testing] (http://www.softwaretestingsoftware.com/all-types-of-software-testing/). * Denk an Dragon Balls ** "Hyperbolic Time Chamber" *** –

2

Wenn Sie Systemaufrufe sind, um die Systemzeit zu erhalten (d. H. System.currentTimeMillis()), können Sie vermutlich die Zeit durch Ändern der Systemzeit beschleunigen. Dies sollte sich auf die Zeit auswirken, die Sie in Ihrer Anwendung sehen.

Wenn Sie andere Möglichkeiten zur Berechnung der Zeit (verstrichene Zeit von JVM Start (d. H. System.nanoTime()), Nettozeit-Server, etc ...) dann die Antwort ist, dass es nicht möglich ist.


ich nicht genug betonen kann, dass ich gerade zu erklären, wie, was Sie gefragt, zu tun und dies auch nur für Integrationstests gut ist, wenn man Überlegungen etwas tragen, was Sie auf der Maschine auswirken.

Dies sollte für eine ordnungsgemäße und umfassende Geräteprüfung nicht als Ersatz dienen.

+0

Wenn jemand anderes die Maschine benutzt, werden sie nicht glücklich sein. Wenn die Simulation abstürzt, ist die Uhr Ihres Rechners falsch. Wenn Sie Dateien während der Simulation erstellen, werden ihre Zeitstempel später in der Zukunft liegen. –

+0

@ Jonathan, gut gesagt, habe ich meine Antwort mit einem Haftungsausschluss aktualisiert –

0

Sie müssen Ihr System so entwerfen, dass Sie die Uhr während des Tests "neu planen" können. Für einige Systemklassen gibt es eine Ereigniswarteschlange, in der geplante Ereignisse in zeitlicher Reihenfolge gespeichert werden. Zu jedem Zeitpunkt der Simulation ist das nächste Ereignis das erste Element in der Warteschlange. Sie können es aus der Warteschlange ziehen und die effektive Zeit so anpassen, dass sie mit der Zeit übereinstimmt, zu der dieses Ereignis eintritt. Wenn neue Ereignisse geplant werden, werden sie der Warteschlange hinzugefügt. So können Sie die Ereignisse so schnell bearbeiten, wie es das System zulässt, anstatt auf die tatsächliche Zeit warten zu müssen. Aber Sie müssen Ihr System so gestalten, dass ein solcher Mechanismus funktioniert.

7

Ein Ansatz, der am besten für Komponententests funktioniert, ist die Zusammenfassung der Art und Weise, wie auf die aktuelle Zeit in Ihrem Code zugegriffen wird.

Anstatt System.currentTimeMillis() direkt aufzurufen, können Sie eine eigene Implementierung bereitstellen.

So etwas wie diese (Pseudocode):

class MyTime { 
    private static TimeInterface CurrentTimeInterface = new DefaultTimeImpl(); 

    public setTimeInterface(TimeInterface timeInterface) { 
     CurrentTimeInterface = timeInterface; 
    } 

    public int getTime() { CurrentTimeInterface.getTime(); } 

} 

class DefaultTimeImpl implements TimeInterface { 
    public int getTime() { return System.currentTimeMillis(); } 
} 

class TestTimeImpl implements TimeInterface { 
    private int CurrentTimeMillis = 0; 
    public int getTime() { return CurrentTimeMillis; } 
    public void setTime(int timeMillis) { CurrentTimeMillis = timeMillis} 
    public void sleep(int millis) { CurrentTimeMillis += millis; } 
} 

Dann überall würden Sie System.getTimeMillis() statt rufen MyTime.getTime() aufgerufen haben. Wenn Sie Ihren Code testen, erstellen Sie einfach ein TestTimeImpl und rufen MyTime.setTimeInterface (testTimeImpl) auf. Wenn Sie Zeit für die Weiterleitung benötigen, rufen Sie testTimeImpl.sleep() oder testTimeImpl.setTime() auf.

Damit können Sie jede Zeit bis zur Millisekunde simulieren.