如何在ClojureScript中编写Grafana K6测试?解决运行时依赖问题
在ClojureScript中使用shadow-cljs编写k6测试的依赖问题解决方案
问题原因
- k6的JS运行时基于Go的V8引擎,对ES模块支持有限,不支持动态
import()语法,这是使用shadow.esm/dynamic-import报错的根本原因。 - shadow-cljs默认会尝试解析所有
:require中的JS依赖,但k6工具集仅存在于k6运行时环境,本地编译阶段无法找到该依赖,因此静态引入会触发缺失报错。
解决方案
方案1:将k6标记为全局外部依赖
修改shadow-cljs.edn的构建配置,告诉shadow-cljsk6是运行时全局变量,编译时跳过依赖解析:
{:builds {:k6-test {:target :esm :output-dir "dist" :modules {:main {:entries [k6-test.core]}} :js-options {:resolve {"k6" {:target :global :global "k6"}}}}}}
之后即可正常通过:require引入并使用:
(ns k6-test.core (:require ["k6" :as k6] ["k6/http" :as http])) (defn -main [] (http/get "https://test-api.k6.io") (k6/sleep 1))
方案2:直接使用k6的全局API
k6的所有测试API在运行时都是全局可用的,无需引入模块,直接通过js/前缀调用即可:
(ns k6-test.core) (defn -main [] (js/http.get "https://test-api.k6.io") (js/sleep 1) (js/check (js/http.get "https://test-api.k6.io") (clj->js {:status-200 #(= (.-status %) 200)})))
方案3:切换到CommonJS编译目标
k6运行时完全支持CommonJS规范,将shadow-cljs的编译目标改为:commonjs,即可正常使用静态引入:
修改shadow-cljs.edn:
{:builds {:k6-test {:target :commonjs :output-dir "dist" :modules {:main {:entries [k6-test.core]}}}}}
引入并使用k6依赖:
(ns k6-test.core (:require ["k6" :as k6] ["k6/http" :as http])) (defn -main [] (http/get "https://test-api.k6.io") (k6/sleep 1))
补充说明
动态import()语法无法在k6运行时中使用,这是k6基于Go V8的运行时的固有特性,没有办法让import在该环境中被定义,因此只能通过上述静态处理方案解决依赖问题。
内容的提问来源于stack exchange,提问作者Pavel Gurkov
相关产品推荐
相关产品推荐

