聊聊性能测试

一、介绍

        性能是软件的一种非功能特性,关注的不是软件是否能够完成特定的功能,而是在完成该功能时展示出来的及时性性能测试定义:指通过自动化的测试工具模拟多种正常、峰值以及异常负载条件来对系统的各项性能指标进行测试,观察系统在给定的环境和场景中的性能表现是否与预期一致,验证系统是否存在性能缺陷,并根据测试结果识别性能瓶颈,改善系统性能的完整过程。

二、性能测试类别

        服务端:
                基于协议级的接口测试 : 通过模拟大量的客户端请求发送给服务器,来评估服务端的负载处理能力,硬件资源的使用效率,网络传输过程的响应时间等指标是否满足应用系统的性能需求,或者通过压力测试,模拟在极端情况下服务端系统的稳定性和可靠性。
                基于代码级的接口测试 : 与协议级接口测试类似,只是更加直接地调用客户端或服务端的API接口,通过线程并发的方式向服务端发起请求。适合进行白盒层面的性能测试,用于测试某个单元的性能情况。(与真实场景略有出入:例如网页请求,还包括很多静态资源的请求,接口测试时,很少管)

        客户端
                单机应用,客户端性能测试 : 如APP应用对当前移动终端的资源消耗,如CPU、内存、流量、电量等资源的利用情况。或者web前端的js脚本运行效率等。

三、性能测试原理

        基于协议,基于多线程/多进程/协程,模拟用户的使用场景(尽量模拟用户的所有页面请求,尽量的实现用户操作场景的所有步骤 -- 事务)
        模拟用户使用场景注意:
         请求块的大小(模拟用户提交数据的大小 -- 参数化)
        参数化构造用户数据 或 拿生产环境的数据(这时候需要对用户信息做脱敏处理)
        思考时间(模拟用户两操作之间的思考停顿等待时间;随机等待时间 )
        缓存(模拟浏览器的缓存数据 -- 内存里、硬盘里)
        带宽(通过路由器或网络设备限速设置,或测试工具的设置模拟带宽)
        并发用户数(通过多线程、进程、协程来模拟)
        数据库容量:(模拟用户真实使用场景中的数据库的数据,事先预埋、生产数据脱敏等)
        测试环境:测试环境 与 生产环境 的指标换算。租一台云服务器;

四、性能测试的目的

        确定应用程序是否满足性能要求(例如,系统应该能够处理最多 1,000 个并发用户)。定位应用程序中的计算瓶颈。确定软件供应商所宣称的性能水平是否属实。比较两个或以上的系统,并确定其中性能最好的一个。测量高峰流量事件下的稳定性。

五、性能测试分类

        负载测试:就是在一定的软硬件、及网络环境下,通过模拟不同的用户数向服务器发送请求,直到系统的某项或多项性能指标达到安全临界值,用以检测服务器的最大性能瓶颈出现在什么地方。例如:测试登录接口的性能,先模拟10个用户访问,再100个用户访问,再1000个用户访问,关注程序的响应时间,所耗资源,直到超时或关键资源耗尽;
        主要目的是:检测服务器的最大用户数、最佳用户数。(参照负载测试模型图)

        压力测试:在一定的软硬件、及网络环境下,通过模拟大量的虚拟用户向服务器产生负载,是服务器的资源处于极限状态下长时间持续运行,以检测服务器在高负载情况下是否能稳定工作;压力测试也可以看做是特定类型的负载测试。例如:检测程序,能否在运行1天,1个月,一年后,各项指标是否都在正常指标内,是否会内存溢出,是否出现功能性故障等。
        主要目的是:检测服务器的稳定性、健壮性;
        两者区别:性能测试是为获取或验证系统性能指标而进行测试。压力测试是在高负载情况下来对系统的稳定性进行测试。

        基准测试:在一定的软硬件、及网络环境下,在给系统施加较低压力,模拟少量并发用户向服务器发送请求,查看系统的运行状况并记录相关数做为基础参考。
        主要目的是:为后续的性能测试提供一个参照标准;也为了调试脚本,确保能正常运行;有点类似与冒烟测试。

        配置测试:在不同的软硬件环境下,通过模拟一定量的用户向服务器发送请求,用以检测在不同的服务器或客户端的配置情况下,检测服务器的性能消耗情况。
        主要目的是:找出性能最好的情况;(服务端性能、或客户端性能)

        并发测试:在一定的软硬件、及网络环境下,通过模拟大量用户同时访问一个系统,模块或数据记录等其他并发操作,关注系统可能存在的性能瓶颈,如内存泄漏,线程死锁或资源竞争等问题。
        主要目的是:检测服务器是否会出现线程死锁、资源抢占、内存泄漏等问题。

        极限测试:在一定的软硬件、及网络环境下,通过模拟大量并发用户数,长时间不间断的向服务器发送请求,(一周、一个月、一年)用以检测服务器在极限状态下是否会出现问题。例如:天猫双十一等;

        容量测试:对数据库进行测试。收集数据库承受的压力指标。并分析瓶

        常见的是负载测试、压力测试、基准测试,其他的集中不常见。

                

