{"id":31578894,"url":"https://github.com/pcade/sw_qa","last_synced_at":"2025-10-05T20:16:49.319Z","repository":{"id":316131075,"uuid":"1061648484","full_name":"pcade/SW_QA","owner":"pcade","description":null,"archived":false,"fork":false,"pushed_at":"2025-09-22T20:15:59.000Z","size":4,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-22T22:13:11.182Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/pcade.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-22T07:48:34.000Z","updated_at":"2025-09-22T20:16:02.000Z","dependencies_parsed_at":"2025-09-22T22:13:31.678Z","dependency_job_id":"f1c27e8e-8f4c-4f4f-adce-ffc8bd211ab3","html_url":"https://github.com/pcade/SW_QA","commit_stats":null,"previous_names":["pcade/sw_qa"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/pcade/SW_QA","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcade%2FSW_QA","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcade%2FSW_QA/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcade%2FSW_QA/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcade%2FSW_QA/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/pcade","download_url":"https://codeload.github.com/pcade/SW_QA/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/pcade%2FSW_QA/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278510958,"owners_count":25999015,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-10-05T20:16:48.022Z","updated_at":"2025-10-05T20:16:49.314Z","avatar_url":"https://github.com/pcade.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SW_QA\n---\n## Подготовка\n1. Cкачать проект ```git clone https://github.com/pcade/SW_QA.git ```\n2. Перейти в проект ```cd SW_QA```\n3. Создать виртуальное окружение ```python3 -m venv env```\n4. Запустить виртуальное окружение ```source env/bin/activate```\n5. Установить зависимости ```pip install -r requirements.txt```\n## Задание 1\n---\n\u003e Устройство работает по serial интерфейсу. Отвечает на такие команды, как: \n\u003e   запрос GET_V, ответ – “V_12V”\n\u003e   запрос GET_A, ответ – “A_1A”\n\u003e   запрос GET_S, ответ – “S_DSA123”\n\u003e Необходимо написать класс для работы с устройством на Python.\n\u003e Написать простые автоматизированные кейсы, используя свой класс, на Python/PyTest.\n\u003e В случае необходимости доп. информации, использовать собственные гипотезы и допущения,\n\u003e с описанием в тестовом задании.\n---\n### Особенности\nИсходя из текста задания можно определить, следующее:\n - Системное окружение не определенно (`Win, Linux`);\n - Тип подключения `serial` интерфейса не определён (`UART, RS-232, RS-485, USB + MOXA`);\n - Отсутсвие данных о кодировке (`ASCII, UTF-8`);\n - Устройство не определенно;\n - Корректные данные о подключение не определены(`baud rate, data bits, stop bits, parity, timeout`)\n - Устройство подключено и настроенно в системе;\n - `serial` порт отвечает на команды **GET_V, GET_A, GET_S** с предопределенной логикой:\n   - **GET_V** - ожидаемый результат `V_12V`, где:\n     - **V_** - константа;\n     - **12** - числовое значение без разделителя представленное (``Динамически | str``);\n     - **V**  - константа (`Вольт`);\n   - **GET_A** - ожидаемый результат `A_1A`, где:\n     - **A_** - константа;\n     - **1** - числовое значение без разделителя представленное (``Динамически | str``);\n     - **A**  - константа (`Ампер`);\n   - **GET_S** - ожидаемый результат `S_DSA123`, где:\n     - **S_** - константа;\n     - **DSA123** - нумерация серии представленная (``Динамически | str``).\n\n\u003e Учитывая всё выше изложенное необходимо учесть неопределенность\n\u003e технологического стека и способы взаимодействия с `serial` портом. Фактической\n\u003e зоной ответственности класса будет являться кроссплатформенное исполнение команд **GET_V, GET_A, GET_S** в оболочке python.\n\n### Пример использования\n```python3\nfrom src.device_controller import DeviceController\nwith DeviceController(port='/dev/ttyUSB0',\n                      baudrate=9600,\n                      timeout=1.0) as device:\n    try:\n        # Получение напряжения\n        voltage = device.get_voltage()\n        print(f\"Напряжение: {voltage}\")\n        \n        # Получение тока\n        ampere = device.get_ampere()\n        print(f\"Ток: {ampere}\")\n        \n        # Получение серийного номера\n        serial_num = device.get_serial()\n        print(f\"Серийный номер: {serial_num}\")\n        \n    except Exception as e:\n        print(f\"Ошибка: {e}\")\n```\n### Доступные тесты. \n#### Интеграционные тесты (`test_device_controller_integration.py`)\n\u003e Требуется наличие физического `serial` и подключенного, исправного устройства \n```bash\npytest tests/device_controller/integration -v\n```\n\n- Установка соединения с serial портом\n\n- Соответствие измерения напряжения **GET_V**\n\n- Соответствие измерения тока **GET_A**\n\n- Соответствие серийного номера **GET_S**\n\n- Последовательные операции\n\n- Обработка ошибок\n\n#### Unit тесты (`test_device_controller.py`)\n```bash\npytest tests/device_controller/unit -v\n```\n\n- Валидация форматов напряжения **GET_V**\n\n- Валидация форматов тока **GET_A**\n\n- Валидации ответов на команду **GET_S**:\n\n- Общий метод отправки команд\n\n- Обработка специальных символов\n\n- Обработка ошибки соединения\n\n\n---\n## Задание 2\n---\n\u003eUDP server отвечает  на такие команды, как:\n\u003e   запрос {‘cmd’: ‘GET_V’}, ответ - {‘cmd’: ‘GET_V’, ‘payload’: ‘V_12V‘}\n\u003e   запрос {‘cmd’: ‘GET_ A’}, ответ - {‘cmd’: ‘GET_ A’, ‘payload’: ‘A_1A‘}\n\u003e   запрос {‘cmd’: ‘GET_ S’}, ответ - {‘cmd’: ‘GET_ S’, ‘payload’: ‘S_DSA123‘}\n\u003e Необходимо написать класс – клиент, используя  websocket + Python. \n\u003e Написать простые автоматизированные кейсы, используя свой класс, на Python/PyTest.\n\u003e В случае необходимости доп. информации, использовать собственные гипотезы и допущения,\n\u003e с описанием в тестовом задании.\n---\n### Особенности\nИсходя из текста задания можно определить, следующее:\n - Системное окружение не определенно (`Win, Linux`);\n - Данные о сервер отсутствуют (`IP, port`);\n - `Аутентификация и шифрование` не определено;\n - Тип подключения `Websocket`;\n - Протокол связи `TCP`;\n - Формат данных `JSON`;\n - Принято считать, что сервер отвечает на следующие обращения;\n   - **GET_V**:\n     -  `запрос` {'cmd': 'GET_V'}\n     -  `ответ`  {'cmd': 'GET_V', 'payload': 'V_12V'}:\n        - **payload** - константа;\n        - **V_**      - константа;\n        - **12**      - числовое значение без разделителя представленное (``Динамически | str``);\n        - **V**       - константа (`Вольт`);\n   - **GET_A**:\n     -  `запрос` {'cmd': 'GET_A'}\n     -  `ответ`  {'cmd': 'GET_A', 'payload': 'V_12V'}:\n        - **payload** - константа;\n        - **A_**      - константа;\n        - **1**       - числовое значение без разделителя представленное (``Динамически | str``);\n        - **A**       - константа (`Ампер`);\n   - **GET_S**:\n     -  `запрос` {'cmd': 'GET_S'}\n     -  `ответ`  {'cmd': 'GET_S', 'payload': 'S_DSA123'}:\n        - **payload** - константа;\n        - **S_**      - константа;\n        - **DSA123**  - нумерация серии представленная (``Динамически | str``).\n\n### Пример использования\n```python3\nfrom src.websocket_client import WebsocketClient\n\n# Пример 1: Использование с контекстным менеджером\nwith WebsocketClient(\"ws://localhost:8765\") as client:\n    voltage = client.get_voltage()\n    ampere = client.get_ampere()\n    serial = client.get_serial()\n    \n    print(f\"Напряжение: {voltage}\")\n    print(f\"Ток: {ampere}\")\n    print(f\"Серийный номер: {serial}\")\n\n# Пример 2: Явное управление\nclient = WebsocketClient(\"ws://192.168.1.100:8080\")\ntry:\n    voltage = client.get_voltage()\n    print(f\"Напряжение: {voltage}\")\nfinally:\n    client.close()\n```\n### Доступные тесты.\n#### Интеграционные тесты (`test_websocket_client_integration.py`)\n\u003e Требуется наличие работающего `UDP` сервера, с открытым `TCP` портом, отдающим корректные данные \n```bash\npytest tests/websocket_client/integration -v\n```\n\n- Установка соединения с сервером портом\n\n- Соответствие измерения напряжения **GET_V**\n\n- Соответствие измерения тока **GET_A**\n\n- Соответствие серийного номера **GET_S**\n\n- Последовательные операции\n\n- Обработка ошибок\n\n- Тест контекстного менеджера\n\n- Тест переподключения\n\n#### Unit тесты (`test_device_controller.py`)\n```bash\npytest tests/websocket_client/unit -v\n```\n\n- Валидация форматов напряжения **GET_V**\n\n- Валидация форматов тока **GET_A**\n\n- Валидации ответов на команду **GET_S**:\n\n- Общий метод отправки команд\n\n- Обработка ошибки соединения","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcade%2Fsw_qa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpcade%2Fsw_qa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpcade%2Fsw_qa/lists"}