首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何测试这个方法--功能篇

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

作者头像
FunTester
发布于 2019-12-17 02:56:40
发布于 2019-12-17 02:56:40
68400
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:0
代码可运行

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  /**
     * 生产唯一的交易订单号
     *
     * @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
代码运行次数:0
运行
AI代码解释
复制
  /**
     * 生产唯一的交易订单号
     *
     * @return
     */
    public static String createUniqueOrderNo() {
        return UUID.random.toString;
    }

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何测试这个方法--性能篇
首先来看第一个方法,第一眼看过去,发现一个问题:该类是一个工具类,方法都是静态的。在第一个方法中,SimpleDateFormat对象每次调用的时候都会创建,而且是一样的对象,这里既浪费内存又浪费CPU,总体来讲浪费时间。修改如下:
FunTester
2019/12/17
6520
如何测试这个方法--性能篇
慌:一次订单号重复,差点被开除
原文连接:cnblogs.com/funnyzpc/p/13541713.html
Java小咖秀
2020/09/11
8780
慌:一次订单号重复,差点被开除
血的教训 ,一次订单号重复的事故我差点被开除
本文主要以讨论电商的订单编码规则为案例,其他类型的服务编号设计思路其实也是相似的。
Java极客技术
2022/12/04
1.7K0
血的教训 ,一次订单号重复的事故我差点被开除
简单介绍订单号或者流水号的生成方法
一般订单号或者流水号等可能在一些平台会用到,然后我就简单的介绍一个我自己生成订单号和流水号的一个方法吧,如果程序有问题或者你有更好的生成办法,欢迎留言,留下你的文章链接,我们一起学习和进步哈。
小小鱼儿小小林
2020/06/23
5.8K0
订单场景-基于Redisson实现订单号生成
订单、指定长度随机码生成是业务系统中重要且不可避免的一个需求,往往在电商系统中,业务量、并发量庞大,如何不重复、快速、安全的生成一个订单号成了需要重点考虑的问题。这篇文章我将举一个实际的订单号生成需求,来和大家一起探究基于Redisson实现订单号的生成。
关忆北.
2023/12/02
5740
订单场景-基于Redisson实现订单号生成
zookeeper实现分布式锁 顶
神马是分布式锁呢,就是利用服务器集群的特性,如zookeeper或者mysql,redis对多台分布式服务器的进程进行只允许一台服务器的一个进程来进行一个同步操作的过程,其他任务服务器的进程只能等待,进行自旋。
算法之名
2019/08/20
3290
zookeeper实现分布式锁
                                                                            顶
