2016-02-03 5 views
7

Sind ganze Zahlen mit IFixture.Create<int>() eindeutig?Sind mit AutoFixture 3 generierte Integer-Zahlen eindeutig?

The Wiki says, dass die Zahlen sind zufällig, aber es sagt uns auch diesen

Die ersten Zahlen im Bereich von [1, 255] erzeugt werden, wie dies eine Reihe von Werten, die für alle gültig sind numerische Datentypen Der kleinste numerische Datentyp in .NET ist System.Byte, der in diesen Bereich passt.

Wenn die ersten 255 Zahlen verwendet wurden, Zahlen werden anschließend aus dem Bereich aufgenommen [256, 32767], die für System.Int16 auf die verbleibenden positiven Zahlen verfügbar entspricht.

Zwei ähnliche Dinge auf GitHub:

https://github.com/AutoFixture/AutoFixture/issues/2

https://github.com/AutoFixture/AutoFixture/pull/7

Und was ist mit den Unit-Tests?

https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixtureUnitTest/GeneratorTest.cs#L33

[Theory, ClassData(typeof(CountTestCases))] 
public void StronglyTypedEnumerationYieldsUniqueValues(int count) 
{ 
    // Fixture setup 
    var sut = new Generator<T>(new Fixture()); 
    // Exercise system 
    var actual = sut.Take(count); 
    // Verify outcome 
    Assert.Equal(count, actual.Distinct().Count()); 
    // Teardown 
} 

https://github.com/AutoFixture/AutoFixture/blob/master/Src/AutoFixtureUnitTest/GeneratorTest.cs#L57

[Theory, ClassData(typeof(CountTestCases))] 
public void WeaklyTypedEnumerationYieldsUniqueValues(int count) 
{ 
    // Fixture setup 
    IEnumerable sut = new Generator<T>(new Fixture()); 
    // Exercise system 
    var actual = sut.OfType<T>().Take(count); 
    // Verify outcome 
    Assert.Equal(count, actual.Distinct().Count()); 
    // Teardown 
} 

Ich habe keine Erklärung gefunden, dass die erzeugten Zahlen sind eindeutig sagt, nur jene Bits von Informationen, die es nahe legen würde, aber ich kann falsch sein.

Antwort

8

Momentan ist AutoFixture bestrebt, eindeutige Nummern zu erstellen, aber es garantiert nicht. Zum Beispiel können Sie den Bereich ausschöpfen, was am ehesten für byte Werte passieren wird. Wenn Sie zum Beispiel 300 byte Werte anfordern, erhalten Sie Duplikate, da nur 256 Werte zur Auswahl stehen.

AutoFixture wird Werte gerne wiederverwenden, sobald der ursprüngliche Satz aufgebraucht ist; die Alternative wäre, eine Ausnahme zu werfen.

Wenn es für einen Testfall wichtig ist, dass Zahlen eindeutig sind, würde ich empfehlen, diese explizite im Testfall selbst zu machen. Sie können Generator<T> mit Distinct für diese kombinieren:

var uniqueIntegers = new Generator<int>(new Fixture()).Distinct().Take(10); 

Wenn Sie AutoFixture.Xunit2 verwenden, können Sie eine Generator<T> über ein Prüfverfahren Argument anfordern:

[Theory, AutoData] 
public void MyTest(Generator<int> g, string foo) 
{ 
    var uniqueIntegers = g.Distinct().Take(10); 
    // more test code goes here... 
} 
7

Die ersten Nummern werden innerhalb des Bereichs von [1, 255] generiert und es gibt no duplicates present. Über diesem Bereich ist es derzeit möglich, Duplikate zu erhalten.

This Ausgabe enthält nützliche Informationen darüber, wie der integrierte Algorithmus verbessert werden kann.

Verwandte Themen