2016-02-03 6 views
7

Являются ли целые числа с IFixture.Create<int>() уникальными?Являются ли целые числа, созданные с помощью AutoFixture 3 уникальными?

The Wiki says, что числа являются случайными, но он также говорит нам этот

Первые числа генерируются в диапазоне [1, 255], так как это представляет собой набор значений, которые являются действительными для всех числовые типы данных. Наименьший тип цифровых данных в .NET - System.Byte, который подходит для этого диапазона .

Когда были использованы первые 255 целых чисел, цифры затем выбраны из диапазона [256, 32767], что соответствует остальным положительным номерам, доступным для System.Int16.

Две взаимосвязанные вещи на GitHub:

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

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

А что эти модульные тесты?

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 
} 

Я не нашел заявление, в котором говорится, сгенерированные номера являются уникальными, только те биты информации, которые можно было бы предположить, но я могу ошибаться.

ответ

8

В настоящее время AutoFixture стремится создавать уникальные номера, но это не гарантирует. Например, вы можете исчерпать диапазон, который, скорее всего, произойдет для значений byte. Если, например, вы запрашиваете значения 300 byte, вы получите : получите дубликаты, так как есть только 256 значений.

AutoFixture будет радостно использовать значения после того, как исходный набор будет исчерпан; альтернативой было бы исключение.

Если для тестового примера важно, чтобы числа были уникальными, я бы рекомендовал сделать это явным в самом тестовом случае. Вы можете комбинировать Generator<T> с Distinct для этого:

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

Если вы используете AutoFixture.Xunit2, вы можете запросить Generator<T> с помощью метода испытаний аргумента:

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

Первые числа генерируются в диапазоне от [1, 255] и no duplicates present. Выше этого диапазона, это является в настоящее время можно получить дубликаты.

This выпуск содержит полезную информацию о том, как можно улучшить встроенный алгоритм.