news 2026/5/21 9:29:01

Wallaby实战:构建Todo应用的完整测试案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Wallaby实战:构建Todo应用的完整测试案例

Wallaby实战:构建Todo应用的完整测试案例

【免费下载链接】wallabyConcurrent browser tests for your Elixir web apps.项目地址: https://gitcode.com/gh_mirrors/wa/wallaby

Wallaby是一款专为Elixir Web应用打造的并发浏览器测试工具,能模拟真实用户交互,让开发者轻松构建可靠的端到端测试。通过Wallaby,你可以同时运行多个测试用例,自动管理浏览器会话,为Todo类应用提供高效的测试解决方案。

快速入门:Wallaby环境搭建

安装步骤

要开始使用Wallaby测试你的Todo应用,首先需要在mix.exs中添加依赖:

def deps do [ {:wallaby, "~> 0.30", runtime: false, only: :test} ] end

然后配置测试驱动,默认推荐使用Chrome:

# config/test.exs config :wallaby, driver: Wallaby.Chrome

确保在test_helper.exs中启动Wallaby:

{:ok, _} = Application.ensure_all_started(:wallaby) Application.put_env(:wallaby, :base_url, YourAppWeb.Endpoint.url)

必要依赖

安装Wallaby后,还需要确保系统中已安装:

  • Chrome浏览器
  • chromedriver(需与Chrome版本匹配)
  • Elixir 1.12+ 和 OTP 22+

编写第一个Todo测试用例

基础测试结构

使用Wallaby的Feature模块可以轻松创建测试场景。下面是一个完整的Todo创建测试示例:

defmodule MyApp.Features.TodoTest do use ExUnit.Case, async: true use Wallaby.Feature import Wallaby.Query, only: [css: 2, text_field: 1, button: 1] feature "用户可以创建新任务", %{session: session} do session |> visit("/todos") |> fill_in(text_field("New Todo"), with: "学习Wallaby测试") |> click(button("保存")) |> assert_has(css(".alert", text: "任务创建成功")) |> assert_has(css(".todo-list > .todo", text: "学习Wallaby测试")) end end

核心API解析

这个测试展示了Wallaby的几个核心功能:

  • visit/2- 导航到指定页面
  • fill_in/3- 在文本框中输入内容
  • click/2- 点击按钮
  • assert_has/2- 验证元素存在

Wallaby的查询系统会自动等待元素出现,有效避免了异步操作导致的测试不稳定问题。

高级测试技巧

多用户并发测试

Wallaby支持同时管理多个浏览器会话,非常适合测试多用户交互场景:

@page "/todos/collaborative" @task_field text_field("添加任务") @add_button button("添加") @sessions 2 feature "多用户实时协作", %{sessions: [user1, user2]} do user1 |> visit(@page) |> fill_in(@task_field, with: "共同完成项目") |> click(@add_button) user2 |> visit(@page) |> assert_has(css(".todo-item", text: "共同完成项目")) end

表单交互进阶

处理复杂表单时,可以使用作用域查找功能:

defmodule MyApp.Features.ComplexTodoTest do use ExUnit.Case, async: true use Wallaby.Feature import Wallaby.Query, only: [css: 1, text_field: 1, button: 1] @todo_form css(".todo-form") @title_field text_field("标题") @description_field text_field("描述") @due_date_field text_field("截止日期") @save_button button("保存任务") feature "创建带截止日期的任务", %{session: session} do session |> visit("/todos/new") |> find(@todo_form) |> fill_in(@title_field, with: "完成Wallaby教程") |> fill_in(@description_field, with: "学习高级测试技巧") |> fill_in(@due_date_field, with: "2023-12-31") |> click(@save_button) |> assert_has(css(".todo-item .title", text: "完成Wallaby教程")) |> assert_has(css(".todo-item .due-date", text: "2023-12-31")) end end

测试调试与优化

自动截图功能

开启失败自动截图可以极大提高调试效率:

# config/test.exs config :wallaby, screenshot_on_failure: true, screenshot_dir: "test/screenshots"

所有截图会保存在指定目录,文件名包含测试名称和时间戳,方便追踪问题。

