<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在現代Web應用程式中,效能是至關重要的。為了確保應用程式能夠在高負載下正常執行,我們需要進行效能測試。 今天,應小夥伴的提問, 田辛老師來寫一個Pytest進行壓力測試的簡單案例。 這個案例的測試網站我們就隱藏了,不過網站的基本情況是:
首先,田辛老師做的第一件事情就是設定測試引數。程式碼如下
# 定義測試用例 def test_performance(): # 設定測試引數 url = 'http://www.a.com/' num_threads = 20 num_requests = 200 timeout = 5
這裡面,田老師設定了網站的URL, 執行緒數, 每個執行緒的請求次數,以及超時時間。 可以看到, 這裡面田老師一共會做4000次請求。
這段程式碼我想不需要田老師多講, 這裡做一個提示:注意縮排, 這段程式碼仍然在測試用例test_performance內。
# 初始化測試結果 response_times = [] errors = 0 successes = 0
接下來, 田老師定義了一個內部函數。這個函數就是在某一執行緒內完成設定次數的請求。
# 定義測試函數 def test_func(): nonlocal errors, successes for _ in range(num_requests): try: start_time = time.time() requests.get(url, timeout=timeout) end_time = time.time() response_time = end_time - start_time response_times.append(response_time) successes += 1 except requests.exceptions.RequestException: errors += 1
# 建立測試執行緒 threads = [] for _ in range(num_threads): t = threading.Thread(target=test_func) threads.append(t) # 啟動測試執行緒 for t in threads: t.start() # 等待測試執行緒結束 for t in threads: t.join()
# 計算測試結果 total_requests = num_threads * num_requests throughput = successes / (sum(response_times) or 1) concurrency = num_threads error_rate = errors / (total_requests or 1) cpu_usage = psutil.cpu_percent() memory_usage = psutil.virtual_memory().percent
# 將測試結果寫入檔案 with open('performance_test_result.txt', 'w') as f: f.write(f'總請求數:{total_requests}n') f.write(f'總時間:{sum(response_times):.2f}sn') f.write(f'吞吐量:{throughput:.2f} requests/sn') f.write(f'並行數:{concurrency}n') f.write(f'錯誤率:{error_rate:.2%}n') f.write(f'CPU利用率:{cpu_usage:.2f}%n') f.write(f'記憶體利用率:{memory_usage:.2f}%n')
在PyCharm裡面直接執行這段程式碼, 得出的結果是:
總請求數:4000
總時間:1837.65s
吞吐量:2.17 requests/s
並行數:20
錯誤率:0.12%
CPU利用率:4.10%
記憶體利用率:88.60%
如果在PyCharm裡面直接執行上面的程式碼, 雖然我們把結果寫在檔案中,但是, 不好看呀。
所以呢,田老師再額外介紹一個方法,這個方法能夠生成一個相對美觀的測試報告出來。
2.2.1 宣告壓力測試
首先在定義用例的時候通過裝飾器宣告這是一個壓力測試:
# 定義測試用例 @pytest.mark.performance def test_performance(): # 設定測試引數 url = 'http://www.a.biz/' num_threads = 20
2.2.2 在命令列中通過pytest命令執行測試
第二步, 在命令列中執行測試
$ pytest -v --html=report.html test_a.py
輸出執行結果是:
======================== test session starts =================================
platform win32 -- Python 3.10.9, pytest-7.2.1, pluggy-1.0.0 -- D:python-grpminiconda_envpy3.10_playwrightpython.exe
cachedir: .pytest_cache
metadata: {'Python': '3.10.9', 'Platform': 'Windows-10-10.0.22624-SP0', 'Packages': {'pytest': '7.2.1', 'pluggy': '1.0.0'}, 'Plugins': {'allure-pytest': '2.12.0', 'base-url': '2.0.0', 'html': '3.2.0', 'metadata': '2.0.4', 'ordering': '0.6', 'playwright': '0.3.0'}, 'JAVA_HOME': 'D:\java-grp\jdk\', 'Base URL': ''}
rootdir: E:developpythonpytest-trainingtest
plugins: allure-pytest-2.12.0, base-url-2.0.0, html-3.2.0, metadata-2.0.4, ordering-0.6, playwright-0.3.0
collected 1 item
test_a.py::test_performance PASSED [100%]
========================== warnings summary =================================
test_a.py:25
E:developpythonpytest-trainingtesttest_a.py:25: PytestUnknownMarkWarning: Unknown pytest.mark.performance - is this a typo? You can register custom marks to avoid this warning - for details, see https://docs.pytest.org/en/stable/how-to/mark.html
@pytest.mark.performance
-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
-- generated html file: file:///E:/develop/python/pytest-training/test/report.html --
================= 1 passed, 1 warning in 99.09s (0:01:39) ===================
(D:python-grpminiconda_envpy3.10_playwright) E:developpythonpytest-trainingtest>
最終生成的報告是:(有點長, 擷取了關鍵部分)
因為時間關係, 本案例今天沒有時間在伺服器端執行, 所以通過psutil庫所取得CPU利用率和記憶體利用率時間並不對。 如果是在伺服器端執行, 這兩個數位才是對的。
如果要在本地獲取伺服器的CPU,記憶體,IO等情況,有一個監控神器:Prometheus。不過這東西設定起來又是另一個話題, 且聽後話~哈哈(55555, 好像,又刨了一個坑)
#!/usr/bin/env python # -*- coding:utf-8 -*- """ #----------------------------------------------------------------------------- # --- TDOUYA STUDIOS --- #----------------------------------------------------------------------------- # # @Project : pytest-training # @File : test_a.py # @Author : tianxin.xp@gmail.com # @Date : 2023/3/10 14:39 # # 壓力測試案例 # #--------------------------------------------------------------------------""" import threading import time import psutil import pytest import requests # 定義測試用例 @pytest.mark.performance def test_performance(): # 設定測試引數 url = 'http://www.tdouya.biz/' num_threads = 20 num_requests = 200 timeout = 5 # 初始化測試結果 response_times = [] errors = 0 successes = 0 # 定義測試函數 def test_func(): nonlocal errors, successes for _ in range(num_requests): try: start_time = time.time() requests.get(url, timeout=timeout) end_time = time.time() response_time = end_time - start_time response_times.append(response_time) successes += 1 except requests.exceptions.RequestException: errors += 1 # 建立測試執行緒 threads = [] for _ in range(num_threads): t = threading.Thread(target=test_func) threads.append(t) # 啟動測試執行緒 for t in threads: t.start() # 等待測試執行緒結束 for t in threads: t.join() # 計算測試結果 total_requests = num_threads * num_requests throughput = successes / (sum(response_times) or 1) concurrency = num_threads error_rate = errors / (total_requests or 1) cpu_usage = psutil.cpu_percent() memory_usage = psutil.virtual_memory().percent # 輸出測試結果 print(f'總請求數:{total_requests}') print(f'總時間:{sum(response_times):.2f}s') print(f'吞吐量:{throughput:.2f} requests/s') print(f'並行數:{concurrency}') print(f'錯誤率:{error_rate:.2%}') print(f'CPU利用率:{cpu_usage:.2f}%') print(f'記憶體利用率:{memory_usage:.2f}%') # 將測試結果寫入檔案 with open('performance_test_result.txt', 'w') as f: f.write(f'總請求數:{total_requests}n') f.write(f'總時間:{sum(response_times):.2f}sn') f.write(f'吞吐量:{throughput:.2f} requests/sn') f.write(f'並行數:{concurrency}n') f.write(f'錯誤率:{error_rate:.2%}n') f.write(f'CPU利用率:{cpu_usage:.2f}%n') f.write(f'記憶體利用率:{memory_usage:.2f}%n')
到此這篇關於Python+Pytest實現壓力測試詳解的文章就介紹到這了,更多相關Python Pytest壓力測試內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45