
V 语言 WebSocket 的 Autobahn 自动化测试套件配置、运行与源码解析【免费下载链接】vSimple, fast, safe, compiled language for developing maintainable software. Compiles itself in 1s with zero library dependencies. Supports automatic C V translation. https://vlang.io项目地址: https://gitcode.com/GitHub_Trending/v/v本篇文章基于 V 语言仓库中的 autobahn 测试目录 README 展开完整讲解 V 如何使用 Autobahn 协议测试套件对net.websocket客户端与服务端进行自动化合规测试。通过阅读本文你将掌握整套测试的目录结构、docker-compose 协作拓扑、runCase/updateReports测试协议、TLSwss测试的本地证书处理方式以及如何在本机复现完整的 Autobahn 测试流程。Autobahn 测试套件与 V 的定位Autobahn 是业界广泛使用的 WebSocketRFC 6455协议一致性测试工具V 仓库通过官方crossbario/autobahn-testsuiteDocker 镜像将其引入在构建阶段自动运行README 原文This is the autobahn automatic tests on build用于验证 vlib/net/websocket 模块的协议实现是否符合规范。README 同时明确了一个关键限制The performance tests are skipped due to timeouts in Github actions.即性能类用例Autobahn 用例编号9.*会因 GitHub Actions 中的超时问题而被跳过这一点在后续的 Autobahn 配置文件中以exclude-cases的形式得到了印证。目录结构与各文件角色整个测试套件位于 vlib/net/websocket/tests/autobahn其文件角色划分如下文件/目录作用README.md测试套件总说明与本地运行指引docker-compose.yml编排 Autobahn 服务端ws/wss与 V 被测服务端三个容器autobahn_client.v本地运行的 V WebSocket 客户端非 TLS 测试autobahn_client_wss.v本地运行的 V WebSocket 客户端wss/TLS 测试autobahn_server.v被测 V WebSocket 服务端回显实现fuzzing_server非 TLS 场景的 Autobahn 容器Dockerfile 配置文件 结果校验脚本fuzzing_server_wssTLS 场景的 Autobahn 容器含本地证书server.crt/server.keyws_test在容器内从源码构建 V 并编译被测服务端的镜像local_run供 GitHub Actions 本地模拟器nektos/act使用的构建镜像整体架构docker-compose 三容器协作docker-compose.yml 定义了三个服务构成双 Autobahn 服务端 单 V 被测端的拓扑version: 3 services: server: container_name: autobahn_server build: fuzzing_server ports: - 9001:9001 # Autobahn fuzzingserverwsV 客户端连接此端口 - 8080:8080 # Autobahn 报告 Web 界面 server_wss: container_name: autobahn_server_wss build: fuzzing_server_wss ports: - 9002:9002 # Autobahn fuzzingserverwssV 客户端连接此端口 - 8081:8080 # TLS 报告 Web 界面宿主 8081 映射容器 8080 client: container_name: autobahn_client build: dockerfile: vlib/net/websocket/tests/autobahn/ws_test/Dockerfile context: ../../../../../三者分工如下serverfuzzing_server以ws://127.0.0.1:9001运行 Autobahn fuzzingserver扮演服务端测试器等待 V 客户端接入同时以fuzzingclient配置反向充当客户端去 fuzz 容器网络中的 V 被测服务端autobahn_client:9002。8080 端口对外提供非 TLS 的测试报告页面。server_wssfuzzing_server_wss以wss://127.0.0.1:9002运行 TLS 版 fuzzingserver用于验证 V 客户端的 wss 连接能力8081 端口对外提供 TLS 报告页面容器内仍监听 8080。client基于 ws_test/Dockerfile 构建在容器内从仓库源码编译出 V 编译器再编译 autobahn_server.v 作为入口作为被测的 V 服务端。它通过 compose 内部网络被fuzzing_server的 fuzzingclient 访问因此无需对外映射端口。ws_test 镜像的关键构建步骤ws_test/DockerfileFROM thevlang/vlang:debian-build COPY ./ /src/ WORKDIR /src RUN make fresh_tcc CCclang make CCclang RUN /src/v /src/vlib/net/websocket/tests/autobahn/autobahn_server.v RUN chmod x /src/vlib/net/websocket/tests/autobahn/autobahn_server ENTRYPOINT [ /src/vlib/net/websocket/tests/autobahn/autobahn_server ]docker-compose.yml中client的context: ../../../../../从 autobahn 目录上溯到仓库根目录从而把整个 V 源码树复制进镜像供make构建。客户端测试runCase/updateReports 与回显协议README 的本地运行指引中客户端测试要求从local_run文件夹编译运行autobahn_client.v非 TLS与autobahn_client_wss.vTLS。这两个文件的源码位于 autobahn 目录根部逻辑完全一致仅目标 URI 不同。autobahn_client.v 的核心流程fn main() { for i in 1 .. 304 { println(\ncase: ${i}) handle_case(i) or { println(error should be ok: ${err}) } } // update the reports uri : ws://autobahn_server:9001/updateReports?agentv-client mut ws : websocket.new_client(uri)! ws.connect()! ws.listen()! } fn handle_case(case_nr int) ! { uri : ws://autobahn_server:9001/runCase?case${case_nr}agentv-client mut ws : websocket.new_client(uri)! ws.on_message(on_message) ws.connect()! ws.listen()! } fn on_message(mut ws websocket.Client, msg websocket.Message) ! { // autobahn tests expects to send same message back if msg.opcode .pong { // We just wanna pass text and binary message back to autobahn return } ws.write(msg.payload, msg.opcode) or { panic(err) } }要点拆解用例遍历for i in 1 .. 304是 V 的独占区间写法实际覆盖 Autobahn 用例 1 到 303每个用例通过runCase?caseNagentv-client建立一条独立连接执行。回显协议Autobahn 的约定是把收到的消息原样发回。on_message中除.pong控制帧外Pong 由协议栈按 Ping 自动应答无需业务层回显其余文本/二进制消息一律ws.write(msg.payload, msg.opcode)原样写回。报告收尾全部用例跑完后连接updateReports?agentv-client端点把本次运行的 agent 标识v-client写入报告索引。错误容忍单个用例失败不会中断整个流程handle_case(i) or { println(error should be ok: ${err}) }保证 303 个用例能全部执行完最终由结果校验脚本统一判定。autobahn_client_wss.v 与上述逻辑一致唯一实质差异是 URI 使用wss://autobahn_server_wss:9002注释中保留了可切换的wss://localhost:9002本地直连写法。由于 Autobahn 的 TLS 端口使用本地自签证书README 特别提示浏览器/客户端会遇到证书信任告警直接接受即可继续。服务端测试autobahn_server.v 与 fuzzingclient服务端方向的测试由 autobahn_server.v 承担它在容器内监听 9002 端口等待 Autobahn fuzzingclient 以客户端身份来 fuzz 它fn main() { mut s : websocket.new_server(.ip6, 9002, /) s.on_message(on_message) s.listen() or { panic(err) } }注意new_server(.ip6, 9002, /)的三个参数监听族IPv6、端口 9002、路径/。on_message与客户端侧相同——除 Pong 外原样回显这正是 Autobahn 对被测服务端的基本要求。与之配套的 fuzzingclient.json 描述了 Autobahn 以客户端姿态测试服务端时的目标{ options: { failByDrop: false }, outdir: ./reports/servers, servers: [ { agent: AutobahnServer, url: ws://autobahn_client:9002 } ], cases: [*], exclude-cases: [9.*, 11.*, 12.*, 13.*], exclude-agent-cases: {} }参数含义failByDrop为false表示不因连接被服务端主动断开而直接判定失败交由具体用例的期望行为判断。outdir报告输出目录./reports/servers对应 check_results.py 读取的/reports/servers/index.json。servers被测目标列表这里指向 compose 网络中的autobahn_client:9002agent 命名为AutobahnServer。cases/exclude-cases执行全部用例但排除9.*、11.*、12.*、13.*四组。其中9.*正是 README 所说的性能用例大数据量收发在 GitHub Actions 上容易超时其余编号段从 Autobahn 用例编号体系看主要涉及扩展协商相关场景如压缩扩展等V 当前阶段一并跳过。exclude-agent-cases按 agent 维度的额外排除规则此处为空。fuzzingserver 配置ws 与 wss 两个变体客户端测试方向由 Autobahn fuzzingserver 扮演服务端等待 V 客户端接入配置文件有两个变体。非 TLS 版本 fuzzing_server/config/fuzzingserver.json{ url: ws://127.0.0.1:9001, outdir: ./reports/clients, cases: [*], exclude-cases: [9.*, 11.*, 12.*, 13.*], exclude-agent-cases: {} }TLS 版本 fuzzing_server_wss/config/fuzzingserver.json{ url: wss://127.0.0.1:9002, outdir: ./reports/clients, key: /config/server.key, cert: /config/server.crt, cases: [*], exclude-cases: [9.*, 11.*, 12.*, 13.*], exclude-agent-cases: {} }两者的关键差异在于 TLS 版本增加了key与cert两个字段指向容器内/config下的server.key与server.crt。这套本地证书连同server.csr、server.pem存放在 fuzzing_server_wss/config并在 fuzzing_server_wss/Dockerfile 中被显式chmod rx以保证 TLS 握手时证书文件可读同时EXPOSE 9002声明对外端口。两个 fuzzingserver 容器的基础镜像与配置装配方式相同fuzzing_server/DockerfileFROM crossbario/autobahn-testsuite COPY check_results.py /check_results.py RUN chmod x /check_results.py COPY config /config结果校验check_results.py 如何判定通过/失败无论客户端还是服务端方向最终的报告索引都会被 check_results.py 解析并判定读取/reports/clients/index.json遍历v-clientagent 下的每个用例若behavior或behaviorClose任一为FAILED则累计错误读取/reports/servers/index.json对AutobahnServeragent 做同样的统计任一方向存在错误即打印FAILED AUTOBAHN TESTS, CLIENT ERRORS ... SERVER ERRORS ...并以退出码 1 结束全部通过则打印TEST SUCCESS!, CLIENT TESTS(...), SERVER TESTS (...)。这里能观察到报告中的两个 agent 命名约定客户端报告挂在v-client名下由agentv-client查询参数决定服务端报告挂在AutobahnServer名下由 fuzzingclient.json 的agent字段决定。该脚本同时覆盖两个方向意味着通过必须满足 V 客户端与服务端在 Autobahn 协议一致性上都达标。本地运行完整步骤按 README 的指引完整复现这套测试的步骤如下启动 Autobahn 容器在 autobahn 测试目录执行docker compose up拉起autobahn_server、autobahn_server_wss与autobahn_client三个容器其中 Autobahn 服务端分别监听 9001ws与 9002wss报告页面分别映射到宿主 8080 与 8081。编译并运行 V 客户端在local_run文件夹下编译运行 autobahn_client.v 进行非 TLS 客户端测试编译运行 autobahn_client_wss.v 进行 TLSwss测试。两个客户端会依次对 Autobahn 服务端发起 1~303 号用例连接逐条回显消息。查看测试结果打开http://localhost:8080浏览非 TLS 客户端测试报告若运行了 wss 测试则访问https://localhost:8081——因为使用本地自签证书浏览器会提示信任错误直接接受即可。README 同时注明服务端server方向测试的说明目前仍标记为待补充Todo: add information here但其实际实现已就绪docker compose up后容器网络内的 V 服务端autobahn_client:9002会自动接受 fuzzingclient 的用例冲刷服务端报告随后由check_results.py汇总判定。与 CI 构建的衔接README 开头即点明这套测试是构建时的自动测试其与 CI 的衔接体现在两个细节上local_run/Dockerfile 的注释说明了它的用途作为nektos/actGitHub Actions 的本地运行器的构建镜像使用把fuzzingserver.json预置进/config并安装 docker 客户端从而让 Autobahn 测试能在本地模拟 GitHub Actions 环境执行。配置文件统一排除了9.*性能用例与 README 中性能测试因 GitHub Actions 超时而跳过的说明一致——即 CI 环境下只保留协议一致性用例把耗时的大数据量性能冲刷排除在外避免流水线超时。小结V 的 Autobahn 测试套件是一套双服务端 单被测端的 docker-compose 拓扑Autobahn fuzzingserver 在 ws/wss 两个端口等待 V 客户端接入Autobahn fuzzingclient 反向 fuzz 容器内的 V 服务端V 侧用统一的原样回显消息处理器应对全部 1~303 号用例最终由check_results.py汇总v-client与AutobahnServer两方报告判定整体通过与否。理解这套结构后你既可以在本地用docker compose up加两个 V 客户端文件完整复现测试也可以为其他 WebSocket 实现搭建同构的 Autobahn 一致性验证环境。【免费下载链接】vSimple, fast, safe, compiled language for developing maintainable software. Compiles itself in 1s with zero library dependencies. Supports automatic C V translation. https://vlang.io项目地址: https://gitcode.com/GitHub_Trending/v/v创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考