2009-02-26 4 views
0

Ich versuche, während des Testens, das NUnit verwendet, eine beliebige Nummer zu generieren, aber es generiert dieselbe Nummer weiterhin. Ich verwende zu diesem Zweck die folgende Funktion.Gleiche Zufallszahl, die generiert wird, wenn in Test ausgeführt wird Fixture setup

dim dCount As Integer = Math.Floor((High - Low + 1) * Rnd() + Low) 
dim divName As String = "abc" & dCount 

Irgendeine Idee, warum es das tut?

Grüße,

Sam

+0

Verwenden Sie 4, es ist garantiert zufällig; Außerdem können Sie es testen. – garrow

Antwort

1

Vermutlich sind Sie viele Tests schnell hintereinander ausgeführt werden. Ich weiß nicht genau, was Rnd() in VB tut, aber es klingt wie es ist das typische "neue RNG pro Anruf" Problem. Erstellen Sie eine einzelne Instanz von Random und verwenden Sie sie wiederholt. Beachten Sie, dass Mathematik durch eine einfache ersetzt werden kann:

dim dCount as Integer = myRandom.Next(Low, High+1) 

Eine Einschränkung - Random ist nicht Thread-sicher. Wenn Sie Zufallszahlen aus verschiedenen Threads generieren müssen, either use locking or thread statics.

An einem anderen Punkt: Verwendung von Zufallszahlen wird Ihre Unit-Tests nicht-deterministisch machen. Bist du sicher, dass du musst? Manchmal ist es angebracht, aber nicht oft IME.

+0

Rnd() gibt eine einzelne Zahl im Bereich 0 <= r <1 zurück ... und ich muss als zweites keine zufällig generierten Daten in Ihren Komponententests verwenden. Viel besser, explizit innerhalb und außerhalb Ihres erwarteten Bereichs zu testen. –

+0

Persönlich empfehle ich Zufallszahlen mit einem festen Startwert (natürlich auch explizite Grenzfälle). Auf diese Weise können Sie problemlos eine große Datenmenge testen und auf subtile Probleme stoßen, die Sie möglicherweise übersehen haben, aber immer den gleichen Test für Regressionszwecke wiederholen. – Kena

0
Dim dCount As Integer = between(low, high) 
Dim divName As String = "abc" & dCount 


Dim myRandom As New Random 
Private Function between(ByVal low As Integer, ByVal high As Integer) As Integer 
    between = myRandom.Next(low, high + 1) 
End Function 
Verwandte Themen