JUnit5参数化测试的几种方式
参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量、用户参数、CSV文件、函数助手,那么JUnit5有哪些参数化测试的方式呢?
参数化测试一直是津津乐道的话题,我们都知道JMeter有四种参数化方式:用户自定义变量、用户参数、CSV文件、函数助手,那么JUnit5有哪些参数化测试的方式呢?
pytest的断言把Python语言简洁的优点发挥的淋漓尽致,因为它用的就是Python的标准断言assert。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 SpringApplication By default, INFO logging messages are shown, including some relevant startup details, such as the user that launched the application. Lazy Initialization When lazy initialization is enabled, beans are created as they are needed rather than during application startup. spring.main.lazy-initialization=true @Lazy(false) annotation:disable lazy initialization for certain beans Customizing the Banner adding a banner.txt file to your classpath or by setting the spring.banner.location property to the location of such a file. If the file has an encoding other than UTF-8, you can set spring.banner.charset. ...
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 本文开发内容 pytest登场!本文将在Django中引入pytest,原理是先执行tep startproject命令创建pytest项目文件,然后从数据库中拉取代码写入文件,最后调用pytest命令运行用例。为了提高运行效率,用例运行是并行的,采用了多线程和多进程,两个都有,这在最后有个单独小结进行比较完整的说明。因为用例运行是异步的,所以前端并不知道什么时候执行完才能拿到运行结果,可以发多个HTTP请求轮询,但这种方式并不优雅,本文将采用WebSocket来实现用例结果查询。具体内容为: cases/<int:pk>/run运行用例接口 ws/teprunner/cases/<int:case_id>/result/用例结果查询接口 projects/<int:pk>/export下载项目环境接口 前端添加WebSocket请求 知识点涉及有点多:tep、pytest、同步、异步、多线程、多进程、回调函数、WebSocket、长连接、全双工、ASGI、WSGI、打ZIP包、文件字节流传输。 编写后端代码 编辑requirements.txt,添加tep和channels: tep==0.6.9 channels==3.0.3 tep是用来创建pytest项目的,channels是用来实现WebSocket的。 编辑teprunner/urls.py文件,添加HTTP路由: 首先实现run接口,新建teprunner/views/run.py文件: 这是运行用例的主体流程: 第一步从请求中获取用例id、运行环境、运行人,这里演示了获取user数据的两种方式:接口传参和从token中解析。然后根据project_id,run_env,user_id定义了pytest项目的路径。 第二步使用tep startproject创建项目文件,清空fixtures和tests目录,目的有两个:一是清掉tep默认fixtures和示例cases,防止对平台产生干扰;二是保证每次运行目录都是干净的,就不用单独去处理前端手动删掉fixture/case后,文件残留的问题。然后从数据库中拉取环境变量、fixtures等数据更新文件。 起多个线程,分别执行用例,执行前先拉取用例代码写入文件,这里是单条用例运行,之所以要用for循环,是因为用例迟早是要批量执行,在设计时就考虑到,避免后面走弯路。然后删掉数据库运行结果,通过subprocess起子进程调用pytest命令,最后在线程的回调函数中根据pytest_result保存用例结果到数据库中。 注意!run_case接口不会直接返回结果,前端是用WebSocket来查询结果的。 图中很多函数和类是我封装的,一个一个拆解来看: 这里定义了Django中存放pytest项目的目录文件,project_temp_name是按照project_id、env_name、user_id来划分的,目的是让运行目录尽量隔离开来,不要相互影响,借鉴了Docker容器的思想,可以把这个目录视为用例运行容器。继续: tep startproject命令创建pytest项目,pytest文件有特定组织方式,比如conftest.py文件等,tep提供了脚手架一条命令创建项目结构。继续: fixture_env_vars.py里面存放了tep的环境变量,Django这里每次都从数据库的env_var表中获取数据,动态更新到文件里面。setdefault是个骚操作,这行代码等价于: if env_name in mapping.keys(): mapping[env_name][name] = value else: mapping[env_name] = {name: value} 继续: 分别从数据库中获取代码写入fixture文件和case文件,把前端传参的运行环境写入conf文件。继续: 清空fixtures目录,清空tests目录。继续: pull_tep_files是写环境变量,写fixture文件,写conf文件三步的集合,复用代码。pull_case_files通过yield定义为了生成器,它和list的区别是不会一次把所有数据产生到内存中,而是每次用的时候产生一次,节约内存开销。delete_case_result用于运行用例前删除case_result表里面已经存在的这条用例的数据。case_result按照用例id和运行人存的多条,每个运行人都有一条属于自己的运行数据,避免数据相互干扰,返给前端的是运行时间最新的那一条! 继续: subprocess.getoutput()可以执行shell命令并返回执行结果,这里就拿到了pytest控制台日志,这个函数是在线程池中异步执行的,主线程不能一直等待它执行,所以需要有个回调函数,等它自己执行完了去调用这个回调函数。save_case_result就是个回调函数,它的入参pytest_result等于pytest_subprocess函数返回的元组,拆包后就能拿到outout、cmd、case_id、run_env、run_user_nickname,从中解析出result和elapsed后,就可以存库了,无则新增,有则更新。 run接口做好了,再接口做下载环境接口,编辑teprunner/views/project.py: 打包的代码是从网上找的,把source_dir打包成zip_filename文件。继续: file_iterator函数也是网上找的,把二进制文件读取为字节流,传输给前端,需要使用StreamingHttpResponse对象并添加Content-Type和Content-Disposition。红框的代码跟run接口类似,区别在于目录换成了export_temp_dir(),且不包含测试用例,生成zip文件后会把导出临时目录删掉,防止冲突。 两个HTTP接口做完了,开始实现WebSocket。WSGI一种网关接口,是Python为了解决Web服务器端与客户端之间的通信问题而产生的,不支持WebSocket;ASGI是WSGI的扩展,意思是异步网关接口,支持WebSocket。编辑teprunnerbackend/urls.py文件: 添加了WebSocket路由。编辑teprunnerbackend/asgi.py文件: 添加websocket的URLRouter,http保持默认。编辑teprunnerbackend/settings.py文件: INSTALLED_APPS中添加channels,继续: 添加ASGI应用配置和CHANNEL配置。CHANNEL_LAYERS是一种通信系统,允许多个Consumer实例之间互相通信,以及与外部Django程序实现互通。学习版这里使用的InMemory。 生产中不建议使用InMemory,可能会有性能问题,而是应该使用Redis: CHANNEL_LAYERS = { "default": { "BACKEND": "channels_redis.core.RedisChannelLayer", "CONFIG": { "hosts": [("127.0.0.1", 6379)], }, }, } 最后,编辑teprunner/views/case.py文件: ...
tep是一款测试工具,在pytest测试框架基础上集成了第三方包,提供项目脚手架,帮助以写Python代码方式,快速实现自动化项目落地。
小伙伴B,测试过程中时刻充满了学习呀,工作中对自己需求的部分搞清楚,就涉及到很多知识点的学习呀,比如去了解开发咋实现的,然后你如何去测试。
Django默认是前后端绑定的,提供了Template和Form,现在流行前后端分离项目,Python大佬坐不住了,于是便有了Django REST framework:https://github.com/tomchristie
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 测试环境困局 测试环境治理专项是在我入职2个月接手的活,用“烂摊子”来形容一点也不为过。年久失修,需求基本没有在测试环境使用,想用也有很多问题。人员缺乏信心,之前负责测试环境的同学抱怨极多,外部推不动,内部又没有技术能力支撑,负能量已经蔓延到整个团队。当然,我也是其中一员,这事确实难搞。在技术部测试环境平台化的大方向下,需要每个组出一个接口人来牵头,考虑到我以前写过测试平台,乱七八糟的事都整过,老板就指定了我。 What,测试环境是什么? 测试环境是一套能够支撑业务系统运行的环境,是相对于预发环境和生产环境来说完全隔离的环境。测试环境=应用+数据+配置+依赖服务。应用包含系统应用和中间件等,数据就是测试物料,配置针对测试环境应该有单独的一套,依赖服务要跟外部联调好以后整个环境才是可用的。测试环境治理就是通过内部搭建和外部联调,保障业务系统能够在完全隔离的环境中运行。 Why,为什么要做测试环境? 测试环境是为了隔离。如果只有一套生产环境,那么开发、测试、上线等活动,可能会对线上系统稳定性造成影响,可能会污染线上用户数据,可能引起客户投诉甚至资产损失,所以需要有一套完全隔离的测试环境。 Who,谁来负责测试环境? 每个测试人员都需要具备测试环境搭建能力。当然可以推动运维或研发来搭建测试环境,但是测试人员需要具备搭建能力,能够自主编译,构建,部署,遇到问题能够根据日志做初步定位,将问题抛出推动研发或外部依赖方解决。 When,什么时间做测试环境? 测试环境治理需要前置到研发自测阶段。在实践过程中,测试同学暴露出来最多的问题是,没有时间投入到测试环境搭建中,一方面是缺乏动力,不肯迈出艰难的第一步,另一方面也是跟项目节奏有关,研发就算用测试环境自测,也会在预发联调好以后再提测,到测试手上时,已经有可用的预发环境了,就不会再去用测试环境。“项目时间紧,测试环境不好用,直接用预发测吧”,顺理成章的就成为了很合理的借口。所以需要从提测,前置到,研发自测,做测试环境治理: Where,从哪里入手测试环境? 测试环境治理需要从上往下才能推动,先有文化,才有行动。假如只有某个部门想做测试环境治理,外部依赖基本上是推不动的,一个人呐喊得再愤怒其他人也可能无动于衷。所以得先把测试环境治理这件事,跟老板沟通,从高层入手,把它定义为一项政治任务,从上往下层层递进。 How,怎么做测试环境? 工欲善其事,必先利其器,公司的基建比较完善,给测试人员搭建测试环境降低了很大难度。设想一下,假如只能折腾Docker和K8S,那可能需要专门的运维才能搞得定环境,对测试来说门槛就会比较高了,除了少数技术能力强的,其他同学基本没有什么可操作性。测试环境平台化就是武器。公司有个部署平台叫做JDOS,日常运维都是在这上面操作,没有运维人员,环境全靠开发人员和测试人员自己整。JDOS已经是页面化操作了,但它对测试环境没有特殊的应用场景,是个大而全的平台,所以二级部门开了一个测试环境平台,Env,“一款全流程自动化测试环境搭建的利器”。 Env的核心思想是1+N。1代表稳定分组(分组≈Pod),搭建稳定分组需要经过创建系统,创建应用,创建集群,申请机器,代码编译构建,部署镜像,修改配置等操作,需要选取master稳定版本,这样才能对外提供稳定服务。N是克隆1产生的多个分组,相互隔离,能让开发同学复用测试搭建好的环境,完成冒烟自测等过程;也能在多业务联调测试时,通过平台快速搭建一套全链路测试环境。 Env提供了环境监控的功能。对于搭建好的稳定环境,它可以每天监控机器是否可用,服务是否正常,镜像是否老旧,等等等,让你及时维护环境,保障稳定性。 Env提供了一键搭建的功能。新克隆的环境,只要点一下“一键搭建”,就会基于稳定分组,自动化搭建一套新环境,大大节约了时间成本。 Env提供了拓扑画图的功能。将多个应用拖到一张拓扑图里面,根据依赖关系连线,能够直观了解到应用之间的依赖关系。基于拓扑来克隆新环境,也能批量克隆多个应用。假如多项目需求并行迭代,想要多套联调的测试环境,就可以克隆多套新环境。 Env还解决了一个资源浪费的问题,以前搭建测试环境比较随意,申请资源也很容易,其实会导致很多机器用过后,一直空置在那里。Env收拢了申请资源入口,基于Env来创建稳定分组,只能有1个,想要更多必须走审批。而对于克隆的新环境,也会有期限,14天以后会自动释放,想要延期也必须走审批。 我所负责的第一件事,就是用Env来搭建一张拓扑图,把组内所有应用都从JDOS迁移到Env上,维持稳定环境对外提供支撑对接,克隆环境对内支持多项目并行。 搭建测试环境只是起步,测试环境治理的目标是需求能够使用测试环境。对于外部依赖少的业务模块来说,这相对容易。对于外部依赖很多的业务模块来说,这就很难了。那么该如何推动这件事呢? 第1个策略是共建,让研发和测试一起来搭建和维护测试环境。 第2个策略是做功能验证,梳理出链路用例,跟踪验证结果,识别卡点问题: 对于卡点问题的处理,把干系人单独拉群对,响应超过3天就往上抛,一定会遇到推不动的问题,那么办法只能找自己的上游负责人,层层向上反馈,让上面的负责人去找对方负责人,然后推动对方的下游同学来协助解决。卡点问题记录后需要做问题分类,做好统计,这既是工作量的体现,也是每周进度汇报的依据: 第3个策略就是制定kpi,强制大家使用测试环境完成绩效。 How much,测试环境做到什么程度? 测试环境的kpi能反应出测试环境应该做到什么程度,可以使用需求使用测试环境占比和测试环境bug占比。需求使用测试环境占比的计算公式是打标了测试环境的提测卡片数/总的提测卡片数,测试在点击开始测试时,选择是否使用测试环境进行打标。测试环境bug占比的计算公式是测试环境bug/(测试环境bug+预发环境bug+生产环境bug),在提交缺陷时选择环境类型进行打标。测试环境bug占比的意义更大,因为使用测试环境与否,最终的体现还是落在缺陷上面的,比较容易量化,需求使用测试环境占比不是很确定,需求多少功能在测试环境使用了,相对来说不是很好度量,但也可以作为辅助指标进行观察。 测试环境破局 测试环境关联了很多东西,比如物料、自动化、精准、流水线等,都可以围绕测试环境来做文章。测试环境既是团队重点,也是是我个人的大案例,目前已经解决了部分困难,要想做出一鸣惊人的成绩,还需要站在更高的角度去看待整个事情,这也是一个全新的挑战,需要不断刷新自己,突破。
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 条件控制 我们都知道流程图是有多个分支的,程序中也是如此,在Python中是用if语句来判断程序该走哪个分支的。它的执行过程如下: 代码执行过程如下 if if语句的一般形式如下: if condition_1: statement_block_1 如果condition_1为True,执行statement_block_1。 condition_1是条件表达式,由各种运算符和数据类型组成,条件表达式的结果可以是True/False的布尔值,也可以是非布尔值。Python中的0、None、空列表、空字典等都会被认为是False,反之都会被认为是True。 else else语句在条件为False时执行: if condition_1: statement_block_1 else: statement_block_2 如果condition_1为True,执行statement_block_1。 如果condition_1为False,执行statement_block_2。 elif if…else实现了“如果满足条件,那么xxx,否则xxx”,除此之外,还可以用elif实现多个连续判断,分别执行不同的语句: if condition_1: statement_block_1 elif condition_2: statement_block_2 else: statement_block_3 如果condition_1为True,执行statement_block_1。 如果condition_1为False,再判断,如果condition_2为True,执行statement_block_2。 否则,执行statement_block_3。 elif可以写多个。这种写法的执行顺序是从上往下,只要满足了某个if或elif的条件,就会在当前分支执行后跳出去,不再执行后面的判断,如果每个if或elif的条件都是False,最后就会执行else。 if嵌套 假如想满足if或elif的条件后,继续做判断,那么就需要进行if语句嵌套,让statement_block_1等代码块也包含if语句: if 表达式1: 语句 if 表达式2: 语句 elif 表达式3: 语句 else: 语句 elif 表达式4: 语句 else: 语句 示例: ...
本书作者:测试开发刚哥,文章版权归个人所有,未经授权请勿转载。 1、mindsdb 加星数:26.4k 技术栈:python,SDK (Golang, js, ruby, rust, C#, java, Cli) GitHub地址:https://github.com/mindsdb/mindsdb 项目介绍:MindsDB是一个开源的机器学习平台,旨在简化AI模型的创建、训练和部署过程。它允许开发者使用熟悉的SQL查询语言来构建和操作机器学习模型,从而降低了AI开发的门槛。 2、Mattermost 加星数:30.3k 技术栈:TypeScript, Golang GitHub地址:https://github.com/mattermost/mattermost 项目介绍:Mattermost是一个强大的开源协作平台,特别适合软件开发团队。它提供了丰富的功能和高度的可定制性,确保团队在整个软件开发生命周期中能够高效、安全地协作。通过自托管,用户可以完全控制他们的数据和平台的运行环境。 3、Kong 加星数:39k 技术栈:Lua, Perl, Raku, Starlark, Shell, Python GitHub地址:https://github.com/Kong/kong 项目介绍:Kong API Gateway是一个功能强大且高度可扩展的API网关,适用于各种环境。它以高性能和丰富的功能集(如安全性、负载均衡和监控)而著称。通过插件系统,Kong可以轻松扩展其功能,满足不同用户的需求。此外,Kong还提供了高级的AI功能,支持多种大语言模型,帮助用户实现智能化的API管理和优化。 4、Taipy 加星数:12.5k 技术栈:python, typescript GitHub地址:https://github.com/avaiga/taipy 项目介绍:Taipy是一个强大的工具,专为数据科学家和机器学习工程师设计,帮助他们构建数据和AI的Web应用程序。通过简化开发和部署流程,Taipy使用户能够专注于数据和AI算法的开发。其仅需Python语言的特点,使得用户无需学习新的编程语言,从而降低了使用门槛。Taipy还提供了强大的UI生成和场景/数据管理功能,进一步简化了项目的开发和管理。 5、appwrite 加星数:44.1k 技术栈:TypeScript, php GitHub地址:https://github.com/appwrite/appwrite 项目介绍:Appwrite是一个强大的端到端后端服务器,专为Web、移动、原生或后端应用程序设计。通过抽象复杂性和提供一整套现成的API和工具,Appwrite使开发者能够更快地构建安全的应用程序。其Docker微服务架构还使得部署和扩展变得更加方便。 参考资料: https://dev.to/rohan_sharma/top-open-source-reposprojects-to-contribute-hacktoberfest-edition--273o