Технология тестирования интерфейса RPC — практика автоматического тестирования веб-сокетов
Технология тестирования интерфейса RPC — практика автоматического тестирования веб-сокетов

WebSocket — это тип полнодуплексной связи по одному TCP-соединению (полный дуплекс — это термин, обозначающий передачу данных. Связь позволяет передавать данные в обоих направлениях одновременно, и по своим возможностям она эквивалентна комбинации двух методов симплексной связи. Полнодуплексный режим относится к протоколу, который может передавать сигналы в обоих направлениях (A→B и B→A) одновременно (мгновенно). Это относится к A→B и B→A одновременно, что является мгновенным и быстрым. синхронно).

Протокол связи WebSocket был установлен IETF в 2011 году как стандарт RFC 6455 и дополнен RFC7936. WebSocket API (WebSocket API — это интерфейс, который использует протокол WebSocket для создания полнодуплексного канала для отправки и получения сообщений) также был признан W3C стандартом.

Протокол HTTP не поддерживает постоянные соединения. Хотя в HTTP 1.1 были внесены улучшения, в HTTP-соединении можно отправлять несколько запросов и получать несколько ответов.

Но в HTTP Request = Response всегда истинно, а это значит, что на запрос может быть только один ответ. Более того, эта реакция также пассивна и не может быть инициирована активно.

Websocket обычно используется для социальных сетей/подписки, многопользовательских игр, совместного офиса/редактирования, котировок фондов фондового рынка, прямых спортивных трансляций, аудио- и видеочата/видеоконференций/онлайн-обучения, умного дома и приложений на основе определения местоположения.

Интерфейс веб-сокета не может использовать запросы для прямого вызова интерфейса. Для реализации вызова можно использовать стороннюю библиотеку. В следующем материале рассказывается, как вызвать стороннюю библиотеку для реализации автоматического тестирования интерфейса веб-сокета.

Настоящий бой

Реализация автоматизации интерфейса веб-сокета с использованием языка Python.

Экологическая подготовка

1. Установите среду pyhton3 и загрузите необходимые библиотеки времени выполнения.

2. Загрузите необходимую библиотеку времени выполнения.

pip install websocket-client

Настоящий бой Демо

Подключиться к веб-серверу

import logging

from websocket import create_connection

logger = logging.getLogger(name)

url = 'ws://echo.websocket.org/' #Интернет-интерфейс веб-сокета с обратной связью, доступ к которому необходимо получить после подключения через веб-сокет. Доступ к нему нельзя получить напрямую, введя адрес на веб-странице.

wss = create_connection(url, timeout=timeout)

Отправить сообщение через веб-сокет

wss.send('Hello World')

Получать сообщения веб-сокета

res = wss.recv()

logger.info(res)

Закрыть соединение через веб-сокет

wss.close()

Вызов сторонней библиотеки веб-сокета не поддерживает прямую отправку типов данных, отличных от строк, поэтому перед отправкой запроса вам необходимо преобразовать структурированный формат Python в строковый тип или строку json, а затем инициировать запрос интерфейса веб-сокета. .

#Формат тела данных для отправки:

data= {

Язык кода:txt
копировать
"a" : "abcd",
Язык кода:txt
копировать
"b" : 123
Язык кода:txt
копировать
}

Перед отправкой данные необходимо преобразовать в строку json.

new_data=json.dumps(data,ensure_ascii=False)

wss.send(new_data)

Обработка полученного тела данных: Если интерфейс определен как json, поскольку данные передаются в строковом формате, полученное тело данных необходимо преобразовать

Формат тела полученных данных также является строкой.

logger.info(type(res)) # <class 'str'>

Обработка преобразования формата содержимого ответа:

def load_json(base_str):

Язык кода:txt
копировать
if isinstance(base_str, str):
Язык кода:txt
копировать
    try:
Язык кода:txt
копировать
        res = json.loads(base_str)
Язык кода:txt
копировать
        return load_json(res)
Язык кода:txt
копировать
    except JSONDecodeError:
Язык кода:txt
копировать
        return base_str
Язык кода:txt
копировать
elif isinstance(base_str, list):
Язык кода:txt
копировать
    res = []
Язык кода:txt
копировать
    for i in base_str:
Язык кода:txt
копировать
        res.append(load_json(i))
Язык кода:txt
копировать
    return res
Язык кода:txt
копировать
elif isinstance(base_str, dict):
Язык кода:txt
копировать
    for key, value in base_str.items():
Язык кода:txt
копировать
        base_str[key] = load_json(value)
Язык кода:txt
копировать
    return base_str
Язык кода:txt
копировать
return base_str

Автоматическое тестирование интерфейса Websocket, демонстрация вторичной упаковки

web_socket_util.py инкапсулирует общие операции интерфейса веб-сокета:

import logging

import json

from websocket import create_connection

logger = logging.getLogger(name)

class WebsocketUtil():

Язык кода:txt
копировать
def conn(self, uri, timeout=3):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    соединятьwebсервер
Язык кода:txt
копировать
    :param uri: URL-адрес службы
