最近在写一个Springboot项目时,需要接入Swagger功能,过程中遇到了几个问题,其中就数@requestBody不兼容Swagger的情况最难受,其他还有遇到问题,这里整理一下,分享一下解决方案。这里希望把Swagger当做一个接口文档展示和接口调试的工具,而且支持测试环境和上线后的环境。@requestBody兼容性问题关于这个问题网上搜到的两个方案排名靠前:1.通过环境配置,分开线上
最早提到接口测试的优点时,有一个就是执行效率提升,可能是UI层面执行的N倍。但是今天我要分享的这个案例这个优点的升级版本。某个接口参数倒是不多,但是每个参数的范围略大,最大的将近500个枚举范围,小的也是20个。如果把所有参数组合穷举完,粗略估计可能10亿级别的。需求就是要把这部分所有参数组合都遍历进行测试,然后我就开始了踩坑了。初版方案一开始的想法就是多个循环嵌套,然后并发发起请求,实现起来非常
这是一篇有关GroovyShell的帖子,以及它如何在日常工作中为您提供帮助(只要您是软件开发人员)。无论您使用哪种编程语言或技术,都可以从GroovyShell中受益。唯一真正的要求是您能够编写(和阅读)小段Groovy代码。入门我认为Groovyshell的目的最好由官方文档来描述:GroovyShell,又名。groovysh是一个命令行应用程序,可轻松访问以评估Groovy表达式,定义类并
在之前文章Java自定义异步功能实践(https://mp.weixin.qq.com/s/Dw4Gtwuivid0bm61pFwEiQ)中,我仿造Go语言中的go定义了fun作为Groovy/Java异步执行的关键字。通过一个定长的线程池执行异步任务。经过一段时间的使用,效果非常好,既能满足当下的需求,在实现的过程中也锻炼了自己对线程池的理解。通常的使用场景分为:异步上报数据、大量任务需要多线程
在批量使用测试账号的时候,需要对账号进行标记,一般用username字段,之前的策略是统一的名称+用户编号(测试用户的编号,非用户id),由于需求变更,用户username不允许使用数字了,所以需要把数字转成汉字来进行标记。下面分享集中方法:privatestaticStringchange1(intn){//数字转换成汉字表示Stringc={"零","壹","贰","叁","肆","伍","陆
在去年年初换过工作开始专注做性能测试,其中有一项很大的挑战就是FunTester测试框架性能是否可以支撑公司现在的业务。之前有文章分享过如何突破职业瓶颈(https://mp.weixin.qq.com/s/A07I_Kn7FlEPG2wSKk8zOg),其中讲到如何负责服务的QPS上升一个数量级是一个非常大的挑战。最近在这个问题上,我有了一些新的发现,分享一下自己对FunTester测试框架使用
在接口测试过程中,某个线程连续两次请求中间都会消耗的时间,线程在收到响应进行第二次请求的时候会消耗一些时间,比如进行结果验证,日志存储,或者进行数据统计等等。一般来讲这些时间都是微秒级别的,偶尔会遇到一些毫秒级别的,比如这次:线程安全类在性能测试中应用(https://mp.weixin.qq.com/s/0Y63wXqIugVC8RiKldHvg),中间参数签名的消耗时间在10ms级别,如果在并
在很早之前我就有个想法,如果有一个服务能把我的请求放大N倍发送给服务端,那就可以更加灵活地将接口的功能测试用例和性能测试用例结合在一起。只需要设置一些参数,就可以在本地控制请求QPS,比如每秒100次,然后通过服务器放大100倍,那么请求到被测服务的QPS就是10000倍了。但是由于当时技术水平比较菜,主要考虑到:1、当时面临被测服务的QPS有限,不需要这个功能;2、为了这个需求写个用不到的服务,
前文说道从手动测试到自动化测试(上)(https://mp.weixin.qq.com/s/zcouE06eNEtAVUFnFjRIg)20221010,接下来分享后面的内容。自动化什么对于初学者来说,重要的是要记住自动化测试并不是适用于所有测试场景的灵丹妙药。但是,通过注意下面描述的以下几点,可以选择要自动化和不自动化的内容:成本假设你有频繁的发布进入。在这种情况下,首先自动化冒烟测试和回归测试
随着软件需求的变化比以往任何时候都更快更频繁,越来越多的团队正在采用敏捷方法来实现更短的开发周期和更快的迭代时间。在这个瞬息万变的IT环境中,应用程序的软件质量比以往任何时候都更加重要,手动测试似乎很耗时、重复并且容易出现人为错误。从手动测试转向自动化测试的必要性非常适合快速变化的技术环境。与手动测试相比,自动化测试在很大程度上可归因于更高的测试覆盖率以及更早期发现和解决问题的灵活性。虽说如此,手
我在项目里面都是Java和Groovy混这写,之前逻辑是框架和工具类用Java,脚本用Groovy。但是随着时间推移,Groovy相对Java的优势过于明显,搞得自己把自己搞混乱了。其中遇到了一些兼容性问题,典型的就是Java的function和Groovyclosure之间的兼容性问题。Javafunction包里面很非常多实现类,其中主要区分的返回和参数个数,然后有很多具体返回和参数类型的实现
之前说要写个Go语言版本的Redis操作API和性能测试的系列,没想到鸽了这么久才写了一半。实在实力不济,不仅需要多充充电,更需要结合实践,劳逸结合。首先来一个前文回顾:Go语言RedisAPI基本功能实践(https://mp.weixin.qq.com/s/9EgEVVlFNP91hYiDpeKw)20220623RedisAPI——List功能实践与性能测试【Go版】(https://mp.
队列通常是软件设计模式中的基本组件。但是如果每秒接收到数百万条消息,改如何处理?如果多个消费者都需要能够读取所有消息,又改如何处理?难道需要把所有消息的数据都放在内存中吗?这样JVMGC又表现如何?之前我写过几个流量回放模型:基于时间戳的日志回放引擎(https://mp.weixin.qq.com/s/cdvlYc5W0sI72VTqlRtIjA)20220822千万级日志回放引擎设计稿(htt
今天分享Java对象序列化的不同方法,并对不同序列化方式的性能进行基准测试。关于持久队列来讲,必须将Java堆内存的对象转换成文件中的二进制数据,对象序列化的性能将显著影响整体的性能表现。相当多的高性能框架都会在序列化和反序列化上下功夫优化性能。本文使用了开源框架ChronicleQueue提供的能力进行序列化和反序列化对比测试。数据传输对象在本文中,我用一个对象类FunData,作为DataTr
前段时间我关注了一篇文章,分享如果使用并发压测发现BUG。突然想起一个话题:线程不安全需要多少QPS压测才能发现BUG?我接触到的并发缺陷绝大部分是因为线程安全问题导致的,还有一些数据库锁的问题(这个不擅长)这里就不分享了。关于Java的一些线程安全的问题,可以参考旧文:操作的原子性与线程安全(https://mp.weixin.qq.com/s/QU3llkGLepX2VCch8Y9GKw)20
JUnit是一个基于Java的开源框架,可帮助测试人员执行单元测试。JUnit主要用于测试应用程序的每个单元或组件,例如类和方法。它有助于编写和运行可重复的自动化测试,以确保项目代码按预期运行。还可以使用JUnit执行Selenium自动化测试用例,以测试Web应用程序或网站。在我们开始讨论Selenium中的JUnit注解之前,让我们快速回顾一下JUnit在测试人员社区中流行的原因。为什么JUn
之前写过一个日志回放引擎的第一代千万级日志回放引擎设计稿(https://mp.weixin.qq.com/s/hkSnyGG5cDPpBsdLaappaw),当时理解的日志回放就是把日志记录的请求重新发出去,这就是回放线上用户的流量了。可是在我最近看goreplay的过程中,重新刷新了我的认知。查阅了一些资料,终于算是了解了一些基于时间戳的方案和思路。大体如下:通过工具把线上某段时间的流量记录下
最近在读《卓有成效的工程师》,其中在《精益求精,优化学习方式》这一章节小标题培养成长型思维模式的内容,让我突然多了一层感悟。提起成长型思维,就不得不提另外一本书《终身成长》,作者卡罗尔·德维克。其中让我印象最深的就是:人的能力是可以改变的。之所以想起来这个信念,是因为一个现象,总有人愿意把自己遇到问题,原封不到的丢到网上、社群里,请教各路大佬。在学习的过程中,我有一个非常有用的经验,遇到问题,先看
Groovy中的Map,不仅兼容了JavaAPI提供的各种功能,还拓展了许多特殊语法和功能方便测试人员在使用的过程中提高效率,更快地构建测试脚本。下面我就从几个方面分享一下GroovyMap的神奇之处。创建Java中通常创建一个Map的常用语法Map<Integer,Integermap=newHashMap();。而在Groovy中,我们可以使用语法k:v来创建Map。相当于给Map对象初始化赋
前文提到Go语言RedisAPI基本功能实践(https://mp.weixin.qq.com/s/9EgEVVlFNP91hYiDpeKw),以及后续的学习实践计划,由于总总原因耽搁了许久。终究是计划赶不上变化,学完Go语言操作Redis的常用功能之后,我打算把API实践、封装、简单性能测试场景放在一起写。今天分享一下Redislist常用操作API的实践和性能测试,API的封装会放在文末。常用
相信大多数测试er在学习相关技术的时候,都看过对应的视频教程。无论是在线和离线视频都是一个非常好的学习提升自己的路径。在前段时间的学习过程里,我不禁问了自己一个问题:视频学习是主动学习还是被动学习?先让我们看一下两者的区别。主动学习主动学习是一种学习者重度参与的学习方式,是一种以学习者为中心的学习方式。学习者需要以探索者的角色进入学习状态,需要自己的思考、判断,方能融会贯通。被动学习被动学习是传统
动态接口比例性能测试实践
在之前的动态模型之动态增减【FunTester测试框架】(https://mp.weixin.qq.com/s/nSILD4EsnvQElua6Z109Ow)中分享了动态的性能测试模型的实现,后面在实际工作中也是受益匪浅,有文为证动态压测模型让工作更轻松(https://mp.weixin.qq.com/s/qYlgZfukyVqoEj8nMVC0gA)。这里再重复一下思路,就是通过异步线程接收控
在之前的性能测试中,用到了延迟队列java.util.concurrent.DelayQueue的功能下单延迟10s撤单性能测试(https://mp.weixin.qq.com/s/8xx5L5n6TBgITMAuRrVbfA),其实也是简单使用到了基本的API,演示如下DelayQueue基础功能演示(https://mp.weixin.qq.com/s/2nNkVn0unFUrNY5Jqj4
在互联网行业中,永无止境的讨论主题之一是:敏捷与DevOps。对于这两个概念来说,过程彼此不同;但是它们仍然有一些相似之处。敏捷敏捷方法论是一种实践,它促进整个项目的SDLC(软件开发生命周期)的开发和测试的持续迭代。在敏捷方法中,开发和测试活动是同时进行的,这涉及到SDLC过程中开发和测试的持续迭代。敏捷宣言强调的敏捷软件开发的四个核心价值是:个体和互动高于流程和工具工作的软件高于详尽的文档客户
在上期文章自定义MySQL连接池(https://mp.weixin.qq.com/s/3VYzupjP8URkOYakidNOrg)中,我提到了没找到一个特别合适的MySQL连接池实现,所以自己写了一个基于通用池化框架commonspool2的MySQL连接池,并且模仿了Go语言的gorm框架设计思路,把借和还的操作不暴露给用户,只处理用户发来的SQL语句的思路,封装了一个com.funtest
性能测试中的随机数性能问题探索
前些日子写了JavaRedisstream的基本API实践和封装文章:RedisstreamJavaAPI实践(https://mp.weixin.qq.com/s/ZellC9euYVdHYDh0HeWtw),自然地也需要对这些API进行性能测试。总的来说,Redisstream的API跟list操作的API差不多,就是添加、读取、删除一类,对于消费组的API,由于实际工作中并没有使用,所以暂时
我之前分享了Java和Go语言版本的gRPC接口的服务端和客户端的开发,使用的基本都是基础的原声API,旧文如下:Grpc服务开发和接口测试初探【Java】(https://mp.weixin.qq.com/s/7HZpgbcDFuOnbPyVY5PfvQ)20220420gRPC服务开发和接口测试初探【Go】(https://mp.weixin.qq.com/s/csvLLZ19jPb8FNA6
官方文档链接:https://www.jenkins.io/blog/2022/06/28/requirejava11/。介绍Jenkins项目致力于为最终用户和开发人员提供世界级的平台体验。这种体验的核心是Java,它是一种面向对象的编程语言,具有Java虚拟机(JVM)形式的跨平台运行时。自成立以来,Jenkins项目一直是Java的主要消费者,向超过300,000个控制器的安装基础分发了1,
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号