【催学社】前端的单元测试课
├── 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