学习整理
手机APP测试
Linux
接口自动化框架
Web自动化测试框架

Web自动化学习
性能测试指标
Jmeter系列之Jmeter+Grafana+InfluxDB实时监控
1、硬件上的性能瓶颈: 一般指的是CPU、内存、磁盘读写等的瓶颈,为服务器硬件瓶颈。 2、应用软件上的性能瓶颈: 一般指的是服务器操作系统瓶颈(参数配置)、数据库瓶颈(参数配置)、web服务器瓶颈(参数配置)、中间件瓶颈(参数配置)等 3、应用程序上的性能瓶颈: 一般指的是开发人员,开发出来的应用程序(如sql语句、数据库设计、业务逻辑、算法等)。 4、操作系统上的性能瓶颈: 一般指的是Windows、linux等操作系统,如出现物理内存不足时,或虚拟内存设置不合理(虚拟内存设置不合理,会导致虚拟内存的交换率大大降低,从而导致行为的响应时间大大增加,
可以认为在操作系统上出现了性能瓶颈)。 5、网络设备上的性能瓶颈: 一般指的是防火墙、动态负载均衡器、交换机等设备
Python装饰器、迭代器、生成器
在 Python 中,使用了 yield 的函数被称为生成器;跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器;在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行;调用一个生成器函数,返回的是一个迭代器对象。
使用生成器生成斐波那些数列
装饰器
装饰器:在不改变原函数的基础上,对函数执行前后进行自定义操作。把目标函数作为参数传给装饰器函数,装饰器函数执行过程中,执行目标函数,达到在目标函数运行前后进行自定义操作的目的。
应用场景:如记录函数运行时间;flask里的路由、before_request;django中的缓存、用户登录等。
使用装饰器记录函数运行时间
装饰器在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的装饰器来消除这样的副作用。写一个装饰器的时候,最好在实现之前加上functools的wrap,它能保留原有函数的名称和文档字符串。
Vue生命周期
beforeCreate( 创建前 )
在实例初始化之后,数据观测和事件配置之前被调用,此时组件的选项对象还未创建,el 和 data 并未初始化,因此无法访问methods, data, computed等上的方法和数据。
created ( 创建后 )
实例已经创建完成之后被调用,在这一步,实例已完成以下配置:数据观测、属性和方法的运算,watch/event事件回调,完成了data 数据的初始化,el没有。 然而,挂在阶段还没有开始, $el属性目前不可见,这是一个常用的生命周期,因为你可以调用methods中的方法,改变data中的数据,并且修改可以通过vue的响应式绑定体现在页面上,,获取computed中的计算属性等等,通常我们可以在这里对实例进行预处理,也有一些童鞋喜欢在这里发ajax请求,值得注意的是,这个周期中是没有什么方法来对实例化过程进行拦截的,因此假如有某些数据必须获取才允许进入页面的话,并不适合在这个方法发请求,建议在组件路由钩子beforeRouteEnter中完成
beforeMount
挂在开始之前被调用,相关的render函数首次被调用(虚拟DOM),实例已完成以下的配置: 编译模板,把data里面的数据和模板生成html,完成了el和data 初始化,注意此时还没有挂在html到页面上。
mounted
挂在完成,也就是模板中的HTML渲染到HTML页面中,此时一般可以做一些ajax操作,mounted只会执行一次。
beforeUpdate
在数据更新之前被调用,发生在虚拟DOM重新渲染和打补丁之前,可以在该钩子中进一步地更改状态,不会触发附加地重渲染过程
updated(更新后)
在由于数据更改导致地虚拟DOM重新渲染和打补丁只会调用,调用时,组件DOM已经更新,所以可以执行依赖于DOM的操作,然后在大多是情况下,应该避免在此期间更改状态,因为这可能会导致更新无限循环,该钩子在服务器端渲染期间不被调用
beforeDestroy(销毁前)
在实例销毁之前调用,实例仍然完全可用,
- 这一步还可以用this来获取实例,
- 一般在这一步做一些重置的操作,比如清除掉组件中的定时器 和 监听的dom事件
destroyed(销毁后)
在实例销毁之后调用,调用后,所以的事件监听器会被移出,所有的子实例也会被销毁,该钩子在服务器端渲染期间不被调用
冒泡排序
九九乘法表
1 2 3 4 | for i in range ( 1 , 10 ): for j in range ( 1 ,i + 1 ): print ( "{}*{}={}" . format (j,i,j * i),end = " " ) print () |
执行以上脚本,输出结果如下:
1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 1*5=5 2*5=10 3*5=15 4*5=20 5*5=25 1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36 1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49 1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64 1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
列表去重
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | #!usr/bin/env python #encoding:utf-8 ''' __Author__:沂水寒城 功能:去除列表中的重复元素 ''' def func1(one_list): ''''' 使用集合,个人最常用 ''' return list ( set (one_list))<br><br> def func2(one_list): ''''' 使用字典的方式 ''' return {}.fromkeys(one_list).keys()<br><br> def func3(one_list): ''''' 使用列表推导的方式 ''' temp_list = [] for one in one_list: if one not in temp_list: temp_list.append(one) return temp_list<br><br> def func4(one_list): ''''' 使用排序的方法 ''' result_list = [] temp_list = sorted (one_list) i = 0 while i< len (temp_list): if temp_list[i] not in result_list: result_list.append(temp_list[i]) else : i + = 1 return result_list<br><br> if __name__ = = '__main__' : one_list = [ 56 , 7 , 4 , 23 , 56 , 9 , 0 , 56 , 12 , 3 , 56 , 34 , 45 , 5 , 6 , 56 ] print "脚本之家测试结果:" print func1(one_list) print func2(one_list) print func3(one_list) print func4(one_list) |
Python 二分查找
二分搜索是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # 返回 x 在 arr 中的索引,如果不存在返回 -1 def binarySearch (arr, l, r, x): # 基本判断 if r > = l: mid = int (l + (r - l) / 2 ) # 元素整好的中间位置 if arr[mid] = = x: return mid # 元素小于中间位置的元素,只需要再比较左边的元素 elif arr[mid] > x: return binarySearch(arr, l, mid - 1 , x) # 元素大于中间位置的元素,只需要再比较右边的元素 else : return binarySearch(arr, mid + 1 , r, x) else : # 不存在 return - 1 # 测试数组 arr = [ 2 , 3 , 4 , 10 , 40 ] x = 10 # 函数调用 result = binarySearch(arr, 0 , len (arr) - 1 , x) if result ! = - 1 : print ( "元素在数组中的索引为 %d" % result ) else : print ( "元素不在数组中" ) |
python文件操作
文件上传:上传图片的类型是file,这里没有用到头部信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | import requests def sendImg(img_path, img_name, img_type = 'image/jpeg' ): """ :param img_path:图片的路径 :param img_name:图片的名称 :param img_type:图片的类型,这里写的是image/jpeg,也可以是png/jpg """ url = 'https://www.xxxxxxxxxx.com' # 自己想要请求的接口地址 with open (img_path + img_name, "rb" )as f_abs: # 以2进制方式打开图片 body = { # 有些上传图片时可能会有其他字段,比如图片的时间什么的,这个根据自己的需要 'camera_code' : ( None , "摄像头1" ), 'image_face' : (img_name, f_abs, img_type) # 图片的名称、图片的绝对路径、图片的类型(就是后缀) "time" :( None , "2019-01-01 10:00:00" ) } # 上传图片的时候,不使用data和json,用files response = requests.post(url = url, files = body).json return response if __name__ = = '__main__' : # 上传图片 res = sendImg(img_path, img_name) # 调用sendImg方法 print (res) * * 如果上传图片是数组时,value直接写图片路径就可以 * * |
文件上传:上传的类型是file,用到头部信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | # "Content-Type": "multipart/form-data; boundary=76a22e30da2bb7790828887966871012" from urllib3 import encode_multipart_formdata import requests def sendFile(filename, file_path): """ :param filename:文件的名称 :param file_path:文件的绝对路径 """ url = "https://www.xxxxxxx.com" # 请求的接口地址 with open (file_path, mode = "r" , encoding = "utf8" )as f: # 打开文件 file = { "file" : (filename, f.read()), # 引号的file是接口的字段,后面的是文件的名称、文件的内容 "key" : "value" , # 如果接口中有其他字段也可以加上 } encode_data = encode_multipart_formdata( file ) file_data = encode_data[ 0 ] # b'--c0c46a5929c2ce4c935c9cff85bf11d4\r\nContent-Disposition: form-data; name="file"; filename="1.txt"\r\nContent-Type: text/plain\r\n\r\n...........--c0c46a5929c2ce4c935c9cff85bf11d4--\r\n headers_from_data = { "Content-Type" : encode_data[ 1 ], "Authorization" : token } # token是登陆后给的值,如果你的接口中头部不需要上传字段,就不用写,只要前面的就可以 # 'Content-Type': 'multipart/form-data; boundary=c0c46a5929c2ce4c935c9cff85bf11d4',这里上传文件用的是form-data,不能用json response = requests.post(url = url, headers = headers_from_data, data = file_data).json() return response if __name__ = = '__main__' : # 上传文件 res = sendFile(filename, file_path) # 调用sendFile方法 print (res) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2017-09-16 window.requestAnimationFrame() ,做逐帧动画,你值得拥有