Язык кода:txt
копировать
    :param timeout: тайм-аут
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    self.wss = create_connection(uri, timeout=timeout)
Язык кода:txt
копировать
def send(self, message):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    отправить тело данных запроса
Язык кода:txt
копировать
    :param message: Информация о данных для отправки
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    if not isinstance(message, str):
Язык кода:txt
копировать
        message = json.dumps(message)
Язык кода:txt
копировать
    return self.wss.send(message)
Язык кода:txt
копировать
def load_json(self, base_str):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    Обработка тела данных
Язык кода:txt
копировать
    :param base_str: Тело данных, подлежащих обработке
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    if isinstance(base_str, str):
Язык кода:txt
копировать
        try:
Язык кода:txt
копировать
            res = json.loads(base_str)
Язык кода:txt
копировать
            return self.load_json(res)
Язык кода:txt
копировать
        except JSONDecodeError:
Язык кода:txt
копировать
            return base_str
Язык кода:txt
копировать
    elif isinstance(base_str, list):
Язык кода:txt
копировать
        res = []
Язык кода:txt
копировать
        for i in base_str:
Язык кода:txt
копировать
            res.append(self.load_json(i))
Язык кода:txt
копировать
        return res
Язык кода:txt
копировать
    elif isinstance(base_str, dict):
Язык кода:txt
копировать
        for key, value in base_str.items():
Язык кода:txt
копировать
            base_str[key] = self.load_json(value)
Язык кода:txt
копировать
        return base_str
Язык кода:txt
копировать
    return base_str
Язык кода:txt
копировать
def recv(self, timeout=3):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    перенимать информацию тела данных и вызывать метод обработки тела данных для обработки тела ответа
Язык кода:txt
копировать
    :param timeout: тайм-аут
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    if isinstance(timeout, dict):
Язык кода:txt
копировать
        timeout = timeout["timeout"]
Язык кода:txt
копировать
    try:
Язык кода:txt
копировать
        self.settimeout(timeout)
Язык кода:txt
копировать
        recv_json = self.wss.recv()
Язык кода:txt
копировать
        all_json_recv = self.load_json(recv_json)
Язык кода:txt
копировать
        self._set_response(all_json_recv)
Язык кода:txt
копировать
        return all_json_recv
Язык кода:txt
копировать
    except WebSocketTimeoutException:
Язык кода:txt
копировать
        logger.error(f"Нет данных для перенимания более {timeout} секунд")
Язык кода:txt
копировать
def settimeout(self, timeout):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    настраиватьтайм-аут
Язык кода:txt
копировать
    :param timeout: тайм-аут
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    self.wss.settimeout(timeout)
Язык кода:txt
копировать
def recv_all(self, timeout=3):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
перенимать Множественную информацию тела данных,И вызовите метод обработки тела данных для обработки тела ответа.
Язык кода:txt
копировать
    :param timeout: тайм-аут
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    if isinstance(timeout, dict):
Язык кода:txt
копировать
        timeout = timeout["timeout"]
Язык кода:txt
копировать
    recv_list = []
Язык кода:txt
копировать
    while True:
Язык кода:txt
копировать
        try:
Язык кода:txt
копировать
            self.settimeout(timeout)
Язык кода:txt
копировать
            recv_json = self.wss.recv()
Язык кода:txt
копировать
            all_json_recv = self.load_json(recv_json)
Язык кода:txt
копировать
            recv_list.append(all_json_recv)
Язык кода:txt
копировать
            logger.info(f"all::::: {all_json_recv}")
Язык кода:txt
копировать
        except WebSocketTimeoutException:
Язык кода:txt
копировать
            logger.error(f"Нет данных для перенимания более {timeout} секунд")
Язык кода:txt
копировать
            break
Язык кода:txt
копировать
    self._set_response(recv_list)
Язык кода:txt
копировать
    return recv_list
Язык кода:txt
копировать
def close(self):
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    закрытиесоединять
Язык кода:txt
копировать
    :return:
Язык кода:txt
копировать
    '''
Язык кода:txt
копировать
    return self.wss.close()
Язык кода:txt
копировать
def _set_response(self, response):
Язык кода:txt
копировать
    self.response = response
Язык кода:txt
копировать
def _get_response(self) -> list:
Язык кода:txt
копировать
    return self.response

test_case.py автоматизированный тестовый пример интерфейса веб-сокета:

class TestWsDemo:

Язык кода:txt
копировать
def setup(self):
Язык кода:txt
копировать
    url = 'ws://echo.websocket.org/'
Язык кода:txt
копировать
    self.wss = WebsocketUtil()
Язык кода:txt
копировать
    self.wss.conn(url)
Язык кода:txt
копировать
def teardown(self):
Язык кода:txt
копировать
    self.wss.close()
Язык кода:txt
копировать
def test_demo(self):
Язык кода:txt
копировать
    data = {"a": "hello", "b": "world"}
Язык кода:txt
копировать
    self.wss.send(data)
Язык кода:txt
копировать
    res = self.wss.recv()
Язык кода:txt
копировать
    assert 'hello' == res['a']

WebSocket упрощает обмен данными между клиентом и сервером, позволяя серверу активно передавать данные клиенту.

В API WebSocket браузеру и серверу нужно только завершить рукопожатие, и между ними может быть создано постоянное соединение для двунаправленной передачи данных.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose