Тестирование HTTP API (.lnh)

Файл → Создать → Новый тест API открывает HTTP-клиент, сохраняемый в файл .lnh. Один файл представляет конечную точку (метод, URL, заголовки и тело) и хранит несколько тестов в списке слева — у каждого теста свои значения переменных {name}, используемых в URL, заголовках и теле, а также результат последнего запуска (статус, время, дата, заголовки и тело ответа). Также показывается эквивалентная команда curl. Та же разовая операция доступна через CLI (http) и MCP (http_request). Тестер использует curl, который входит в Windows 10 и 11; если его нет, LightNote перед отправкой открывает руководство по установке.

Отправка и ответ

Ctrl+Enter отправляет запрос. Пока ответ не пришёл, та же кнопка становится кнопкой Остановить (или Esc), а ожидание показывает секунды. Значок ответа показывает статус и время; рядом — тип, размер и время запуска теста. Строка curl следует за тем, что вы вводите, уже с переменными выбранного теста: кнопка рядом копирует команду, а её стрелка предлагает то же самое для PowerShell, Python, JavaScript, C# и HTTPie. Если вставить команду curl прямо в URL, будут импортированы метод, заголовки и тело, а тесты останутся.

Переменная без значения в тесте отправляется буквально ({id} в URL, и сервер отвечает ошибкой, которая не объясняет причину) — вкладка Переменные выделяет её и называет. Точка рядом с каждым тестом в списке окрашена в цвет последнего статуса, а пустое кольцо — тест, который ещё не запускался. В ответе панель над телом форматирует JSON/XML только на экране, переносит строки, копирует тело и сохраняет его в файл в том виде, в каком оно пришло.

Составить запрос. Вкладка Параметры показывает query-часть URL списком: правка строки меняет URL, а правка URL меняет список. Вкладка Аутентификация сама собирает заголовок — Basic, Bearer или Ключ API, в заголовке или в URL, — и каждое поле принимает {variable}, чтобы секрет хранился в окружении, а не в файле; если на вкладке Заголовки уже есть такой же заголовок, действует он. В Теле поле Тип выбирает JSON, XML, SOAP, форму, multipart (текстовые поля и файлы) или файл, отправляемый в двоичном виде, а Content-Type добавляется сам, если вы его не указали. Относительный путь к файлу отсчитывается от папки .lnh. С multipart или файлом стрелка кнопки копирования делает PowerShell и JavaScript серыми: они не умеют отправлять такое тело. Вкладка Настройки меняет тайм-аут (по умолчанию 60 с) и включает переход по перенаправлениям — без этого показывается сам ответ 3xx. Открытый в предыдущей версии LightNote, файл отправляется без аутентификации и без типа, но никогда не превращается в другой запрос. Для локального сервера с собственным сертификатом параметр Не проверять сертификат (HTTPS) отключает проверку: пока он включён, в строке ответа написано сертификат не проверен, и lnote http-run тоже сообщает об этом в отчёте.

Читать ответ. Тело открывается в редакторе кода только для чтения, с подсветкой по типу ответа, сворачиванием блоков и поиском окна (Ctrl+F). Вкладка Cookie перечисляет то, что сервер попросил сохранить, а Хронология показывает точный запрос, который ушёл, — с заголовками, которые добавил сам curl, — и сырые заголовки ответа. Хронология хранится только в памяти: в ней есть Authorization, а файл попадает в Git.

Проверки

