测试我们的软件是我们非常重视的事情。在某些情况下,我们想要超越测试我们 所知道的东西。 我们想测试随机的东西。例如,如果我们添加 10,000 个文档,然后每隔 17 个删除一次,会发生什么情况?在行为、性能等方面有什么不同吗?
当然,随意做事很容易。但这导致了一个有趣的案例。只要测试通过,您就可以拍拍自己的背:“我们做得很好,一切正常。”
但是当某事失败时……好吧,你唯一知道的就是某件事确实失败了。你没有办法重现这个。因为测试是……随机的。
为了处理这个问题,我们编写了以下代码:
[attributeusage(attributetargets.method, allowmultiple = true)]
public class inlinedatawithrandomseed : dataattribute
{
public inlinedatawithrandomseed(params object[] datavalues)
{
this.datavalues = datavalues ?? new object[] {null};
}
public object[] datavalues { get; set; }
public override ienumerable<object[]> getdata(methodinfo methodundertest, type[] parametertypes)
{
var objects = new object[datavalues.length+1];
array.copy(datavalues,0,objects,0, datavalues.length);
objects[datavalues.length] = environment.tickcount;
yield return objects;
}
}
这是使用 xunit,它使我们能够向测试添加种子。让我们看看测试的样子:
这是它运行时的样子:
当我们失败时,我们 知道 种子是什么,我们可以用那个种子运行测试,看看到底发生了什么。