ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Test-First Ruby 实战指南:基于 curriculum 用 RSpec 测试驱动开启 Ruby 编程

Test-First Ruby 实战指南:基于 curriculum 用 RSpec 测试驱动开启 Ruby 编程 Test-First Ruby 实战指南基于 curriculum 用 RSpec 测试驱动开启 Ruby 编程【免费下载链接】curriculumThe open curriculum for learning web development项目地址: https://gitcode.com/GitHub_Trending/cu/curriculum本篇指南围绕 curriculum 开源课程中的 Ruby 实战项目展开在学完基础语法后通过克隆课程配套的learn_ruby练习仓库阅读一批预先写好的 RSpec 测试文件以让测试由红变绿的方式补全 Ruby 代码。读完本文你将掌握 Test-First测试先行的练习方法、RSpec 测试的运行与阅读技巧并独立完成00_hello到06_timer七个练习最后把成果推送至自己的 GitHub 仓库。从读 Ruby到写 Ruby为什么用测试来驱动学习课程在 ruby_project.md 中这样定位本项目你已经有大量机会阅读 Ruby、学习 Ruby现在是时候动手构建 Ruby 了。 这句话点出了本项目的核心价值——语法书读得再多也不如亲手写出能在真实测试环境下运行的代码。传统的练习方式是先写代码、再人工验证而本项目反其道而行先给你一批测试由你写出让测试通过的实现。这种方式与课程 自动化测试入门 中阐述的理念一脉相承——自动化测试让你从手动反复运行程序、肉眼找 bug的重复劳动中解放出来用秒级的运行反馈替代分钟级甚至周级的人工验证并在每次改动后立刻告诉你是否引入了回归regression。用测试驱动学语法还有一个独特的优势测试本身就是一份精确的需求说明书。课程文档明确说这个练习需要你大量地自己去摸索。没有非常详细的步骤说明只有一批你需要让它们通过的测试。你需要观察这些测试根据你收到的错误信息推断它们想要什么然后写出代码让它们通过。项目任务总览本项目的完整任务链如下与 ruby_project.md 中的 Assignment 部分一一对应进入课程指定的learn_ruby练习仓库位于 GitHub 的 TheOdinProject 组织下按照 README 中的安装说明完成环境准备按照 README 中Getting started with the exercises一节了解如何运行测试并让它们通过依次完成以下 7 个练习当所有测试全部通过时即视为完成将你的项目推送到自己的 GitHub 仓库。课程文档还特别提醒练习从易到难其中一些会相当有挑战性这正是刻意练习的设计——前几个练习帮你建立读测试、跑测试的信心后面几个则逼你真正理解字符串处理、对象与格式化输出等进阶主题。环境准备安装练习仓库与测试运行器虽然learn_ruby仓库本身不在当前 curriculum 仓库内但课程在 RSpec 入门课 中完整演示了一个基于 RSpec 的 Ruby 项目从零到可运行的标准流程这正是learn_ruby安装环节所依赖的技术底座创建项目目录并进入$ mkdir learn_ruby $ cd learn_ruby用 Bundler 管理依赖。Ruby 中通过 Gem 引入第三方库RSpec 就是这样一个用于编写和运行自动化测试的 Gem。在项目根目录创建Gemfile并声明依赖source https://rubygems.org gem rspec, 3.10安装依赖$ bundle install该命令会同时生成Gemfile.lock将 Gem 锁定到具体版本保证项目在任何机器上都使用一致的依赖。初始化 RSpec 结构learn_ruby仓库通常已自带这些文件此步骤可帮助你理解目录结构$ rspec --init create .rspec create spec/spec_helper.rb在 RSpec 的约定中测试文件统一放在spec/目录下并以_spec.rb结尾而待实现的源码通常放在lib/目录两者严格分离避免测试代码与业务代码混杂。验证环境在项目根目录运行$ rspec如果输出类似0 examples, 0 failures说明测试运行器已就绪。需要说明learn_ruby仓库 README 的具体安装命令以其自身为准上述步骤来自本课程 rspec_part_one_basics.md 的标准流程可作为理解安装环节的背景知识。核心工作流红 → 绿 → 重构整个项目围绕一个极其简洁的反馈循环运转这也是 Test-First 练习的精髓跑测试看到红色运行rspec你会看到一批失败failing的测试。此时不要沮丧——失败信息正是你的第一手线索。读失败信息推断需求RSpec 的失败输出会明确告诉你期望值与实际值的差异例如Failure/Error: expect(todo_list.name).to eq(My List (1 task)) expected: My List (1 task) got: My List (0 tasks) (compared using ) # ./spec/todo_list_spec.rb:16:in block (3 levels) in top (required)如课程文档所言你要做的正是根据错误信息推断测试想要什么。expected与got的对比通常已足以定位问题若信息不够输出末尾还会附带失败所在的行号方便你在较大的测试文件中精准定位。写实现看到绿色补全缺失的方法或逻辑再次运行rspec直到对应的测试从红色变为绿色。全部变绿即完成当前练习目录内所有测试通过后进入下一个练习。这套循环的本质是让需求与验证分离测试描述行为代码满足行为。当你从错误信息而非详细文档中反推出需求时对 Ruby 语义的理解会深刻得多——这正是文档强调的一开始可能不太顺手但一旦测试开始变绿感觉会非常棒。七个练习任务清单课程指定的练习按难度递进排列全部通过即完成项目。下表汇总了每个练习的名称与从练习名可以推断的主题方向序号练习目录主题方向从名称推断100_hello最基础的方法定义与字符串返回建立读测试 → 写方法的初步循环201_temperature数值运算涉及温度单位换算302_calculator多个数值方法的实现与边界条件如空数组求和403_simon_says字符串处理大小写、重复、单词切分与标题化504_pig_latin对字符串进行规则化变换Pig Latin 词法规则605_book_titles定义一个类Book在类中实现标题化逻辑706_timer定义一个Timer类涉及格式化输出关于06_timer课程文档的 Additional Resources 部分给出了一个关键提示该练习会用到 Ruby 的sprintf方法用于按指定格式生成字符串。这意味着最后一个练习不仅考验类设计还要求你掌握格式化输出的技巧——例如把秒数转换为HH:MM:SS这样的固定格式。前几个练习00_hello03_simon_says主要覆盖 Ruby 基础语法 与 方法定义 中的内容从05_book_titles开始则进入对象与类设计领域这正是后续 面向对象编程 课程的前置铺垫。读懂一个 RSpec 测试expect 与 matcher要让测试变绿首先得读懂测试在断言什么。课程 rspec_part_one_basics.md 以一个待办事项类为例完整演示了 RSpec 测试的语法结构理解它就能无障碍阅读learn_ruby中的任何测试文件# spec/todo_list_spec.rb require spec_helper require todo_list RSpec.describe TodoList do describe name do it returns the name with 0 tasks remaining do todo_list TodoList.new(My List) expect(todo_list.name).to eq(My List (0 tasks)) end end end一个 RSpec 测试由几个固定构件组成Example Groupdescribe用于组织测试最外层通常传入被测试的类名内层可用字符串描述具体方法或行为Exampleit单个测试用例其参数是一个描述性字符串例如returns the name with 0 tasks remainingExpectationexpect(...).to ...断言语句由两部分构成——expect(实际值).to与一个 matcher匹配器Matcher如eq用于校验实际值是否匹配期望值expect(actual).to eq(expected)是最常用的一对组合。除了eq本项目后续练习中还会频繁用到其他 matcher 形态Matcher用途示例eq校验值相等expect(x).to eq(42)be校验布尔结果expect(list.completed?).to be(true)include校验集合包含元素expect(tasks).to include(new task)not_to反向断言expect(tasks).not_to include(done)读懂这些断言后你只需要在lib/下实现相应的方法或类让expect中实际值的计算结果与期望值一致测试即转绿。完成标准与提交课程的完成标准非常明确当所有测试都通过时你就知道自己完成了也就是说判定依据不是代码写得像不像参考答案而是rspec的输出中不再有任何失败。全部通过后还有最后一步将你的项目推送到自己的 GitHub 仓库。这一步与本课程 Git 基础 中的操作衔接本质上是让你建立本地练习 → 远程备份/展示的版本管理习惯也为课程社区的学生解决方案汇总Student Solutions提供提交入口——课程鼓励学习者将自己的实现以 Pull Request 的形式提交到共享清单中供后来者参考。练习之外的延伸学习本项目虽以让测试通过为目标但其副产品远比通过本身重要自动化测试的思维方式你已经在练习中反复经历运行测试 → 看失败 → 修复 → 再运行的循环这正是 自动化测试 所强调的价值——用即时反馈代替人工反复验证为后续编写自己的测试打下感性基础RSpec 语法的第一手体验通过阅读测试文件你会自然熟悉describe、it、expect等核心 API这些语法在 RSpec 入门 和 RSpec 进阶 中会被系统讲解测试驱动开发TDD的伏笔本项目是先有测试、后写代码的被动版本后续 测试驱动开发 课程将教你主动地先写测试、用测试驱动设计届时你已具备读懂测试、运行测试的全部前置技能解决真实问题的韧性文档明确提醒练习需要大量自己摸索这种在模糊需求中通过错误信息逆向推理的能力正是真实开发中排错与调试的核心技能。需要注意的是archive目录下还保留着本项目的早期版本 project_ruby.md其任务内容与当前版本基本一致同为learn_ruby的七个练习可视为同一练习在不同课程阶段的迭代记录。当前 curriculum 的主课程体系中Ruby 基础练习已迁移到 ruby/basic_ruby 目录下与各语法章节配套而本项目的经典价值——用测试驱动的方式检验你对 Ruby 的掌握程度——始终未变。【免费下载链接】curriculumThe open curriculum for learning web development项目地址: https://gitcode.com/GitHub_Trending/cu/curriculum创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表