ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

如何为 Dapr 添加一个新的 E2E 测试:实现测试应用与测试驱动?

如何为 Dapr 添加一个新的 E2E 测试:实现测试应用与测试驱动? 如何为 Dapr 添加一个新的 E2E 测试实现测试应用与测试驱动【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr如果你需要在 Dapr 仓库中新增一个 E2E 测试例如验证某个 runtime 行为在真实 Kubernetes 集群上的表现根据 tests/docs/writing-e2e-test.md你要完成两个部分测试应用test app——一个监听 3000 端口、暴露/tests/{test}测试入口端点的简单 HTTP 服务随 Dapr sidecar 部署到集群测试驱动test driver——一个带e2ebuild tag 的 Go 测试负责把测试应用部署到集群并调用其端点执行断言。前提是你已经按照 tests/docs/running-e2e-test.md 搭好本地测试环境并且现有的 e2e 测试可以跑通。准备条件本地 E2E 测试环境writing-e2e-test.md的第一步就要求确认本地测试环境已就绪并能运行 e2e 测试。按 tests/docs/running-e2e-test.md 的 “Run E2E tests in local dev environment” 一节前置条件是已搭建 Dapr 开发环境安装 Helm v3有一个可用的 Docker 镜像仓库Docker Hub、Azure Container Registry、GitHub Container Registry 等设置环境变量以 minikube 为例export DAPR_REGISTRYdocker.io/your_dockerhub_id # 你的镜像仓库地址 export DAPR_TAGdev export DAPR_NAMESPACEdapr-tests export DAPR_MTLS_ENABLEDtrue # 非 minikube 环境不要设置 DAPR_TEST_ENV export DAPR_TEST_ENVminikube # minikube 控制面 IP替换为实际的 k8s master IP export MINIKUBE_NODE_IPyour_k8s_master_ip文档同时给出两条部署路径从零开始可用make e2e-build-deploy-run一次性完成构建、部署 Dapr 并运行全部 e2e 测试或者按 “Option 2: Step by step guide” 分步执行make create-test-namespace、make setup-helm-init、make setup-test-env-redis、make setup-test-env-postgres不需要 bindings 的测试可跳过make setup-test-env-kafka、make build-linux、make docker-build、make docker-push、make docker-deploy-k8s、make setup-test-components。注意该文档提醒卸载 Dapr 组件必须先helm uninstall dapr dapr-kafka dapr-redis dapr-postgres -n $DAPR_NAMESPACE再删除测试 namespace否则 sidecar injector 可能因证书问题失效。下文假设环境已就绪直接进入新增测试的操作路径。第一步在 tests/apps 下实现测试应用测试应用放在 tests/apps/ 目录可以被多个测试驱动共享。文档说明测试应用理论上可以用任意语言编写但推荐用 Go 以保持一致和简单并明确把 tests/apps/hellodapr/ 作为样板代码。操作如下在tests/apps/下创建新目录下文用newtest指代命令中请替换为你的目录名从tests/apps/hellodapr/复制app.go、Dockerfile、service.yaml三个文件app.go一个用 Go 写的简单 HTTP 服务Dockerfile测试应用的镜像构建文件service.yaml供 kubectl 手工部署测试用的 YAML文档特别注明它只用于开发阶段实际 e2e 测试并不使用它修改app.go实现你的测试逻辑本地运行该 Go 应用验证app.go中的 HTTP 端点。以样板 tests/apps/hellodapr/app.go 为例它的结构是用gorilla/mux定义路由/的 GET 由indexHandler返回OK/tests/{test}的 POST 由testHandler处理——从路径变量取出testCommand在switch中分发到具体测试函数如blue、green、envTest不支持的命令返回 400 和 “not supported” 消息。服务默认监听 3000 端口可通过PORT环境变量覆盖。你的测试应用照这个模式增加自己的/tests/{命令}分支即可。tests/apps/hellodapr/service.yaml 展示了部署清单的形态一个LoadBalancer类型的 Service80 端口转发到容器 3000 端口加一个 DeploymentDeployment 的 pod 模板带有dapr.io/enabled: true、dapr.io/app-id、dapr.io/app-port: 3000三个注解用于 sidecar 注入镜像为dapriotest/e2e-hellodapr。你复制后需要修改 metadata 和你自己的 registry/镜像名。第二步构建并推送测试应用镜像要让你的应用能被镜像构建流程识别先把目录名加入 tests/dapr_tests.mk 中的E2E_TEST_APPS变量该变量当前已列出hellodapr、stateapp、pubsub-publisher等应用名E2E_TEST_APPSactorjava \ ... hellodapr \ ... newtest \然后构建并推送镜像DAPR_TEST_REGISTRY和DAPR_TEST_TAG必须已配置make build-e2e-app-*目标依赖check-e2e-env检查缺失会直接报错在 tests/dapr_tests.mk 中DAPR_TEST_REGISTRY未设置时默认继承DAPR_REGISTRYDAPR_TEST_TAG未设置时默认为$(DAPR_TAG)-$(TARGET_OS)-$(TARGET_ARCH)make build-e2e-app-newtest make push-e2e-app-newtest测试应用在AppDescription中的镜像名约定为e2e-[test app name]见writing-e2e-test.md中对ImageName的注释。可选的手工验证分支service.yaml就是为这个目的准备的。改好其中的 metadata 与镜像名后把它部署到你自己的测试集群kubectl apply -f service.yaml kubectl get svc # 获取外部 IP然后按writing-e2e-test.md的说明用 wget/curl/postman 验证应用的外部端点。验证完成后清理kubectl delete -f service.yaml第三步在 tests/e2e 下实现测试驱动测试驱动是tests/e2e/下带e2ebuild tag 的普通 Go 测试。仓库提供了测试运行框架tests/runner/testrunner.go来管理测试应用的生命周期TestRunner.Start会先执行Platform.Setup()再按顺序添加 secrets、components、init apps、test apps然后运行Test*方法并在结束时 defer 执行TearDown()清理资源——所以测试驱动不需要自己管理应用的部署与回收。writing-e2e-test.md对测试驱动的要求在tests/e2e/下创建新目录与第二步的 runner id 对应// build e2e必须放在测试代码的第一行TestMain(m *testing.M)中定义测试应用列表和组件供各TestXxx(t *testing.T)使用为测试定义独立的 package遵循 Go 测试最佳实践。参照真实的 tests/e2e/hellodapr/hellodapr_test.go一个完整的驱动骨架如下newtest与包名newtest_e2e替换为你自己的目录名e2e-newtest是你的应用镜像名//go:build e2e // build e2e package newtest_e2e import ( encoding/json fmt os testing github.com/dapr/dapr/tests/e2e/utils kube github.com/dapr/dapr/tests/platforms/kubernetes github.com/dapr/dapr/tests/runner github.com/stretchr/testify/require ) type testCommandRequest struct { Message string json:message,omitempty } type appResponse struct { Message string json:message,omitempty StartTime int json:start_time,omitempty EndTime int json:end_time,omitempty } const numHealthChecks 60 // Number of times to check for endpoint health per app. var tr *runner.TestRunner func TestMain(m *testing.M) { utils.SetupLogs(newtest) utils.InitHTTPClient(true) testApps : []kube.AppDescription{ { AppName: newtest, // app name DaprEnabled: true, // dapr sidecar injection ImageName: e2e-newtest, // docker image name e2e-[test app name] Replicas: 1, // number of replicas IngressEnabled: true, // enable ingress endpoint MetricsEnabled: true, // enable metrics endpoint }, } tr runner.NewTestRunner(newtest, testApps, nil, nil) os.Exit(tr.Start(m)) } func TestNewTest(t *testing.T) { // 获取应用的 ingress 外部地址 externalURL : tr.Platform.AcquireAppExternalURL(newtest) require.NotEmpty(t, externalURL, external URL must not be empty) // 先确认应用端点可用 _, err : utils.HTTPGetNTimes(externalURL, numHealthChecks) require.NoError(t, err) // 触发测试 body, err : json.Marshal(testCommandRequest{Message: hello}) require.NoError(t, err) resp, err : utils.HTTPPost(fmt.Sprintf(%s/tests/blue, externalURL), body) require.NoError(t, err) var appResp appResponse require.NoError(t, json.Unmarshal(resp, appResp)) require.Equal(t, Hello blue dapr!, appResp.Message) }其中runner.NewTestRunner(id, apps, comps, initApps)的四个参数分别是 runner id、测试应用列表、component 列表和初始化应用列表hellodapr示例中 component 与 initApps 均传nil如果需要自己的组件或部署前先初始化组件的应用可分别通过ComponentDescription和 initApps 传入参见 tests/runner/testrunner.go 中TestRunner结构体的注释init apps 先于主测试应用部署可用于初始化组件等准备工作。hellodapr示例还演示了tr.Platform.Scale(hellobluedapr, 3)扩缩容和tr.Platform.Restart(...)重启 pod 等平台操作PlatformInterface支持的完整方法列表见 tests/runner/testrunner.go。writing-e2e-test.md中有一条必须遵守的约束测试应用名对你的驱动必须是唯一的。自动化 E2E 运行器可能同时跑多个驱动应用名不唯一会与其他测试应用冲突同理所有有状态的资源pubsub topic、state store、secrets 等命名也要和你的驱动唯一对应。第四步运行与调试新测试writing-e2e-test.md给出的调试与验证路径如果开发环境是 minikube把DAPR_TEST_MINIKUBE_IP环境变量设置为minikube ip输出的地址调试单个 Go 测试两种方式用 dlv test例如调试TestHelloDaprdlv test --build-flags-tagse2e ./tests/e2e/... -- -test.run ^TestHelloDapr$用 VSCode Go 插件文档推荐但该方式无法传 build tag因此调试期间需要临时移除测试文件中的// build e2e构建约束运行全部 e2e 测试make test-e2e-all只想验证自己新增的驱动时不必跑全量tests/docs/running-e2e-test.md 说明可以设置DAPR_E2E_TEST环境变量为tests/e2e目录下的测试文件夹名空格分隔可填多个来只跑子集例如DAPR_E2E_TESTnewtest make test-e2e-all判定标准与现有测试一致TestMain完成部署后Test*方法通过AcquireAppExternalURL拿到应用外部地址先做健康检查utils.HTTPGetNTimes再 POST 到/tests/{命令}端点并断言响应内容require.Equal对比测试应用返回的message断言失败或部署阶段Platform.AddApps失败都会使测试失败TestRunner在退出前自动执行TearDown清理部署的应用。限制与注意事项service.yaml只服务于开发阶段的 kubectl 手工部署验证实际 e2e 测试由测试驱动通过 runner 框架部署应用不走这个文件make build-e2e-app-*/make push-e2e-app-*依赖DAPR_TEST_REGISTRY与DAPR_TEST_TAGtests/dapr_tests.mk 中的check-e2e-env会强制检查未配置时 make 直接报错应用名与有状态资源名必须对驱动唯一避免与并行运行的其他 e2e 驱动冲突VSCode 调试路径要求临时移除e2ebuild tag调试结束记得恢复文档还说明 runner 框架后续计划增加如测试应用 pod 日志收集等能力当前版本尚不具备。完成上述步骤后新测试应用会出现在tests/apps/newtest/、新驱动出现在tests/e2e/newtest/加入E2E_TEST_APPS后即可通过DAPR_E2E_TESTnewtest make test-e2e-all单独验证之后随make test-e2e-all纳入全量 E2E 套件。【免费下载链接】daprDapr is a portable runtime for building distributed applications across cloud and edge, combining event-driven architecture with workflow orchestration.项目地址: https://gitcode.com/GitHub_Trending/da/dapr创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表