Nunit, testy jednostkowe i użycie random

0

Mam metodę:

public void Method()
{
Random random = new Random();
int position = random.Next(0,2);
//Obliczenia
}
 

Co z tym Random w przypadku testów jednostkowych? Zrobiłem tak, że po prostu olałem to Random, bo ono musi działać?

0
for (int position = 0; position < 2; positon++)
{
  //obliczenia
}

lub http://www.nunit.org/index.php?p=theory&r=2.5

1

Testujesz tylko swój kod, więc jeśli to jest Random z biblioteki to tracisz tylko czas.
Jeśli to jest twój generator liczb losowych, to testowanie generatorów liczb losowych to jest bardziej skomplikowana sprawa.

0

Przepraszam, ale w pierwszym poście źle się wyraziłem. Mam metodę, która losuje indeksy. Nie wiem, jak testować Random generator, chciałem zostawić to w spokoju i testować po prostu tą metodę.

public void RandomIndexes()
{
   Random generator = new Random();
   int drawn = 0;
   int[] index = new int[numberOfVectors];
   randomIndexes = new int[numberOfVectors];
   for (int i = 0; i < index.Length; i++)
   {
       index[i] = i;
   }
   for (int k = 0; k < numberOfVectors; k++)
   {
       int position = generator.Next(0, index.Length - 1 - drawn);
       randomIndexes[k] = index[position];
       index[position] = index[index.Length - 1 - drawn];
       index[index.Length - 1 - drawn] = randomIndexes[k];
       ++drawn;
   }
} 

Chodzi mi o testowanie metody RandomIdexes. Chciałem sprawdzić, czy tablica wylosowanych indeksów jest poprawna w taki sposób:
Posortować rosnąco i porównać z tablicą indeksów "ręcznie" wypełnioną. Tylko tu jest haczyk, może się tak stać, że wylosowana tablica nie jest wylosowana, bo się nie losuje, wartości są równe indeksom, ale możliwe też jest, że tak się wylosuje.

1

Zmień tą metodę.
Ma mieć jeden parametr Random generator
Uprość tą funkcję:

public void RandomIndexes(Random generator)
  {
   if(randomIndexes==null)
     {
      randomIndexes=new int[numberOfVectors];
      for(int i=0;i<randomIndexes.Length;++i) index[i]=i;
    }
   for(int k=randomIndexes.Length;k>0;)
     {
      int p=generator.Next(0,k--);
      int tmp=randomIndexes[k];
      randomIndexes[k]=randomIndexes[p];
      randomIndexes[p]=tmp;
     }
  }
1

Moim zdaniem jest to przekombinowane.
Zapewne chodziło ci o coś takiego:

    public static int[] RandomIndexes(int size) {
    	int[] result = new int[size];
    	for (int i = 0; i < size; i++) {
            result[i] = i;
    	}
    	ShuffleArray(result);
        return result;
    }

    private static Random r = new Random();
    public static void ShuffleArray(int [] array) {
        for (int i = 0; i < array.Length; i++) {
            int j = r.Next(array.Length);
        	int tmp = array[i];
            array[i] = array[j];
            array[j] = tmp;
        }
    }

http://ideone.com/IkwzRA

A testowanie tego też jest proste:

[Test]
public void RandomIndexesTest() {
    int[] x = RandomIndexes(10);
    Assert.AreEqual(x.Length, 10);
    for (int i=0; i<x.Length; ++i) {
         Assert.GreaterOrEqual(x[i], 0);
         Assert.Less(x[i], x.Length);
         for (int j=i+1; j<x.Length; ++j) {
               Assert.AreNotEqual(x[i], x[j]);
         }
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.