前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何测试这个方法--功能篇

如何测试这个方法--功能篇

作者头像
FunTester
发布2019-12-17 10:56:40
5900
发布2019-12-17 10:56:40
举报
文章被收录于专栏:FunTesterFunTester

★本文题目来自于知识星球,后台回复“知识星球”可参与问答。 ”

前两日得到一个朋友的交流,他们有一个产生唯一订单号的功能,把代码单独提出来了,问这个方法有什么问题吗?改怎么测试?先把代码放出来,如下:

代码语言:javascript
复制
  /**
     * 生产唯一的交易订单号
     *
     * @return
     */
    public static String createUniqueOrderNo() {
        SimpleDateFormat nyrsfm = new SimpleDateFormat("yyyyMMddHHmmss");
        return nyrsfm.format(new Date()) + getRandomLengthCode(4);
    }


    /**
     * 获取随机的短信验证码
     *
     * @return
     */
    public static String getRandomLengthCode(int length) {
        return String.valueOf((int) ((Math.random() * 9 + 1) * Math.pow(10, length - 1)));
    }

第一个是生产订单号的,第二个是产生一个四位随机数的方法。先说第一个方法的思路:订单号分两部分,一是时间(按照这种yyyyMMddHHmmss格式的),第二部分就是四位随机数。第二个方法:产生一个[0,1)之间的double类型的数字,然后通过一个算式(*9+1)得到一个[1,10)之间的数字,然后在乘以10的某次幂(这里是3),得到一个[1000,10000)的数字,然后强转成int类型,得到[1000,10000)范围的四位整数。

解释完毕,下面分享一下我对这个方法的认识。一开始我俩讨论的中心问题是一个:会不会产生重复的订单号。答案显而易见,解释起来如下:时间精确到秒一级,然后随机数范围粗略计算就是9000个,如果在一秒钟以内生成了9000+个订单,那么肯定会有重复的。

那么如何测试呢?或者说改怎么提这个BUG呢?

我提出了两个方案:一是口头或者文字解释,如上内容;二是通过测试产生重复订单号。

方案一:

看人,看事儿,事实证明,这个方法不太管用。主要原因倒不是开发不承认,而是不觉得有必要改,原因有两点,一是业务量没有那么多,二是发生概率太小了。

方案二:

通过压测产生重复订单号,管用很麻烦,试了N多次也没产生重复订单号。主要原因是测试环境性能太差,大概就是几十QPS(整个订单接口),过长时间压测会导致服务不稳定,脏数据太多。

下面是知识星球的合伙人给的方案:

★年月日时分秒加➕短信验证码构成唯一的订单号。隐患:如果在特定环境,多台服务器一起跑,可能出现相同的订单编号。建议设定用户的唯一值,例如名称。建议使用UUID。代码如下: ”

代码语言:javascript
复制
  /**
     * 生产唯一的交易订单号
     *
     * @return
     */
    public static String createUniqueOrderNo() {
        return UUID.random.toString;
    }

更多的办法还是把这个方法拿出来单独进行测试,不需要使用多线程。一个for循环遍历记录很快的,分享一下我的测试代码:

代码语言:javascript
复制
 public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        range(250).forEach(x->
        {
            String randomLengthCode = getRandomLengthCode(4);
            if (list.contains(randomLengthCode))
                output(x);
            else
                list.add(randomLengthCode);
        });
    }

抛砖引玉,如果有更好的办法,欢迎留言或者去知识星球一起交流。

其次我还关注到了性能问题,这个有机会再细聊。

解决方案比较多,很多框架都是支持的,一般也都会跟用户的身份ID相关。说一个比较简单的:订单号多加一条唯一标签如用户ID,然后接口限制用户产生订单频率,(比如5s钟只能下一单)。


本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方案一:
  • 方案二:
  • 下面是知识星球的合伙人给的方案:
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档