Are integer numbers generated with AutoFixture 3 unique?

大城市里の小女人 提交于 2020-01-24 02:16:13

问题


Are integer numbers generated with IFixture.Create<int>() unique?

The Wiki says that numbers are random, but it also tells us this

The first numbers are generated within the range of [1, 255], as this is a set of values that are valid for all numeric data types. The smallest numeric data type in .NET is System.Byte, which fits in this range.

When the first 255 integers have been used, numbers are subsequently picked from the range [256, 32767], which corresponds to the remaining positive numbers available for System.Int16.

Two related things at GitHub:

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

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

And what about those 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
}

I have not found a statement that says the generated numbers are unique, only those bits of information that would suggest it, but I may be wrong.


回答1:


Currently, AutoFixture endeavours to create unique numbers, but it doesn't guarantee it. For instance, you can exhaust the range, which is most likely to happen for byte values. If, for instance, you request 300 byte values, you will get duplicates, because there's only 256 values to choose from.

AutoFixture will happily reuse values once the initial set has been depleted; the alternative would be to throw an exception.

If it's important for a test case that numbers are unique, I would recommend making this explicit in the test case itself. You can combine Generator<T> with Distinct for this:

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

If you're using AutoFixture.Xunit2, you can request a Generator<T> via a test method argument:

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



回答2:


The first numbers are generated within the range of [1, 255] and there are no duplicates present. Above that range, it is currently possible to get duplicates.

This issue contains useful information on how the built-in algorithm can be improved.



来源:https://stackoverflow.com/questions/35172186/are-integer-numbers-generated-with-autofixture-3-unique

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!