编写可重复的随机测试

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 63w+ 字,讲解图 2808+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2200+ 小伙伴加入学习 ,欢迎点击围观

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

这是它运行时的样子:



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

相关文章