【问题标题】:Unit test intermittent OOM exception when using Autofixture Generator使用 Autofixture Generator 时单元测试间歇性 OOM 异常
【发布时间】:2017-02-28 13:29:05
【问题描述】:

我们有几个类似的单元测试会抛出间歇性 OutOfMemoryExceptions 并破坏我们的 CI 管道:

public void Evaluate_Node1GreaterThanNode2_ReturnsTrue_Decimal()
{
    //Arrange
    var generator = _fixture.Create<Generator<decimal>>();

    var value1 = _fixture.Create<decimal>();
    var value2 = generator.Where(x => x < value1).First();
    Node.Node1.Evaluate(Arg.Any<IPeriod>(), Arg.Any<IColleaguePeriodDataManager>()).Returns(value1);
    Node.Node2.Evaluate(Arg.Any<IPeriod>(), Arg.Any<IColleaguePeriodDataManager>()).Returns(value2);

    //Act
    var result = Node.Evaluate();

    //Assert
    Assert.IsTrue(result);
    Assert.IsTrue(Node.EvaluatedResult);
}

如您所见,我们正在使用 AutoFixture 的生成器来创建大于/小于初始值的数字:

generator.Where(x => x < value1).First();

显然这种方法行不通。有人有解决办法吗?

这是错误和堆栈跟踪:

System.OutOfMemoryException : Array dimensions exceeded supported range.
at System.Collections.Generic.HashSet`1.SetCapacity(Int32 newSize, Boolean forceNewHashCodes)
   at System.Collections.Generic.HashSet`1.AddIfNotPresent(T value)
   at Ploeh.AutoFixture.RandomNumericSequenceGenerator.GetNextRandom()
   at Ploeh.AutoFixture.RandomNumericSequenceGenerator.CreateRandom(Type request)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.Postprocessor`1.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.CompositeSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.TracingBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.TerminatingWithPathSpecimenBuilder.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.Kernel.RecursionGuard.Create(Object request, ISpecimenContext context)
   at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context, T seed)
   at Ploeh.AutoFixture.SpecimenFactory.Create[T](ISpecimenContext context)
   at Ploeh.AutoFixture.Generator`1.<GetEnumerator>d__2.MoveNext()
   at System.Linq.Enumerable.WhereEnumerableIterator`1.MoveNext()
   at System.Linq.Enumerable.First[TSource](IEnumerable`1 source)

【问题讨论】:

    标签: c# nunit autofixture


    【解决方案1】:

    看起来测试场景要求value2 大于value1。一种简单的方法是这样的:

    var x = fixture.Create<decimal>();
    var y = fixture.Create<decimal>();
    var value1 = Math.Min(x, y);
    var value2 = Math.Max(x, y) + 0.0001m; // Add small fraction to make it strictly greater
    

    如果您不想查看临时变量 xy,可以将其重构为辅助方法。

    【讨论】:

      猜你喜欢
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多