Вкладка Проверки показывает, пройден ли тест. Каждая строка сравнивает часть ответа — статус, заголовок, всё тело, путь JSONPath ($.user.id, $.items[0].name, $.items.length()), путь XPath (//Price, count(//Item)) или время в миллисекундах — с ожидаемым значением: равно, не равно, больше, меньше, содержит, соответствует регулярному выражению, существует или имеет тип. В XPath префикс имени игнорируется, поэтому soap:Envelope и Envelope — один и тот же шаг. Если проверки есть, результат решают они: ожидаемый 404 проходит, а 200 с неверным полем не проходит. Результат каждой проверки виден в последнем столбце, сводка — рядом со значком ответа, а точка теста в списке становится зелёной или красной. Строка со снятой отметкой остаётся в файле, но не учитывается в результате.

Кнопка воспроизведения вверху списка запускает все тесты файла по очереди и показывает, сколько из них прошло. Когда тест запущен дважды, кнопка сравнения над телом ответа открывает предыдущий и текущий запуск рядом, с отформатированным телом с обеих сторон. Сохраняется только предыдущий запуск: файл попадает в Git, и длинная история заполняла бы каждый diff.

Окружения, захваты и вся папка

Окружения используют открытый формат JetBrains и VS Code: файл http-client.env.json в папке (или выше) с объектом для каждого окружения — {"dev": {"host": "http://localhost:8080"}} — и рядом файл http-client.private.env.json с секретами, чтобы они не попадали в Git. В одном окружении побеждает приватный файл, а $shared действует во всех. Селектор рядом с URL выбирает окружение, а меню импорта и экспорта создаёт файл. Переменная берётся из теста, затем из захвата, затем из окружения, а вкладка Переменные показывает, откуда пришла каждая.

Вкладка Захваты сохраняет часть ответа как переменную — token входа, id только что созданного ресурса — для следующих тестов этого файла и других файлов той же папки. Так .lnh входа передаёт значение в аутентифицированный вызов другого файла. Захваченное значение хранится только в памяти и никогда не записывается в файл.

Папка — это коллекция: lnote http-run --path <папка> --env dev запускает все её .lnh в естественном порядке (01-login раньше 02-profile) и завершается с ошибкой, если какой-либо тест не прошёл, что подходит для CI. Тот же запуск доступен через MCP как http_test_run, чтобы ИИ-агент мог запускать написанные вами тесты. По умолчанию файлы не меняются; --save записывает в них последний результат каждого теста.

Импорт и экспорт

Импорт и экспорт OpenAPI. Кнопка со стрелками над списком тестов открывает Импортировать OpenAPI… и Экспортировать OpenAPI…. Импорт читает спецификацию в формате YAML или JSON в трёх используемых поколениях — Swagger 2.0, OpenAPI 3.0 и 3.1 — и собирает тест сам: {parameters} пути уже используют тот же синтаксис, что и переменные {name} в .lnh, объявленные примеры становятся значениями теста, схема безопасности превращается в заголовок Authorization, а каждый объявленный сервер становится отдельным тестом (тестовая и промышленная среда рядом). Поскольку файл .lnh хранит одну конечную точку, спецификация с несколькими операциями спросит, какую импортировать, — либо запишет все сразу, по одному файлу .lnh на операцию.

Экспорт идёт в обратную сторону и создаёт из файла спецификацию OpenAPI 3.0.3: серверы, параметры и тело берутся из шаблона, а примеры ответов — из записанных запусков. Это каркас, а не полный контракт: .lnh описывает вызовы, поэтому типы, описания и схемы не восстанавливаются. Ваши тесты едут в поле x-lightnote-tests, поэтому при повторном импорте файла возвращаются нетронутыми.

Импорт команды curl. В той же кнопке пункт Импортировать команду curl… открывает поле для вставки — команда приходит оттуда, а не с диска, и поле уже заполнено, если в буфере обмена лежит curl. Понимает три диалекта, в которых ходит одна и та же команда: Копировать как cURL из Chrome/Firefox (одинарные кавычки), Copy as cURL (cmd) в Windows (с ^) и пример из документации, разбитый символом \. Метод берётся из -X — или выводится: POST, когда есть тело, и GET, когда его нет.

Импорт буквальный: ни одно значение не превращается в переменную {name} само по себе, потому что угадывать, какой токен является секретом, — верный способ ошибиться. В нескольких случаях выводится предупреждение вместо подмены: тело, приходящее из файла (-d @файл), прочитать нельзя, а отправка multipart (-F) не воспроизводится точно, поэтому поля попадают в тело текстом, чтобы вы их поправили.

Импорт из другого инструмента. Импортировать из другого инструмента… читает файл .http/.rest (REST Client для VS Code, JetBrains, Visual Studio), коллекцию или окружение Postman, экспорт Insomnia (v4 в JSON или v5 в YAML), HAR, который браузер сохраняет командой Сохранить всё как HAR, .bru из Bruno (или всю папку через Импортировать папку Bruno…) и WSDL SOAP-сервиса. Формат определяется по содержимому, а не по расширению. Каждый запрос становится файлом .lnh, а папки коллекции — папками: выберите один для этого файла или сохраните все сразу. {{name}} превращается в {name}, аутентификация — в заголовок, окружения записываются в http-client.env.json (то, что источник помечает как секрет, — в .private), не меняя уже имеющихся значений, а проверки и захваты Bruno — и pm.response.to.have.status из Postman — становятся здешними проверками и захватами. Из HAR берутся только вызовы API и сама страница, а ответ, полученный браузером, становится последним запуском; из WSDL создаётся по одному SOAP-конверту на операцию, с SOAPAction и каждым полем в виде переменной.

То, у чего нет аналога, остаётся как есть, и об этом сообщается: скрипты до и после запроса не преобразуются, динамические переменные ({{$guid}}) и цепочки остаются буквальными, а Basic с переменной, тело multipart и тело из файла попадают на вкладку Аутентификация и в Тип тела — путь к файлу, пришедший с другой машины, перечисляется для проверки. При сохранении коллекции этот отчёт становится заметкой в папке назначения. Экспортировать как .http… делает обратное с выбранным тестом: шаблон с {{name}} и значения в виде @name = значение.

Указатель

Редактирование

Инструменты

Автоматизация (ИИ / скрипты)

Справочник