编写可重复的随机测试

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动

目前,正在 星球 内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.x + Vite 4手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 204 小节,累计 32w+ 字,讲解图:1416 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 870+ 小伙伴加入,欢迎点击围观

测试我们的软件是我们非常重视的事情。在某些情况下,我们想要超越测试我们 所知道的东西。 我们想测试随机的东西。例如,如果我们添加 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,它使我们能够向测试添加种子。让我们看看测试的样子:

这是它运行时的样子:



当我们失败时,我们 知道 种子是什么,我们可以用那个种子运行测试,看看到底发生了什么。