性能测试学习-执行测试脚本,监控性能指标

1、关于使用pymatlab库实现对数据表的增加,获取指定列操作,并在另一个py文件中调用

cursor游标的使用

python 复制代码
"""
实现数据连接,并操作数据库,生成随机的用户数据
使用游标
"""
import random

import pymysql

#数据库新增
def insert_db():
    #建立数据库连接
    connect=pymysql.connect(
        host='localhost',  # 主机名(或IP地址)
        port=3306,  # 端口号,默认为3306
        user='root',  # 用户名
        password='123456',  # 密码
        database="woniusalesnew",
        charset='utf8'  # 设置字符编码

    )
    #游标,获取整个数据集
    cur=connect.cursor()
    #循环  生成10行数据,出现在连接的数据表中
    for i in range(10):
        username=random.choice(["xiaolong","xaioming","xiaoli"])+str(random.randint(1,100))
        password=random.choice(["xiaolong","xaioming","xiaoli"])+str(random.randint(1,100))
        realname=random.choice(["xiaolong","xaioming","xiaoli"])+str(random.randint(1,100))
        phone=random.choice(["130","120","139"])+str(random.randint(11111111,99999999))
        role=random.choice(["boss","clert","admin"])

        #驱动数据集
        cur.execute(f"insert into user(username,password,realname,phone,role,createtime) values('{username}','{password}','{realname}','{phone}','{role}','2017-10-01 08:18:20')")
    connect.commit()
    #游标的关闭
    cur.close()
    #连接的关闭
    connect.close()


#数据库查询
def query_db():
    connect=pymysql.connect(
        host='localhost',  # 主机名(或IP地址)
        port=3306,  # 端口号,默认为3306
        user='root',  # 用户名
        password='123456',  # 密码
        database="woniusalesnew",
        charset='utf8'  # 设置字符编码

    )
    #游标,获取整个数据集
    cur=connect.cursor()
    # 驱动数据集
    cur.execute("select username,password from user")
    #获取驱动集合
    tup=cur.fetchall()
    #打印结果
    #print(tup)
    connect.commit()
    #游标的关闭
    cur.close()
    #连接的关闭
    connect.close()
    #返回获得的集合,便于在多线程中调用
    return tup


if __name__ == '__main__':
    #insert_db()
    query_db()

1、问题

浏览器在主请求加载过程中会自动发送一些加载请求,怎么获得这些请求,并用使用http协议+request请求进行性能测试

方法:

1、正则模块匹配出需要的字符,组成一个集合

2、循环该集合

(1)拼接这些匹配出来的字符,构成完整的url

(2)使用get方法,访问这个请求

python 复制代码
import re
import requests
lochost='172.22.205.254'

class DEMO:

def __init__(self):
       self.session=requests.session()

def gethomepage(self):
        url=f"http://{lochost}:8080/woniusales/"
        res = self.session.get(url=url)
        print(res)
        #获得图片,js,背景图等加载资源
        js_li = re.findall('type="text/javascript" src="(.+?)"',res.text)
        img_li = re.findall('img src="(.+?)"', res.text)
        backage_i = re.findall('backage-img:url\(\'(.+?)\'\)',res.text)
        url_i=js_li +img_li+backage_i
        for uri in js_li:
            url_i=f"http://{lochost}:8080"+uri
            self.session.get(url=url_i)

def main_test(self):
    for i in range(1):
       self.gethomepage()


if __name__ == '__main__':
    re1 = DEMO()
    re1.main_test()

2、问题

模拟缓存,一些加载请求经常会用到,如何通过缓存获取这些资源而非服务器

方法:

将问题1中匹配获得的url,缓存到一个列表中,如果是第一次的访问请求,就使用服务器,否则就使用列表中的缓存

