【催学社】前端的单元测试课

2025-09-29 杂货铺 5

├── 1.视频

│ ├── 001.01-为什么写测试-更高阶的调试手法-提高开发效率.mp4

│ ├── 002.02-单元测试在修改代码时的好处.mp4

│ ├── 003.03-写测试的好处-活文档&改善程序设计.mp4

│ ├── 004.04-自动化思维-功能验证.mp4

│ ├── 005.05-自动化思维-定位&修复bug.mp4

│ ├── 006.06-单元级别的功能测试.mp4

│ ├── 007.07-写测试的顺序-后补测试.mp4.mp4

│ ├── 008.08-写测试的顺序-通过单元测试替换手动验证.mp4

│ ├── 009.09-写测试的顺序-先写测试后实现 TDD.mp4

│ ├── 010.10-不写测试的原因.mp4

│ ├── 011.11-编写第一个单元测试.mp4

│ ├── 012.12-掌握 Vitest 的基础 API.mp4.mp4

│ ├── 013.13-掌握 Vitest 的调试技巧.mp4.mp4

│ ├── 014.14-实现 mini-test-runner.mp4.mp4

│ ├── 015.15-对比 Vitest 和 Jest 之间的差异.mp4

│ ├── 016.16-准备测试数据的三种方式.mp4

│ ├── 017.17-后门操作准备数据的方式.mp4.mp4

│ ├── 018.18-最小准备测试数据原则.mp4

│ ├── 019.19-程序的间接输入-依赖函数调用-stub 的应用.mp4

│ ├── 020.20-程序的间接输入-第三方库&对象&class&常量.mp4.mp4

│ ├── 021.21-程序的间接输入-环境变量-全局global-间接层处理技巧.mp4

│ ├── 022.22-程序的间接输入-依赖注入.mp4.mp4

│ ├── 023.23-状态验证.mp4

│ ├── 024.24-行为验证.mp4.mp4

│ ├── 025.25-不知道验证什么-完美主义&功能的目的&小步走.mp4.mp4

│ ├── 026.26-可预测性-随机数-日期date.mp4

│ ├── 027.27-快速反馈-处理异步代码time—promise.mp4

│ ├── 028.28-API 的多种测试方案.mp4

│ ├── 029.29-参数化验证.mp4

│ ├── 030.30-手动测试到单元测试的认知转变.mp4

│ ├── 031.31-测试的基本策略-正向测试&反向测试&异常测试.mp4

│ ├── 032.32-不是所有代码都值得写测试.mp4

│ ├── 033.33-掌握使用 test double 测试替身的核心思想.mp4

│ ├── 034.34-测试替身的类型-dummy-stub-spy-mock-fake.mp4

│ ├── 035.35-独居测试和群居测试.mp4

│ ├── 036.36-测试的拆卸.mp4

│ ├── 037.37-Vitest 模拟浏览器环境&自定义环境.mp4

│ ├── 038.38-给测试命名的艺术.mp4

│ ├── 039.39-调用同一模块内的函数会 mock 失败.mp4

│ ├── 040.40-snapshot 快照测试.mp4

│ ├── 041.Vue实战-01-项目概述.mp4

│ ├── 042.Vue实战-1.1-登录注册功能介绍.mp4

│ ├── 043.Vue实战-02-启动项目的方式.mp4

│ ├── 044.Vue实战-03-第一个组件 TheHeader-测试 useRouter 的策略.mp4

│ ├── 045.Vue实战-04-测试 useRouter 的最佳策略.mp4

│ ├── 046.Vue实战-05-重构测试 useRouter 的代码 提炼公共 helper 函数.mp4

│ ├── 047.Vue实战-06-测试 window.open 的方式&重构整理 theHeader.mp4

│ ├── 048.Vue实战-07-第二个功能 command 搜索功能的介绍和代码实现.mp4

│ ├── 049.Vue实战-08-测试 commandModal&键盘事件.mp4

│ └── 050.Vue实战-09-测试 search&timer&promise&独居测试.mp4

└── 2.资料

├── front-end-testing-main

│ ├── docs

│ │ ├── .vitepress

│ │ │ ├── cache

│ │ │ │ └── deps

│ │ │ ├── theme

│ │ │ │ ├── index.js

│ │ │ │ └── MyLayout.vue

│ │ │ └── config.js

│ │ ├── components

│ │ │ └── CVideo.vue

│ │ ├── guide

│ │ │ ├── 00-introduction.md

│ │ │ ├── 01-why-write-testing.md

│ │ │ ├── 02-automatic-thinking.md

│ │ │ ├── 03-unit-test-definition.md

│ │ │ ├── 04-when-writing-tests.md

│ │ │ ├── 05-why-not-write-tests.md

│ │ │ ├── 06-write-first-unit-test.md

│ │ │ ├── 07-vitest-test-api.md

│ │ │ ├── 08-vitest-debug.md

│ │ │ ├── 09-vitest-vs-jest.md

│ │ │ ├── 10-mini-test-runner.md

│ │ │ ├── 11-to-prepare-data.md

│ │ │ ├── 12-where-put-test-data.md

│ │ │ ├── 13-input-and-output.md

│ │ │ ├── 14-verify-way.md

│ │ │ ├── 15-verify-what.md

│ │ │ ├── 16-test-double.md

│ │ │ ├── 17-test-double-types.md

│ │ │ ├── 18-setup-test-double.md

│ │ │ ├── 19-layer-test.md

│ │ │ ├── 20-parameterized-test.md

│ │ │ ├── 21-test-asynchronous.md

│ │ │ ├── 22-test-api.md

│ │ │ ├── 23-test-third-party-library.md

│ │ │ ├── 24-test-date.md

│ │ │ ├── 25-tear-down.md

│ │ │ ├── 26-test-only-one-focus.md

│ │ │ ├── 27-avoid-condition-test-logic.md

│ │ │ ├── 28-keeping-test-independent.md

│ │ │ ├── 29-easy-and-read.md

│ │ │ ├── 30-testable-design.md

│ │ │ ├── 31-use-the-front-door-first.md

│ │ │ ├── 32-isolation-SUT.md

│ │ │ ├── 33-low-levels-of-assertions.md

│ │ │ ├── 34-transition-assertion.md

│ │ │ ├── 35-magic-string.md

│ │ │ ├── 36-overprotective.md

│ │ │ ├── 37-lengthy-installation.md

│ │ │ ├── 38-schizobulia.md

│ │ │ ├── 39-logical-division.md

│ │ │ ├── 40-immaterial-details.md

│ │ │ ├── 41-repetition.md

│ │ │ ├── 42-the-fragile-test.md

│ │ │ ├── 43-the-lack-of-cohesion.md

│ │ │ ├── 44-comment-out-the-test.md

│ │ │ ├── 45-ambiguity-annotation.md

│ │ │ ├── 46-never-failed-test.md

│ │ │ ├── 47-the-test-of-lying.md

│ │ │ ├── 48-too-loose.md

│ │ │ └── 49-assertions-roller.md

│ │ ├── public

│ │ │ ├── favicon.ico

│ │ │ └── logo.png

│ │ └── index.md

│ ├── .gitignore

│ ├── package.json

│ ├── pnpm-lock.yaml

│ └── yarn.lock

└── 大纲+代码.txt

【催学社】前端的单元测试课下载链接

https://pan.quark.cn/s/0c9820f2b5f9