测试 有随机性、或者与外界某些条件相关 (比如时间) 的程序该以什么思路写测试呢?

nagae_memooff · 2014年02月08日 · 最后由 jimrokliu 回复于 2014年02月09日 · 2233 次阅读

如题。我现在在写测试中遇到一些问题,比如: 1、有的接口可能在低并发时不会显示出问题,但高并发(或者网络条件不太好)的情况下会出 bug; 2、有的接口可能会在特定的时间内做特定的事情; 3、有的接口在服务器端执行了许多代码,但其中一部分行为是行为客户端难以获知(或者无需获知)的; 4、有的接口返回结果具有一定随机性,难以准确测试出来。

这样的程序,我想有没有一个比较好的思路去写测试呢(与测试所用的工具无关是最好的)?举几个例子吧。

第一个例子,我们可以设想一个多玩家一起打 boss 的手游。boss 被所有玩家共享 HP,最终击杀 BOSS 的玩家、总共让 BOSS 的 HP 减少得最多的玩家、参与打 BOSS 的玩家分别获得不同的奖励。boss 在特定时间后(比如每天 12:30 以后)允许玩家攻击,如果 20 分钟内没有击杀 BOSS 则今日挑战失败,等等。 然后某些接口可以根据今天的挑战是否结束,决定返回今日或是昨日的战报,等等。

这个例子主要涉及到第一和第二个问题:时间问题、高并发、网络不太好的情况下的问题。我目前还没有想好该以什么思路写测试,不知道大家有什么意见?

第二个例子,比如我们的服务器端有一个接口,这个接口获取客户端提交的 session_key,然后根据特定的逻辑和条件(不管这些条件储存在服务器端还是客户端,对这个例子没有影响)来给用户的数据库里发一个奖励道具。由于多种原因,现在的客户端不会实时从服务器端拉取更新后的道具列表。那么这个接口会把增加的道具的键名和数量发给客户端,让客户端能够把道具更新在本地。 那么问题来了:假如我日后重构了这个接口,但服务器端增加的道具并没有实际加到数据库里,就返回给了客户端正确的响应,那么我们的功能测试是很难测试到这种情况的。当然,我们可以调用道具列表接口,比较增加前和增加后的列表,但这麻烦,并且需要重复造轮子。 这个例子主要涉及到上面第三个问题。

第三个例子,比如我有一个{道具=>概率}的键值对数组,或者是我有一个指定方差和均值的正态分布模型,我需要按照指定的分布来获取随机结果。这样的测试,我们如何测试它返回的结果是真实(或者至少是接近)的分布呢?

我想到的办法是多次请求这个接口然后统计返回结果。但这样做成本比较高,不知道有没有什么简单的思路?

第一个问题,高并发下会进行专门的并发测试,而线程安全本身就比较难测试的项目。有一种办法是构造一些特殊 id 的数据发送给服务器,预期并发执行之后,每个受影响的帐户都会出现特定的规律,然后检查数据是否存特定的规律。 第二个问题,并不需要再特定的时间测试程序,而是程序要拆分特定时间实现的功能和特定时间的控制机制,分别测试这两个单元,而将这两个模块配置一起工作的代码不需要测试。 第三个问题,一些 api 影响的逻辑估计不容易直接测试,只能将影响的部件拆开测试。 第四个问题,概率测试需要用假设检验,可以看概率的假设检验方法。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号