项目笔记之订单号生成规则以及方法,第一篇!
小伙伴们在日常的商城项目开发中,都会遇到订单号生成的问题,今天呢小编就带领大家去解读一下生成订单号的问题!    首先,订单号我们要明确它有有3个性质:1.唯一性  2.不可推测性3.效率性,唯一性和不可推测性不用说了,效率性是指不能频繁的去数据库查询以避免重复。况且满足这些条件的同时订单号还要足够的短。不知道小伙伴们在日常的项目中是否也和我一样去思考过生成订单的一些小问题,可能你也会说,这些东西不用想的那么复杂,其实呢,小编也是同意大家的看法,但是殊不知我们做程序的都讲究严谨性,而且在订单模块的开发中,订单号的位置相信大家都知道,所以呢,我们在写这些小程序的时候,不妨花上几分钟去思考一下为什么这样去定义!好了,下面就告诉大家生成订单的办法了!    首先,我们生成订单的方式呢:可以采用时间戳加随机数的方式比如:time().rand(10000,99999);这样呢就生成了一个15位的随机数,时间戳呢精确到了毫秒,而后五位随机数,也去除了高并发状况下,订单号重复的情况,当然了我们也可以把时间戳简单的处理一下变成了:date("YmdHis").rand(10000,99999);这样的方式,相信小伙伴们也注意到了我们一直在使用一个rand的PHP的随机数函数,所以呢,当我们去学习PHP的基础的时候,我们遇到随机数的函数的时候,是不是还在想,这个函数到底是有什么用途的呢?现在小伙伴们是不是应该明白了呢!当然了我们还可以将其封装成一个方法,以备我们相似项目中使用,也提高了我们日常代码的可复用性,使我们的代码的效率也提高了不少,那要怎么封装呢,小编给大家写一个简单的小示例:function
思梦php
2018/02/08
1.3K0
怎样生成全局唯一流水号?UUID、自增主键,你已经Out啦,快来学习定制化雪花算法。
流水号是每个系统永远都绕不开的一个话题,如订单系统中的订单号,物流系统的运单号、银行系统的业务单号等等,不难发现这些单号虽然叫法不一样,但都有着一些相同的共性,那就是全局唯一性。除此之外,一个设计良好的流水号生成规则还应该包含如下特性:
敲得码黛
2021/07/02
10.3K0
静态变量的多线程同步问题 顶
我们先来讨论一个问题,一个类的静态变量当类被多次实例化的时候,静态变量是否会受影响?首先我们应该清楚的是静态变量是在类被JVM classloader的时候分配内存,并且是分配在永久区而非堆内存中。
算法之名
2019/08/20
6680
Java唯一订单编号生成
在Java中生成唯一的订单编号通常需要结合时间戳、随机数和/或序列号等元素来确保唯一性。下面是一个简单的示例,使用当前时间的毫秒值加上一个随机数来生成订单号。为了简化,我们将使用​​java.util.UUID​​类来生成一个全局唯一的UUID,并将其转换成字符串形式作为订单号的一部分。
JaneYork
2025/05/20
1550
女朋友问阿里双十一实时大屏如何实现,我惊呆一会,马上手把手教她背后的大数据技术
阿里双11实时业务量和数据量每年都在大幅增长,去年双11的实时计算峰值达到了创纪录的每秒 40 亿条记录,数据体量也达到了惊人的7 TB 每秒,相当于一秒钟需要读完 500 万本《新华字典》。
Lansonli
2021/10/11
1.9K0
简单聊聊电商系统的订单号生成规则
单号在实际的业务过程中是做为一个订单的唯一标识码的存在,提供订单号就很方便业务人员快速定位订单信息,给予用户帮助。
我只是会一点编程
2022/04/01
2.6K0
Java如何实现生成永不重复的数字方案解读!
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
喵手
2024/12/30
3670
Java如何实现生成永不重复的数字方案解读!
web安全测试必须注意的五个方面
随着互联网的飞速发展,web应用在软件开发中所扮演的角色变得越来越重要,同时,web应用遭受着格外多的安全攻击,其原因在于,现在的网站以及在网站上运行的应用在某种意义上来说,它是所有公司或者组织的虚拟正门,所以比较容易遭受到攻击,存在安全隐患。
宜信技术学院
2019/06/28
5420
zookeeper锁原理(Redis分布式锁)
1.使用数据库实现分布式锁 缺点:性能差、线程出现异常时,容易出现死锁 2.使用redis实现分布式锁 缺点:锁的失效时间难控制、容易产生死锁、非阻塞式、不可重入 3.使用zookeeper实现分布式锁 实现相对简单、可靠性强、使用临时节点,失效时间容易控制
全栈程序员站长
2022/07/29
5990
搞一个短信验证码登录,难吗?
1、构造手机验证码:使用random对象生成要求的随机数作为验证码,例如4位验证码:1000~9999之间随机数;
良月柒
2021/01/07
1K0
搞一个短信验证码登录,难吗?
在 SpringBoot 中设计一个订单号生成系统
在Spring Boot中设计一个订单号生成系统,主要考虑到生成的订单号需要满足的几个要求:唯一性、可扩展性、以及可能的业务相关性。以下是几种常见的解决方案及相应的示例代码:
搜云库技术团队
2024/05/10
4890
在 SpringBoot 中设计一个订单号生成系统
【小工具】批量造PDF文件demo
我每天在思考如何提升测试效率,也许想法还不大成熟,但我也每天慢慢在成长,希望我的一点小分享能够给同在测试路上的小伙伴一点帮助~
用户9913368
2022/07/26
5350
Zookeeper实现分布式锁来获取唯一订单号的实例解析
​ 通常我们在购物的时候都会有一个订单号,那如果在高并发的情况下如何保证订单号的唯一性呢?比如秒杀抢购我我们既要保证性能的可靠(分布式)又要保证不生成重复的订单号,这个时候我们就需要使用到分布式锁,这里我们介绍的分布式锁的实现方式是使用Zookeeper,关于Zookeeper我们这里就不做过多介绍,主要来看它如何实现分布式锁。
Dream城堡
2022/01/07
5300
如何在分布式场景下生成全局唯一 ID ?
在分布式系统中,有一些场景需要使用全局唯一 ID ,可以和业务场景有关,比如支付流水号,也可以和业务场景无关,比如分库分表后需要有一个全局唯一 ID,或者用作事务版本号、分布式链路追踪等等,好的全局唯一 ID 需要具备这些特点:
Java识堂
2020/02/19
1.6K0
推荐阅读
相关推荐
如何测试这个方法--性能篇
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档