python 复制代码
import re
import requests
lochost='172.22.205.254'
#用于缓存非主请求的url
url_list = []
#创建类
class DEMO:

    def __init__(self):
        self.session=requests.session()

    #获取首页的请求
    def gethomepage(self):
        url=f"http://{lochost}:8080/woniusales/"
        res = self.session.get(url=url)
        print(res)
        #获得图片,js,背景图等加载资源
        js_li = re.findall('type="text/javascript" src="(.+?)"',res.text)
        img_li = re.findall('img src="(.+?)"', res.text)
        backage_i = re.findall('backage-img:url\(\'(.+?)\'\)',res.text)
        #组合
        url_li = js_li + img_li + backage_i
        for uri in url_li:
            url_i = f"http://{lochost}:8080" + uri
            #如果是第一次访问,通过服务器访问请求
            if url_i not in url_list:
                self.session.get(url=url_i)
                #将url缓存
                url_list.append(url_i)

def main_test(self):
    for i in range(1):
       self.gethomepage()


if __name__ == '__main__':
    re1 = DEMO()
    re1.main_test()

3、监控性能指标:响应时间,响应大小(字节)

python 复制代码
import re
import requests
import time
lochost='172.22.205.254'
#用于缓存非主请求的url
url_list = []
#创建类
class DEMO:

    def __init__(self):
        self.session=requests.session()

    #获取首页的请求
    def gethomepage(self):
        t1=time.time()
        url=f"http://{lochost}:8080/woniusales/"
        res = self.session.get(url=url)
        print(res)
        #获得图片,js,背景图等加载资源
        js_li = re.findall('type="text/javascript" src="(.+?)"',res.text)
        img_li = re.findall('img src="(.+?)"', res.text)
        backage_i = re.findall('backage-img:url\(\'(.+?)\'\)',res.text)
        #组合
        url_li = js_li + img_li + backage_i
        for uri in url_li:
            url_i = f"http://{lochost}:8080" + uri
            #如果是第一次访问,通过服务器访问请求
            if url_i not in url_list:
                self.session.get(url=url_i)
                #将url缓存
                url_list.append(url_i)
       t2=time.time()
      #运行一次需要的时间
       t=(t2-t1)*1000
       print(f"当前首页获取的响应时间为{t}ms")
        #res.headers类型为字典
       print(f"当前首页获取的响应大小为{ len(res.text + str(res.headers))}B")

def main_test(self):
#通过两次迭代对比,没有缓存和有缓存的区别
    for i in range(2):
       self.gethomepage()


if __name__ == '__main__':
    re1 = DEMO()
    re1.main_test()

4、问题:怎么查看每个功能所用的时间

方法:将每次循环获得的时间放到空的集合中去,最后打印输出

在多用户运行时,主线程会先执行,此时会打印出初始化的空集合;需要使用线程阻塞,保证子线程执行完以后,

python 复制代码
"""
基于http协议 通过脚本模拟多线程实现用户的登录,会员新增查看等功能

1、确保单线程接口测试通过
2、再测试以下几种情况
   单用户单迭代
   单用户多迭代   调试数据重复问题
   多用户单迭代   多线程并发问题
   多用户多迭代

思考时间:一个进程与另一个进程之间的时间间隔
"""
import random

