Bob Belderbos:使用 Playwright 对每... 笔记

Bob Belderbos:使用 Playwright 对每个 Rust 练习进行端到端测试”

Rust 平台拥有大量练习,每个练习都需要用户加载编辑器、编写代码,并通过 Rust 后端进行验证。该流程需要端到端测试,以确保更新不会破坏现有功能。手动测试效率低下,且无法覆盖从登录到接收反馈的完整用户流程。虽然 Django 应用和 Rust 验证器已存在单元测试,但它们并未测试练习的集成体验。Playwright 结合 pytest 为此类端到端测试提供了一种简洁的解决方案。单个 Python 测试函数通过从数据库获取所有公开练习及其解决方案进行参数化。每个参数化测试导航至一个练习,将正确解注入编辑器,并验证提交结果。测试断言接收到的反馈表明练习已成功完成。pytest 中的会话作用域 fixture 被用于优化性能,确保浏览器启动和登录操作在所有测试中仅执行一次。Playwright 测试的一个关键方面是处理元素时序,特别是针对 CodeMirror 编辑器,需使用显式等待以确保元素可见且其 JavaScript 实例已初始化。为避免 Django 异步上下文陷阱,在创建测试用户时实现了一个变通方案:使用一个独立的 fixture,该 fixture 在 Playwright fixture 之前运行,并借助 django_db_blocker。端到端测试设计为针对真实数据库和实际的 Rust 验证器运行,从而确保集成测试的真实性。这些测试在主要推送前在本地执行,而 CI 环境主要运行速度更快的单元测试。这种方法可自动测试新添加的练习,无需编写新的测试代码,且任何前端修改都将在此集成回归测试套件中得到验证。相较于 Selenium,Playwright 因其现代化且符合人体工学的界面而更受青睐,而元素时序问题则是一个可管理的挑战。