2012-06-11 8 views
5

Es gibt einige Anwendungsdomänen (z. B. GameDev), in denen viele Funktionen erstellt werden sollten, die zufällige Werte verwenden, um ihre Ausgabe zu erzeugen. Eines der Beispiele wird im Folgenden dargestellt:Wie validieren Sie die Korrektheit von Funktionen, die zufällig verwendet werden?

Diese Funktion generiert den Drop des Artikels basierend auf mehreren zufälligen Operationen. Das Problem tritt auf, wenn Sie die Korrektheit dieser Funktion automatisch überprüfen möchten. Generierte Werte sind nicht deterministisch und das Schreiben von Regressionstests scheint unmöglich zu sein.

Meine Fragen sind:

  1. Ist dies möglich, nützliche Regressionstests für diese Art von Funktionen zu schreiben?
  2. Gibt es einen allgemeinen Ansatz für die Erstellung einer anderen Art von Tests in diesem Fall?
+4

Es gibt ganze Bücher zu diesem Thema geschrieben. Beispiel: http://www.johndcook.com/Beautiful_Testing_ch10.pdf –

+1

Es ist ein Ansatz, den RNG auszuspionieren, um bekannte Ergebnisse zu liefern (und dann mit spezifischen Ausgaben zu testen, für die das gewünschte Ergebnis bekannt ist). –

Antwort

3

Eine nützliche Einheit-Tests ist unten dargestellt:

def test_generate_key(): 
    button_list = [] 
    for _ in range(1, 1000): 
     button_list.append(generate_key(0.2)) 

    is_all_none = True 
    is_not_none = False 
    for key in button_list: 
     is_all_none &= (key is None) 
     is_not_none |= (key is not None) 

    assert is_all_none == False 
    assert is_not_none == True 

Es bestätigt Funktionssignatur, decken alle Sparten der Funktion des Codes (gute Wahrscheinlichkeit) und wird in 99,999% der Fälle passieren. Außerdem wurde bestätigt, dass die Funktion einen Tropfen von mindestens 1000 erzeugt und manchmal keinen Tropfen erzeugt. 0,2 ist die Wahrscheinlichkeit, dass ein Gegenstand fallen gelassen wird.

2

Ich würde die Funktion neu schreiben, um Abhängigkeitsinjektion zu verwenden (der Zufallszahlengenerator wird als Parameter an die Funktion übergeben). Dann können Sie einen Schein eines Zufallszahlengenerators übergeben, um Ihre Funktion mit verschiedenen deterministischen "zufälligen" Eingaben zu testen.

Natürlich können Sie auch Ihre Aussagen testen, die nicht von den Ergebnissen des Aufrufs abhängen. Wie:

  • Die Funktionen gibt keine oder ein Diktat mit den Tasten "Typ" und "Brief" zurück.
  • Wenn ein Wörterbuch zurückgegeben wird, haben die Werte den entsprechenden Typ und Bereich.

Ich würde nie einen Unittest schreiben, der nicht-deterministische Ergebnisse hat, sogar 1 in tausend. Ich sorge mich um jeden Testfehler, und stochastische Ergebnisse würden beunruhigen. Sie sollten Ihre Zufälligkeit besser einkapseln, damit die Funktion unabhängig vom Zufallszahlengenerator getestet werden kann.