编写可重复的随机测试
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2800+ 小伙伴加入学习 ,欢迎点击围观
测试我们的软件是我们非常重视的事情。在某些情况下,我们想要超越测试我们 所知道的东西。 我们想测试随机的东西。例如,如果我们添加 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,它使我们能够向测试添加种子。让我们看看测试的样子:
这是它运行时的样子:
当我们失败时,我们 知道 种子是什么,我们可以用那个种子运行测试,看看到底发生了什么。