Определение тестирования производительности:
Протестируйте различные показатели производительности системы с помощью инструментов автоматического тестирования, которые имитируют различные нормальные, пиковые и ненормальные условия нагрузки. И нагрузочное тестирование, и стресс-тестирование являются тестами производительности, и их можно комбинировать.
Методы тестирования производительности:
Он имитирует реальный бизнес и отправляет большое количество одновременных запросов на сервер для создания нагрузки на тестируемую систему, а также анализирует производительность тестируемой системы под различными нагрузками.
Общие цели, для которых мы проводим тестирование производительности, следующие:
а: Оцените производительность системы (в тестовой среде локальной сети или производственной среде оцените уровень обслуживания текущей системы посредством анализа результатов тестирования).
б: Обнаружение узких мест в производительности (выясните ключевые шаги или процессы, которые влияют на общую производительность системы, посредством тестирования производительности, чтобы обеспечить направленную основу для настройки системы).
c: Проверьте результаты настройки (подтвердите, эффективна ли стратегия оптимизации производительности, сравнив результаты тестов после оптимизации и до оптимизации).
1.2.1 Стресс-тест
Постепенно увеличивая нагрузку на систему, проверяя изменения в производительности системы и, в конечном итоге, определяя, при каких условиях нагрузки производительность системы не достигает максимального уровня обслуживания, который может обеспечить система.
Стресс-тестирование заключается в постепенном увеличении нагрузки, чтобы определенные ресурсы системы достигли критических точек.
1.2.2 Нагрузочное тестирование
Путем постепенного увеличения нагрузки на систему тестируются изменения производительности системы, и в конечном итоге проводится тест для определения максимальной нагрузки, которую система может выдержать при соблюдении показателей производительности.
1.2.3 Проверка стабильности
Нагружая систему определенной деловой нагрузкой (например, использование ресурсов ЦП от 70% до 90%), запустите ее на некоторое время, чтобы проверить, стабильна ли система. Поскольку запуск занимает много времени, обычно можно проверить, нет ли в системе утечек памяти и других проблем.
1.2.4: Проверка производительности
При определенных программных и аппаратных условиях в базе данных конструируется количество записей разного порядка, и путем запуска одного или нескольких бизнес-сценариев с определенным количеством виртуальных пользователей получаются показатели производительности разного порядка, т.е. как получить возможность обработки базы данных Максимальная емкость сеанса, максимальная емкость и т. д.
1.2.5 Тест конфигурации
Пройти проверку программного обеспечения и аппаратной конфигурации тестируемого ПО. Тестирование конфигурации может полностью использовать ограниченные программные и аппаратные ресурсы для максимизации вычислительных возможностей системы. Его также можно использовать в сочетании с другими типами тестирования производительности, чтобы предоставить ориентиры для настройки системы.
в реализации Тестирование В процессе производительности общий рабочий процесс равен 1: Анализ Тестирование производительностинуждаться->2:дизайн Тестирование производительностиплан->3:развивать Тестирование производительности Скрипт->4:строить Тестирование производительностисреда->5:Выполнение тестов->6:После анализа результатов проведите несколько раундов тестирования для проверки и оптимизации.->7:писать Тестирование производительности Отчет->8:писать Тестирование производительности Подвести итог Отчет
Наша команда использует два инструмента стресс-тестирования: Jmeter и Locust.
Сегодня я объясню только Locust.
Адрес официального сайта саранчи: https://www.locust.io/
# -*- coding = utf-8 -*-
from locust import HttpUser, TaskSet, task, constant, between
import random
import re
import json
import hashlib
from assertpy import assert_that
import time
from faker import Faker
fake = Faker(locale='zh_CN')
# Создать случайную дату в формате гггг-мм-дд.
random_date = fake.date(pattern="%Y-%m-%d", end_datetime=None)
# текущие миллисекунды в формате времени unix
current_mis_time = int(round(time.time() * 1000))
app_header = {'Host': 'pt2dingtalkf.zjk.taeapp.com',
'Accept': 'application/json, text/plain, */*',
'Origin': 'https://pt2dingtalkf.zjk.taeapp.com',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.90 Safari/537.36',
'sign': 'd44e27d775d6160b9f3961e1561d1ab58de3b1617263fecb249e7cc88e6af3be',
'Content-Type': 'application/json;charset=UTF-8',
'Referer': 'https://pt2dingtalkf.zjk.taeapp.com/pro/index.html?corpid=dinga93c84f4d89688bf35c2f4657eb6378f&appid=2576&dd_nav_bgcolor=ffff943e',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Connection': 'keep-alive'}
app_token = '193bfbec50530ff9932f6f8479b14388c95f666782f9b6d1920cf230bf08bb48'
app_data_save_url = 'https://pt2dingtalkf.zjk.taeapp.com/pro/v1/form/data/add'
class UserTasks(TaskSet):
# Заменить некоторые данные в сообщении запроса
def process_request_data(self, init_data, expected_to_be_replace, need_replace_to_data):
page_pattern = re.compile(expected_to_be_replace)
matchers = page_pattern.findall(str(init_data))
for matcher in matchers:
init_data = str(init_data).replace(str(matcher), str(need_replace_to_data))
return init_data
def process_headers(self, init_headers, request_parameters, token):
parameters = str(str(request_parameters) + str(token)).encode('utf-8')
sign_code = hashlib.sha256(parameters).hexdigest()
init_headers['sign'] = sign_code
return init_headers
# Добавляйте клиентов в фоновом режиме приложения
def add_save_customer_on_app(self):
init_param = «Параметры запроса»
request_param = self.process_request_data(init_param, «Клиент стресс-тестирования», str(fake.address()))
request_header = self.process_headers(app_header, request_param, app_token)
add_customer_result = self.client.post(url=app_data_save_url, data=request_param.encode('utf-8'),
headers=request_header).text
# Возвращает идентификатор нового клиента
return json.loads(add_customer_result)['result']['dataId']
# Добавить заказ по контракту в фоновом режиме приложения
@task
def add_save_order_on_app(self):
init_param = ''
request_param = self.process_request_data(init_param, «Приказ о заключении договора на стресс-тестирование», str(fake.address()))
# Замените идентификатор клиента, связанный при создании нового контракта.
customer_id = self.add_save_customer_on_app()
final_param = self.process_request_data(request_param, str(325388), str(customer_id))
request_header = self.process_headers(app_header, final_param, app_token)
add_order_result = self.client.post(url=app_data_save_url, data=final_param.encode('utf-8'),
headers=request_header).text
Assert_that(str(add_order_result)).contains("Операция успешна")
class WebsiteUser(HttpUser):
wait_time = between(1, 3)
tasks = [UserTasks]
class StagesShape(LoadTestShape):
stages = [
{"duration": 60, "users": 1, "spawn_rate": 0.5},
{"duration": 120, "users": 2, "spawn_rate": 0.5},
{"duration": 240, "users": 3, "spawn_rate": 0.5},
{"duration": 300, "users": 0, "spawn_rate": 1},
]
def tick(self):
run_time = self.get_run_time()
for stage in self.stages:
if run_time < stage["duration"]:
tick_data = (stage["users"], stage["spawn_rate"])
return tick_data
return None
from locust.contrib.fasthttp import FastHttpUser
# Добавляйте клиентов в фоновом режиме приложения
@task
def add_save_customer_on_app(self):
init_param = «Параметры запроса»
request_param = self.process_request_data(init_param, «Клиент стресс-тестирования», str(fake.address()))
request_header = self.process_headers(app_header, request_param, app_token)
add_customer_result = self.client.post(path=app_data_save_url, data=request_param.encode('utf-8'),
headers=request_header).text
Assert_that(str(add_customer_result)).contains("Операция успешна")
class WebsiteUser(FastHttpUser):
wait_time = between(1, 3)
tasks = [UserTasks]
Locustиз Распределенное параллельное выполнениеиспользоватьmaster-workerмодель:
Запустите процесс главной роли:
locust -f stage_load.py --master --host=https://pt2dingtalkf.zjk.taeapp.com
Запускаем процесс рабочей роли:
locust -f stage_load.py --worker --master-host=127.0.0.1
В ходе проекта обновления архитектуры + преобразования подформы в нижний уровень было внесено множество изменений, и необходимо проверить стабильность системы после обновления архитектуры.
Провести стресс-тестирование одного и того же бизнес-сценария в средах теста 2 (код проекта обновления архитектуры) и теста 3 (основной код ветки) соответственно и сравнить результаты стресс-тестирования; Ожидаемая цель: Показатели производительности каждого предприятия по стресс-тестированию после обновления архитектуры не будут хуже, чем производительность до обновления.
Сборник топ-30 запросов на интерфейсы производственной среды (App+Web)
1: Мобильный терминал
1.1 Детали документа URL-адрес интерфейса:/mobile/form/data/get Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.2 Основная информация о документах URL-адрес интерфейса:/mobile/form/data/basic/detail Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.3 Просмотр статистических результатов в центре диаграммы URL-адрес интерфейса:/chart/result Стресс-тестирование бизнеса: клиенты, контракты, последующие записи.
1.4 Список URL-адрес интерфейса:/mobile/list/customer Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.5 Создать новое сохранение URL-адрес интерфейса:/mobile/form/data/add Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.6 Новая страница /мобильный/форма/данные/добавить/получить Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.7 Список связанных данных URL-адрес интерфейса:/mobile/detail/tab/linkAdd/get Стресс-тестирование бизнеса: связанный список данных в подчиненной форме.
2: Веб-сервер
1.8 Новая страница веб-документа /pro/v1/form/data/get Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.9 Подробности веб-документа URL-адрес интерфейса:/pro/v1/form/data/detail Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.10 Страница веб-списка URL-адрес интерфейса:/pro/v1/list/customer Стресс-тестирование бизнеса: клиенты, контракты, PaaS-формы.
1.11 Веб-статистические показатели URL-адрес интерфейса:/pro/v1/chart/result/value Стресс-тестирование бизнеса: клиенты, запрос графика контрактов.
Поскольку скриптов для сценариев стресс-тестирования существует множество, мы не будем перечислять их по отдельности.
4.1 Создайте нового и сохраненного клиента в фоновом режиме в Интернете.
# Добавьте клиентов в веб-интерфейс
@task
def add_save_customer_on_web(self):
init_param = «Параметры запроса»
request_param = self.process_request_data(init_param, «Клиент стресс-тестирования», str(fake.address()))
request_header = self.process_headers(web_login_header, request_param, web_token)
add_customer_result = self.client.post(url=web_data_detail_url, data=request_param.encode('utf-8'),headers=request_header).text
Assert_that(str(add_customer_result)).contains("Операция успешна")
4.2. Переверните страницу списка контрактов веб-сервера для просмотра.
# Список контрактов веб-сервера
@task
def order_list_on_web(self):
init_param = '{\"corpid\":\"dinga93c84f4d89688bf35c2f4657eb6378f\",\"userId\":\"030917160122954929\",\"platform\":\"web\",\"sortMap\":{},\"formId\":3497,\"saasMark\":1,\"businessType\":201,\"subBusinessType\":201,\"timeFilter\":{},\"listGroupId\":0,\"defaultGroup\":1,\"commonFilter\":{},\"del\":0,\"page\":1,\"pageSize\":20,\"conditions\":[],\"statusFilter\":2,\"appId\":64,\"isSync\":true}'
# Количество заменяемых страниц
final_param = self.process_request_data(init_param, '\"page\":1',
str('\"page\":' + str(random.randrange(1, 229))))
request_header = self.process_headers(web_login_header, final_param, web_token)
order_list_result = self.client.post(url="https://pt2pcf.zjk.taeapp.com/pro/v1/list/contract", data=final_param.encode('utf-8'),
headers=request_header).text
Assert_that(str(order_list_result)).contains("Операция успешна")
4.3 Просмотр сведений о данных формы PaaS в фоновом режиме Интернета
# Веб-фон для просмотра сведений о данных формы PaaS
@task
def paas_detail_on_web(self):
init_param = '{\"corpid\":\"dinga93c84f4d89688bf35c2f4657eb6378f\",\"userId\":\"030917160122954929\",\"platform\":\"web\",\"menuId\":\"3503\",\"appId\":110,\"dataId\":5125,\"saasMark\":2,\"businessType\":0,\"subBusinessType\":404}'
# Заменить идентификатор формы
final_param = self.process_request_data(init_param, str(5125), str(random.randrange(4066, 5125)))
request_header = self.process_headers(web_login_header, final_param, web_token)
add_paas_result = self.client.post(url=web_data_detail_url, data=final_param.encode('utf-8'),
headers=request_header).text
Assert_that(str(add_paas_result)).contains("Операция успешна")
Тест 2. Новое сохранение фонового веб-клиента.
Среда стресс-тестирования: Тест 2 (обновление архитектуры) Стресс-тестирование бизнеса: создание новых и сохранение клиентов веб-сервера Пиковое количество запросов в секунду: 5,6 Пиковая RT: 9,8 секунды Среднее число запросов в секунду: 3,8 Средняя RT: 7,5 секунд Процент неудачных транзакций: 0% Период выполнения теста: 15:05~15:35.
Тест 3. Новое сохранение фонового веб-клиента.
Среда стресс-тестирования: тест 3 (обновление архитектуры) Стресс-тестирование бизнеса: создание новых и сохранение клиентов веб-сервера Пиковое количество запросов в секунду: 11 Пиковая RT: 3,7 секунды Среднее число запросов в секунду: 7,2 Средняя RT: 2,5 секунды Процент неудачных транзакций: 0% Период выполнения теста: 15:45~16:15.
Тест 2. Создайте новый и сохраните контрактный заказ в фоновом режиме через Интернет.
Среда стресс-тестирования: Тест 2 (обновление архитектуры) Стресс-тестирование бизнеса: создание и сохранение контрактов веб-сервера Пиковое количество запросов в секунду: 5,6 Пиковая RT: 11 секунд Среднее число запросов в секунду: 3,6 Средняя RT: 7 секунд Процент неудачных транзакций: 0% Период выполнения теста: 17:09~17:39.
Тест 3. Создайте новый и сохраните контрактный заказ в фоновом режиме в Интернете.
Среда стресс-тестирования: тест 3 (обновление архитектуры) Стресс-тестирование бизнеса: создание и сохранение контрактов веб-сервера Пиковое количество запросов в секунду: 6,9 Пиковая RT: 6,3 секунды Среднее количество запросов в секунду: 4,4 Средняя RT: 4,9 секунды Процент неудачных транзакций: 0% Период выполнения теста: 16:33~17:03.
Перед обновлением:
Среда стресс-тестирования: Тест 2 (обновление архитектуры) Стресс-тестирование бизнеса: создание новых и сохранение клиентов веб-сервера Пиковое количество запросов в секунду: 5,6 Пиковая RT: 9,8 секунды Среднее число запросов в секунду: 3,8 Средняя RT: 7,5 секунд Процент неудачных транзакций: 0% Период выполнения теста: 15:05~15:35.
После обновления:
Среда стресс-тестирования: тест 3 (обновление архитектуры) Стресс-тестирование бизнеса: создание новых и сохранение клиентов веб-сервера Пиковое количество запросов в секунду: 11 Пиковая RT: 3,7 секунды Среднее число запросов в секунду: 7,2 Средняя RT: 2,5 секунды Процент неудачных транзакций: 0% Период выполнения теста: 15:45~16:15.
в заключение:После обновления архитектуры стабильность вновь сохраненных бизнес-сценариев, созданных серверными веб-клиентами, стала хуже, чем до обновления.
Перед обновлением:
Среда стресс-тестирования: Тест 2 (обновление архитектуры) Стресс-тестирование бизнеса: создание и сохранение контрактов веб-сервера Пиковое количество запросов в секунду: 5,6 Пиковая RT: 11 секунд Среднее число запросов в секунду: 3,6 Средняя RT: 7 секунд Процент неудачных транзакций: 0% Период выполнения теста: 17:09~17:39.
После обновления:
Среда стресс-тестирования: тест 3 (обновление архитектуры) Стресс-тестирование бизнеса: создание и сохранение контрактов веб-сервера Пиковое количество запросов в секунду: 6,9 Пиковая RT: 6,3 секунды Среднее количество запросов в секунду: 4,4 Средняя RT: 4,9 секунды Процент неудачных транзакций: 0% Период выполнения теста: 16:33~17:03.
в заключение:После обновления архитектуры стабильность вновь сохраненных бизнес-сценариев в контракте веб-сервера хуже, чем до обновления.