发布于 2026-01-06 1 阅读
0

单元测试你的学习成果💡 kotlin-koans-edu Kotlin Libraries Playground DEV's Worldwide Show and Tell Challenge Presented by Mux: Pitch Your Projects!

单元测试你的学习成果💡

kotlin-koans-edu

Kotlin 库游乐场

由 Mux 主办的 DEV 全球展示挑战赛:展示你的项目!

下次当你需要学习一门编程语言,或者某个生态系统中的一组库时,不妨将你的学习置于单元测试之下。它有7个惊人的优势。

我的故事

我曾三次通过单元测试来学习编程知识。

这个想法的最初灵感来源于 Kotlin Koans,这是一种被广泛认可的 Java 开发人员学习 Kotlin 的方法,即通过运行失败的测试并逐一修复它们。

GitHub 标志 Kotlin / kotlin-koans-edu

Kotlin Koans 教育插件和 play.kotl.in

JetBrains官方项目

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 等的示例。

GitHub 标志 LouisCAD / kotlin-libraries-playground

这是一个用于更广泛、更深入地了解 Kotlin 生态系统中各种库的实践平台。同时也是 Gradle refreshVersions 的官方示例。

Kotlin 库游乐场

一个可以更广泛、更深入地了解 Kotlin 生态系统中各种库的平台

此外,还有Gradle refreshVersions的官方示例。

用法

运行所有样本

$ ./gradlew :kotlin-jvm:run

运行所有测试

$ ./gradlew :kotlin-testing:test

名为 FailingXXX 的测试预期会失败

kotlin-libraries-playground_–_versions_properties__kotlin-libraries-playground__and_GitHub_Desktop

❤️ 欢迎投稿!#hacktoberfest

我们希望收集 Kotlin 库的使用示例,越多越好!

非常欢迎您贡献自己的库示例。

==> CONTRIBUTING.md

🤔你是如何跟上所有新事物的?

有很多优秀的资源可以用来学习 Kotlin

但是,即使你掌握了这门语言,也并不意味着你就完成了学业。

现在你面临着另一项挑战性的任务:熟悉它的图书馆生态系统。

随着时间的推移,你希望两者都能获得:

  • 广泛地了解生态系统中有哪些优秀的库可供使用
  • 对某些特定库的深入了解……

但正是我的第三次尝试才真正让我牢记了这种做法。

这次,我需要学习一门新的编程语言及其庞大的生态系统:TypeScript 和 Node.js。我依然选择通过编写单元测试来学习。我的项目在这里:


这次经历再次让我感到非常愉快,我会试着解释一下原因。

一切始于一个简单的思维转变。

不要记录,验证

当你阅读编程语言或库的文档时,通常会读到一段代码,该代码接收一些输入并对其进行转换,然后将其打印到控制台。

如果你和我一样,光看书是不够的。教程或许解释得很清楚,但只有你自己才能真正理解,而这通常需要你亲自动手实践代码。

现在的问题console.log()是,直接使用这种方法,结果一旦记录下来就消失了,因为你马上就要去做下一件事了。而如果你把它写成单元测试,你就能得到一段可以反复执行的自验证代码。

所以不要留在这里:


console.log(formatted)
// May 21st 2021, 3:20:04 pm
Enter fullscreen mode Exit fullscreen mode

改用这种方法:

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")
});
Enter fullscreen mode Exit fullscreen mode

开始结对编程课程

我的 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