本系列的重点在于单元测试,并不一定完全符合常规的TDD
上一篇发布到现在都只有一票rust,想必到投票结束也不会有什么变化了,那么我们就选用Rust作为这个系列的编程语言吧(这个系列代码难度应该不高,所以选择什么语言没有太大的差别,但是项目选的有点糟糕,因为随机性的问题,测试的设计与编写难度上升了,但这不是编码的难度,而是软件工程学相关的难题)
首先,让我们来分析需求并且确定我们的测试用例(当然,需要先创建一个rust项目,这个十分入门级,就无需在下提醒了吧)
如何为Rust代码编写单元测试应当也是新手内容(在下的专栏不止一次说过需要看完官方的文档,虽然很多人说官方文档写的不行,但在下自认不能写的比官方文档好)
首先我们来分析一下抽卡功能,将其抽象成数条需求用例,并以此来编写单元测试,然后我们要做的就是让单元测试通过,即可完成项目(我们将一点一点的丰富我们的功能,一开始将只是很简单的抽卡)
首先,我们先来规定一种最简单的抽卡功能,即在一个无限池子中每次抽取一样物品,不同物品的概率不同,但总概率为100%(这是肯定的,否则将不是池类型)
如果是寻常编程模式,那么现在就是着手编写一个池类型,允许添加物品,物品包含物品实体和物品的占比
但现在我们是TDD,所以我们要以单元测试的角度来思考如何去测试代码是否符合这个需求,为了方便测试抽卡的结果,我们将允许用户自定义池
先编写一个简单的测试,以证明抽取卡池为空的情况(出于需求,这里令空卡池抽取结果为空,各位也可以设计为空卡池不能抽取,那么此时get函数将返回错误)
首先我们需要为这个用例编写开发代码,来让这个测试用例可以通过
聪明的小朋友肯定要问了,你虽然通过了测试,但是代码明显是错的啊,测试驱动开发的开发每次做的事情就是以最小程度的代码改动来让测试通过,所以这里的开发编写的代码是没有问题的(当然,这种情况一般只发生在项目开始的初期阶段,之后随着测试用例的增加,这种一看就是错误代码的情况将大幅度减少)
接下来我们编写第二个测试用例,以此测试当一个池子只有一个值的时候(即池子中该物品的概率为100%),我们一定可以获取到这一样物品
那么接下来我们需要修改开发代码以期可以通过这个测试
这里依旧是只能通过测试而不能实际满足需求的代码,但他能通过测试啊(这就够了,在这个模式下的核心是测试,开发只需要保证能通过所有测试就行,如果程序最后不符合需求,或者干脆有问题,这个锅有测试人员背【doge】,所以作为开发人员我很喜欢这个模式,可以让开发翻身)
接下来的测试就比较难编写了,测试需要的是可控,但有了随机性,就很难确保断言失败是因为随机性还是结果不符合需求,但是我们现在是什么情况,我们是白盒测试,白盒测试意味着什么,意味着我们可以通过对代码实现部分的了解来绕过随机性,让测试结果变得可控
那么要如何做到这一点呢,首先我们需要知道一个通过池来实现的抽卡功能应当是什么样子的,这里我们只阐述一种最基本的(高端功能往往是出于做生意的目的产生的,例如有限池子往往让高价值的奖品尽可能的晚点出现【否则大奖早早就出货了,后面自然也没有人参与了】,有保底的无限往往会让保底之外的大奖出现在距离保底较近的位置【这里是假设你有运气抽到保底之外的情况下,但由于现在这种池子都开始进行出现大奖就重置保底的情况,也不好说到底是不是无限池了】,etc.),池本身就是抽取的范围,物品的占比就是在池中的数量,每次抽取前对池进行一次洗牌(洗牌算法在后续使用到的时候会补充,但作为一种简单的算法,各位可能也早已掌握),然后生成一个范围在0到池长度-1的index,取出对应位置的奖品即可,这种方式较为传统,但如果占比数值设计的太低,而物品种类有极多的情况下,抽取结果可能会与理论期望相差很大(现在依旧使用这种抽取方式的应该已经很少了,但我们的主要目的不是探究抽卡【毕竟探究这个的up主很多,有附带代码的,也有只是游戏杂谈的up,轮也轮不到在下置喙】,而是测试,这里我们以代码会是这样实现的为前提来进行测试)
在我们开始对以上讲诉的功能进行较为复杂的测试之前,先来确保我们能正确的获得某一个物品的概率(否则测试人员将因为开发人员的老油条行为而失去奖金【doge】)
为了确保断言不会因为浮点型不能直接比较而无法正常工作,我们将使用分数来表示(无需使用库,就仅提供最简单的比较功能即可)
一点点简单的代码(当然可以直接使用usize,使用泛型完全没有必要,真的,相信我,在下只是手痒)
然后编写测试
然后又是喜闻乐见的通过测试环境
再次伪实现
为上述测试追加测试更多物品项,并追加断言
于是再次编写能通过测试的代码(注意该代码依旧包含错误【没有对实际池子进行洗牌】)
以上代码非常简单,应该是各位能一眼看明白的类型,这里就不过多的介绍了
下一章将讲如何绕过随机性,让结果可控(单元测试中的mock)
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ri-ji/42650.html