import requests
import threading
import time
from PerformanceTest.common import query_db
from PerformanceTest.config import lochost
import re
#用于缓存非主请求的url
url_list = []
#缓存响应时间
time_list=[]
#创建类
class DEMO:

    def __init__(self):
        self.session=requests.session()

    #获取首页的请求
    def gethomepage(self):
        t1=time.time()
        url=f"http://{lochost}:8080/woniusales/"
        res = self.session.get(url=url)
        print(res)
        #获得图片,js,背景图等加载资源
        js_li = re.findall('type="text/javascript" src="(.+?)"',res.text)
        img_li = re.findall('img src="(.+?)"', res.text)
        backage_i = re.findall('backage-img:url\(\'(.+?)\'\)',res.text)
        #组合

        url_li = js_li + img_li + backage_i
        for uri in url_li:
            url_i = f"http://{lochost}:8080" + uri
            #如果是第一次,通过服务器访问请求
            if url_i not in url_list:
                self.session.get(url=url_i)
                #将url缓存
                url_list.append(url_i)
        t2=time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前首页获取的响应时间为{t}ms")
        time_list.append(t)
        print(f"当前首页获取的响应大小为{ len(res.text + str(res.headers))}B")



    #登录操作请求
    def login(self,username,password):
        t1 = time.time()
        url="http://172.22.205.254:8080/woniusales/user/login"
        """
        #直接传参
        body = {
            "username": "admin",
            "password": "admin123",
            "verifycode": "0000"
        }
         """
        body={
            "username":username,
            "password":password,
            "verifycode":"0000"
        }
        #通过数据库传参的方式
        body = {
            "username": "admin",
            "password": "admin123",
            "verifycode": "0000"
        }

        res = self.session.post(url=url,data=body)
        print(res.text)
        t2=time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前登录获取的响应时间为{t}ms")
        time_list.append(t)

    #进入会员页面请求
    def login_customer(self):
        t1 = time.time()
        url="http://172.22.205.254:8080/woniusales/customer"
        res = self.session.get(url=url)
        if "蜗牛进销存-会员管理" in res.text:
            print("customer is ok")
        else:
            print("customer is ko!")
        t2=time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前进入会员页面的响应时间为{t}ms")
        time_list.append(t)


    #会员新增请求
    def add(self):
        t1 = time.time()
        url="http://172.22.205.254:8080/woniusales/customer/add"

        #随机生成用户名,电话号,更符合实际场景
        #random.randint(start,stop)随机生成该范围内的整数
        phone_num=["123","133","155","189",'190']
        customer_phone=random.choice(phone_num)+str(random.randint(11111111,99999999))
        customer_list=["小红","小兰","小黄"]
        customer_name=random.choice(customer_list)
        sex_list=["男","女"]
        sex=random.choice(sex_list)
        body={"customername": customer_name,
              "customerphone":customer_phone,
              "childsex":sex,
              "childdate":"2024-06-22",
              "creditkids":"0",
              "creditcloth":"0"
        }
        custom = self.session.post(url=url,data=body)
        print(custom.text)
        t2 = time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前会员新增的响应时间为{t}ms")
        time_list.append(t)

    #查询会员
    def search(self):
        t1 = time.time()
        url="http://172.22.205.254:8080/woniusales/customer/search"
        body={
            "customerphone":"15984908938",
            "page":"1"
        }
        res = self.session.get(url=url,params=body)
        print(res.text)
        t2 = time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前查询会员的响应时间为{t}ms")
        time_list.append(t)

    #用户注销请求
    def logout(self):
        t1 = time.time()
        url= "http://172.22.205.254:8080/woniusales/user/logout"
        res = self.session.get(url=url)
        if "尚未登录" in res.text:
            print("logout is ok")
        else:
            print("logout is ko!")
        t2 = time.time()
        # 运行一次需要的时间
        t = (t2 - t1) * 1000
        print(f"当前用户注销的响应时间为{t}ms")
        time_list.append(t)

    #模拟单迭代场景,通过改变range()来实现用户多迭代
    #传入参数
    def main_test(self,username,password):
   # def main_test(self):
   # 进程 通过两次迭代对比,没有缓存和有缓存的时间复杂度区别
     for i in range(4):
       # self.gethomepage()
       #传入参数
        self.login(username,password)
       # self.login()
        self.login_customer()
        self.add()
        self.search()
        self.logout()

if __name__ == '__main__':
    re1 = DEMO()
    #返回数据集生成的用户名和密码数据集
    tup=query_db()
  #re1.main_test()
    #实现多个用户同时使用,有多少个数据集,就循环多少次,取出数据集测试真实用户组
    for i in tup:
        username=i[0]
        password=i[1]
        #注意多线程的使用方法 传入参数
        t= threading.Thread(target= re1.main_test,args=((username,password)))
        t.start()
    #在循环外,否则子线程相互阻塞,要等一个子线程执行完,才会执行下一个;timeout=5000是结果在最后输出
    t.join(timeout=5000)
    print(time_list)
相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习