处理异步操作

测试AJAX加载的内容时,Wallaby的等待机制会自动处理大多数情况。对于复杂场景,可以使用显式等待:

session |> click(button("加载更多任务")) |> assert_has(css(".todo-item", count: 10), timeout: 10000)

集成Phoenix应用

配置Phoenix测试环境

在Phoenix应用中使用Wallaby需要开启测试服务器:

# config/test.exs config :your_app, YourAppWeb.Endpoint, server: true

如果使用Ecto,建议配置沙箱模式实现并发测试:

# lib/your_app_web/endpoint.ex if sandbox = Application.compile_env(:your_app, :sandbox, false) do plug Phoenix.Ecto.SQL.Sandbox, sandbox: sandbox end

LiveView测试支持

对于Phoenix LiveView应用,需要添加沙箱钩子:

# test/support/hooks/allow_ecto_sandbox.ex defmodule YourApp.Hooks.AllowEctoSandbox do import Phoenix.LiveView def on_mount(:default, _params, _session, socket) do allow_ecto_sandbox(socket) {:cont, socket} end defp allow_ecto_sandbox(socket) do metadata = get_connect_info(socket, :user_agent) Phoenix.Ecto.SQL.Sandbox.allow(metadata, Application.get_env(:your_app, :sandbox)) end end

然后在路由中使用:

live_session :default, on_mount: YourApp.Hooks.AllowEctoSandbox do # ... 路由定义 end

总结与最佳实践

通过Wallaby,你可以为Todo应用构建可靠的端到端测试,确保用户交互流程的正确性。以下是一些最佳实践:

  1. 保持测试独立- 每个测试应该可以单独运行,不依赖其他测试的状态
  2. 使用有意义的选择器- 优先使用数据属性(如data-testid)而非样式类作为选择器
  3. 合理组织测试- 将相关测试放在同一个模块,使用setup回调共享测试数据
  4. 控制测试速度- 并发测试时注意控制会话数量,避免资源竞争

Wallaby的源码位于lib/wallaby/目录,包含了所有核心功能实现。更多详细API文档可以参考官方文档,通过这些工具和技巧,你可以构建出健壮的Todo应用测试套件,提升代码质量和用户体验。

要开始使用Wallaby,只需克隆仓库并按照文档配置:

git clone https://gitcode.com/gh_mirrors/wa/wallaby cd wallaby mix deps.get

立即开始使用Wallaby为你的Elixir Web应用构建可靠的浏览器测试吧!

【免费下载链接】wallabyConcurrent browser tests for your Elixir web apps.项目地址: https://gitcode.com/gh_mirrors/wa/wallaby

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 9:24:05

GD32F103 DAC输出不稳?排查DMA传输和定时器触发的5个常见坑点

GD32F103 DAC输出不稳?排查DMA传输和定时器触发的5个常见坑点 在嵌入式开发中,DAC(数字模拟转换器)的稳定输出对许多应用至关重要。然而,当使用GD32F103的DAC功能时,开发者常常会遇到输出波形不稳定、数据错…

作者头像 李华
网站建设 2026/5/21 9:17:32

STM32/5011AS一位共阴8段数码管

目录 1 5011AS数码管简介 2 5011AS数码管原理 3 设计思路 4 示例源码 1 5011AS数码管简介 数码管是能显示数字和其他信息的一种发光电子器件,每一位数码管分为七段和八段(含小数点DP);而每一段又可以看作是一个发光二极管。5…

作者头像 李华
网站建设 2026/5/21 9:16:29

CANN/Ascend C bfloat16x2比较函数

__hequx2 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/c…

作者头像 李华
网站建设 2026/5/21 9:15:27

告别/dev/ttyUSB0权限困扰:用udev规则和C++封装类优雅管理你的CH341设备

告别/dev/ttyUSB0权限困扰:用udev规则和C封装类优雅管理你的CH341设备 在嵌入式开发和工业控制领域,CH340/CH341系列USB转串口芯片因其稳定性和低成本而广受欢迎。然而,当开发者在Linux环境下同时连接多个设备时,常常会遇到设备节…

作者头像 李华