六、指标

        响应时间(response time):从用户发送一个请求到用户接收到服务器返回的响应数据这段时间就是响应时间。业界标准一般是 258原则;2秒最佳;2-5秒一般;5-8秒以上,差。
        吞吐量(troughput):单位时间内系统处理的客户端请求的数量;一般使用请求数/秒做为吞吐量的单位。一般关注点有:
                throughput in :TI  吞 ,进入服务端的请求量。(请求)
                throughput out:TO 吐,从服务端返回的量;(响应)

        每秒事务量(transaction per second):每秒系统能够处理事务数量;
                事务:用户一系列按照一定逻辑的操作,某一步或几步操作的集合。事务的特性(原子性、一致性、隔离性、持久性)要么全部执行,要么全部回滚。
        每秒请求数-HPS(hits per second):每秒客户端发送的请求数量。
        每秒响应书-RPS(response per second):每秒服务器返回的响应数量。
        事务成功率:事务成功的概率,业内标准一般要求成功率是99.5%以上。
        资源利用率:cpu使用率:75-80%以上; 内存使用率:70%、磁盘:70%、网络:70%
        

七、相关概念

        关联:就是当前的请求参数要从前面的请求响应中获取;
        集合点:就是做压力测试或者并发测试时,可以实现设置一个集合点,当启动的线程数达到集合点的要求之后立即执行。
        最佳用户数:就是负载在系统各项资源都处于一个最佳状态下对应的用户数就是最佳用户数。
        最大用户数:系统能正常运行的临界值 ;(极限饱和状态下的用户数)
        并发用户数:同时对服务器产生请求的用户总数 ;(通常约为在线用户数的8%-12%)
        在线用户数:某段时间内访问的用户数,这些用户只是在线,不一定同时做某一件事情。
        系统用户数:软件系统注册是用户总数;
        单用户单迭代:SUSI,用于调试代码基本功能。
        单用户多迭代:SUMI,用于调试一些数据重复的问题。
        多用户单迭代:MUSI,用于调试多线程并发的情况。
        多用户多迭代:MUMI,用于正式的性能测试执行。

八、性能测试流程

        分析:分析性能测试需求,确定性能指标,落实到具体数据上(如:RT:2s,cpu:75%)
                RT:响应时间;若有明确需求,以需求为准;没有明确需求,业内标准258秒。
                TPS:有历史数据的,根据历史线上数据分析计算;如系统PV、电商项目的交易量。没有历史数据:使用公式:TPS = VU/(Tt + Tr) ;分别是:并发用户数、思考时间、响应时间。行业标准:金融:5000-100000;保险:100-5000 ;大电商:100000-1000000;小电商:5000-10000
                事务成功率:事务成功的概率,业内标准一般要求成功率是99.5%以上。
                资源利用率:cpu使用率:75-80%以上; 内存使用率:70%、磁盘:70%、网络:70%

        设计:设计性能测试方案;
                项目背景、测试目的、测试范围、测试策略、测试方法、测试环境、测试风险、测试产出、测试启动、暂停、停止、再启动准侧。

        实现:性能测试脚本、测试用例、业务模型、数据的准备,测试场景、环境的搭建;
                测试工具、测试脚本;SUSI、SUMI、MUSI、MUMI;

        执行:执行测试脚本(联机负载)、整理测试数据

        分析:对测试数据、图形进行分析,找出系统瓶颈,进行性能调优,回归测试

        维护:维护测试脚本、测试工具(框架)

