单元测试你的学习成果💡
kotlin-koans-edu
Kotlin 库游乐场
由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!
下次当你需要学习一门编程语言,或者某个生态系统中的一组库时,不妨将你的学习置于单元测试之下。它有7个惊人的优势。
我的故事
我曾三次通过单元测试来学习编程知识。
这个想法的最初灵感来源于 Kotlin Koans,这是一种被广泛认可的 Java 开发人员学习 Kotlin 的方法,即通过运行失败的测试并逐一修复它们。
Kotlin Koans 教育插件和 play.kotl.in

kotlin-koans-edu
Kotlin Koans 是一系列练习,旨在帮助你熟悉 Kotlin 语法。每个练习都以失败的单元测试形式呈现,你的任务是使其通过。你可以通过以下方式之一来使用 Kotlin Koans:
如果您想完成任务,则无需使用此项目。请安装教学插件或在线完成。此项目包含任务内容,因此如果您想对现有任务或新任务进行任何更改,请提交新的拉取请求。
后来我意识到,虽然我已经掌握了这门语言,但它背后却有一个庞大的 Java 和 Kotlin 库生态系统,而我却没有系统地学习它们。我最初对库的理解还很混乱,结果在公司的主要项目中——以及那些编译时间只有 3 分钟的项目里——都出了问题,这根本算不上系统化的方法!
我记得当初学习 Kotlin Koans 的经历,并希望也能有类似的项目。这个kotlin-libraries-playgound项目就源于这个简单的想法,并不断发展壮大。如今,它包含了 [Apollo、CliKt、Kodein DI、Kodein DB、Exposed、Fuel、Hoplite、Klaxon、Konad、Konf、Kotlin Collections、Kotlin Faker、Kotlin IO、Kotlinpoet、Kotlin Statistics、Kotlinx Serialization、Ktor Client、Mordant、Moshi、OkHttp、OkIO、Picnic、Retrofit、Skrapeit、SqlDelight、Statemachine、](https://github.com/LouisCAD/kotlin-libraries-playground/tree/main/kotlin-jvm/src/main/kotlin/playground)、KoTest、Mockk、Spek、Strikt、Mockito、Junit-Jupiter 等的示例。
这是一个用于更广泛、更深入地了解 Kotlin 生态系统中各种库的实践平台。同时也是 Gradle refreshVersions 的官方示例。
Kotlin 库游乐场
一个可以更广泛、更深入地了解 Kotlin 生态系统中各种库的平台
此外,还有Gradle refreshVersions的官方示例。

用法
运行所有样本
$ ./gradlew :kotlin-jvm:run
运行所有测试
$ ./gradlew :kotlin-testing:test
名为 FailingXXX 的测试预期会失败

❤️ 欢迎投稿!#hacktoberfest
我们希望收集 Kotlin 库的使用示例,越多越好!
非常欢迎您贡献自己的库示例。
==> CONTRIBUTING.md
🤔你是如何跟上所有新事物的?
有很多优秀的资源可以用来学习 Kotlin。
但是,即使你掌握了这门语言,也并不意味着你就完成了学业。
现在你面临着另一项挑战性的任务:熟悉它的图书馆生态系统。
随着时间的推移,你希望两者都能获得:
- 更广泛地了解生态系统中有哪些优秀的库可供使用
- 对某些特定库的深入了解……
但正是我的第三次尝试才真正让我牢记了这种做法。
这次,我需要学习一门新的编程语言及其庞大的生态系统:TypeScript 和 Node.js。我依然选择通过编写单元测试来学习。我的项目在这里:
这次经历再次让我感到非常愉快,我会试着解释一下原因。
一切始于一个简单的思维转变。
不要记录,验证
当你阅读编程语言或库的文档时,通常会读到一段代码,该代码接收一些输入并对其进行转换,然后将其打印到控制台。
如果你和我一样,光看书是不够的。教程或许解释得很清楚,但只有你自己才能真正理解,而这通常需要你亲自动手实践代码。
现在的问题console.log()是,直接使用这种方法,结果一旦记录下来就消失了,因为你马上就要去做下一件事了。而如果你把它写成单元测试,你就能得到一段可以反复执行的自验证代码。
所以不要留在这里:
console.log(formatted)
// May 21st 2021, 3:20:04 pm
改用这种方法:
it('format dates', function () {
const moment = moment('2021-05-21 15:20:04')
const formatted = moment.format('MMMM Do YYYY, h:mm:ss a')
expect(formatted).to.equal("May 21st 2021, 3:20:04 pm")
});
开始结对编程课程
我的 node-playground 代码库是通过与朋友结对编程而创建的。
我强烈推荐这个,因为它解答了很多疑问:
- 你能帮我解读一下这个 package.json 文件吗?我需要了解哪些信息?
- 如何添加库及其类型?
- 如何添加和配置 TypeScript?
- 我不明白导入功能是如何运作的,你能解释一下吗?
- 如何设置测试运行器?(mocha)
- 能否将测试设置为监视模式?(可以)
- 您推荐使用哪个断言库?(chai)
- 我们能一起为 Moment.js 这个库编写一个简单的单元测试吗?
刚开始使用时,配置可能会比较麻烦,所以请向真人寻求帮助!
获得在集成开发环境(IDE)中编写代码的实践经验。
有些学习网站自带嵌入式文本编辑器。
虽然这种方法有其优势(零配置),但最终你还是要培养在自己选择的集成开发环境(IDE)中编写代码的技能——比如我用的 Visual Studio Code 或 Webstorm。使用这种方法可以让你获得大量的练习机会。
快速反馈
这种方法的一大优点是能够快速获得反馈。
这种练习方式固有的快速反馈循环有助于你进入米哈里·契克森米哈赖定义的“心流”状态:
在积极心理学中,心流状态(也俗称“进入状态 ”)是指一个人在进行某项活动时,完全沉浸其中,充满活力、全情投入,并享受活动过程的一种心理状态。本质上,心流的特征是完全专注于自己正在做的事情,并由此改变对时间的感知。
https://en.wikipedia.org/wiki/Flow_(psychology)
你稳步前进,一步一步地进行测试,像一块石头一样一块石头地往回走。
从第一天开始进行模拟测试
初级程序员(令人遗憾的是,甚至一些资深程序员也存在这种情况)普遍存在的一个信誉问题在于,他们缺乏测试经验。“掌握”测试是迈向专业化的重要标志。
但测试很难吗?
我认为里奇·希基的观点——“简单并不等于容易” ——非常重要。测试一旦掌握了方法,就是一种简单的实践,但它并不容易,因为初级程序员在这方面经验不足,甚至完全没有经验。
但是,如果你从第一天就开始练习测试,那么当你正式入职那天,肯定不会觉得那么难了!
导师可以轻松地审阅你的作品。
将学习成果存放在 GitHub 代码库中的另一个好处是,导师可以轻松地审阅你的工作。你可以将他们添加为项目协作者,并询问他们会如何修改你的代码库。然后,你们可以一起查看差异,这是开启关于下一步学习方向的讨论的绝佳方式。
保持知识更新
这一点尤其适用于像 kotlin-libraries-playground 项目这样的库的单元测试。由于代码具有自验证功能,您可以更新依赖项,查看哪些部分发生了变化以及哪些部分出现了问题。没错,这确实需要花费一些时间,但这是值得的。它可以让您不断更新已验证的知识。
请使用代码仓库提交错误报告
Kotlin 库的 Playground 对我来说也非常有效,可以用来报告 bug。当我遇到外部依赖项问题时,我会创建一个新分支,并添加能够重现问题的最小代码量。提供重现步骤有助于维护者更快地提供修复方案。
求职面试中所需的知识证明
这可是个大问题。你肯定遇到过这种老套的困境:你想用某种编程语言找到第一份编程工作,但却因为缺乏相关经验而被拒之门外。
摆脱这种困境的办法就是证明你已经掌握了足够的相关知识。当然,建立一个公开的知识库来展示你的知识是很好的方法。
结论
编写单元测试来检验你正在学习的内容,能带来极佳的开发体验,类似于专业开发人员的工作方式。随着时间的推移,它会成为一个公开的知识库,记录你经过验证的知识,并保持更新,这对于获取反馈、报告错误或在求职面试中展示你的技能都非常有用。
这与编写和发布实际项目这条重要建议不谋而合。发布一个新项目就像组装一个新拼图。编写单元测试的目的就在于更好地理解拼图中每一块的作用。
如果您想联系我,请阅读我的长期邀请函:https://jmfayard.dev/contact/
文章来源:https://dev.to/jmfayard/unit-test-your-knowledge-13j