九、python实现

        模拟用户使用场景:

import random
import re
import time
import requests
import threading

#做一个响应时间列表,保存每个操作的时间;用以分析时,查看平均的响应时间、最快、最慢等
time_list = []

#静态资源,如果已经缓存的,放入这里做个记录
uri_li = []
class Deom:
    def __init__(self):
        self.session = requests.session()

    #模拟用户打开首页信息
    def homepage(self):
        resp = self.session.get(url='http://localhost:8080/homepage')
        response = str(resp.headers) + resp.text
        #获取静态资源,
        resp_html = resp.text
        url1 = re.findall('type="text/css" href="(.+?)"',resp_html)
        url2 = re.findall('src="(.+?)"',resp_html)
        background = re.findall('backaground-image:url\(\'(.+?)\'\)',resp_html)
        url_li = url1+url2+background
        for uri in url_li:
            url = 'http://localhost:8080'+uri
            #如果这个静态资源时第一次访问,则下载静态资源到缓存
            if uri not in uri_li:
                self.session.get(url = url)
                uri_li.append(uri)

        print(f'首页数据响应大小是: {len(response)/1024}KB')

    #模拟用户登录账户
    def login(self):
        account={'username':'lijian','password':'123456'}
        resp = self.session.post(url='http://localhost:8080/login',data=account)
        response = str(resp.headers)+resp.text
        print(f'登录数据响应大小是: {len(response)/1024}KB')

    #模拟添加会员
    def add_customer(self):
        customer={'cus_Name':'lijian','sex':'男','data':'2022-05-29'}
        resp = self.session.post(url='http://localhost:8080/add',data=customer)
        response = str(resp.headers)+resp.text
        print(f'添加用户数据响应大小是: {len(response)/1024}KB')

    #主调方法,把模拟用户操作整个流程,先打开主页,然后登录,最后添加用户
    def main_test(self):
        #不同操作之间有个思考时间
        self.homepage()
        time.sleep(round(random.uniform(1, 3)))
        self.login()
        time.sleep(round(random.uniform(1, 3)))
        self.add_customer()

if  __name__ == '__main__'
    demo = Deom()

    #通过多线程模拟多用户,多迭代
    for i in range(10):
        threading.Thread(target=demo.main_test()).start()

    #demo.main_test()

十、监控系统资源

        做性能测试需要我们时刻监控系统运行的状态,如 ps 、top 、free 等等;在Python中获取系统信息的一个好办法是使用 psutil 这个第三方模块。顾名思义,psutil = process and system utilities,它不仅可以通过一两行代码实现系统监控,还可以跨平台使用,支持Linux/UNIX/OSX/Windows等,是测试工程师、系统管理员和运维小伙伴不可或缺的必备模块。

        安装psutil:

pip install psutil

        常用方法,查看内容、CPU、网络等使用情况。

import psutil

# 打印CPU信息,看多少核的
print(psutil.cpu_count())
# 打印CPU信息,看利用率
print(psutil.cpu_percent())


# 获取内存信息
print(psutil.virtual_memory())
# 获取系统交换内存的统计信息
print(psutil.virtual_memory())

# 磁盘
print(psutil.disk_usage('E:').percent)

# 网络
print(psutil.net_io_counters())

        对于上述的模拟用户使用场景,可以加入查看资源使用的代码,从而监控CPU、内存等资源每个阶段的使用情况。

猜你喜欢

转载自blog.csdn.net/guanrongl/article/details/125016511