添加练习题


本文将介绍如何添加一个新的实践练习。

选择练习

要查看还有哪些实践练习尚未实现,最简单的方法是打开轨道的构建页面(例如 https://exercism.org/tracks/csharp/build),然后查看“实践练习”部分。

Caution

构建页面上的数据每天更新一次。

生成练习骨架

在轨道的根目录下运行bin/add-practice-exercise脚本(源码),就能快速生成一个新实践练习的骨架:

bin/add-practice-exercise <exercise-slug>

此外,你还可以选择指定练习的难度(通过-d)和/或作者的 GitHub 用户名(通过-a):

bin/add-practice-exercise -d 3 -a foobar <exercise-slug>
Note

如果你正在维护的轨道仓库里没有这个文件,欢迎通过上面的源码链接把它复制到你的仓库中。

实现练习

骨架文件创建好之后,你需要做以下几件事:

  • 向测试文件添加测试
  • 添加示例实现
  • 定义桩文件的内容
  • 在练习的.meta/config.json文件中:
    • 把练习作者的 GitHub 用户名添加到authors键中
  • 在轨道的config.json文件中:
    • 检查/更新练习的难度
    • 把概念添加到practices键中(仅当轨道有概念练习时才需要)
    • 把概念添加到prerequisites键中(仅当轨道有概念练习时才需要)

添加测试

添加练习的关键一环就是添加测试。 大致来说,为实践练习添加测试时有两种选择:

  1. 从零开始实现测试,使用 problem-specifications 仓库中该练习的canonical-data.json文件里的测试用例。
  2. 从其他轨道的实现中移植测试(提示:访问https://exercism.org/exercises/<slug>可以查看有哪些轨道实现了某个具体的练习)。

第二种选择可能特别有吸引力,因为它能让你很快看到成果。 不过要记住,你应该调整实现,让它最适合你的轨道。 例如,有些轨道不使用类,只用函数。 但如果你的轨道通常使用对象,就应该把实现调整成最适合你轨道的形式。

Note

有些轨道使用测试生成器来自动(重新)生成练习的测试文件。 请查看轨道文档,确认是否有测试生成器,以及如果有的话该如何使用。

添加示例实现

为了确保能够写出通过测试的代码,需要添加一个示例实现。

Note

代码不一定要符合惯用写法,只要通过测试就行。

在轨道的根目录下运行bin/verify-exercises脚本(源码),就能验证示例实现是否能通过所有测试:

bin/verify-exercises <exercise-slug>

根据输出确认示例实现通过了所有测试。

Note

如果你正在维护的轨道仓库里没有这个文件,欢迎通过上面的源码链接把它复制到你的仓库中。

Advanced

在底层,bin/verify-exercises脚本会做几件事:

  • 把练习复制到一个临时目录
  • 用示例实现文件覆盖桩文件
  • 如果测试文件里有被跳过的测试,它们会被取消跳过
  • 运行测试

添加桩文件

桩实现文件为学生提供一个起点。

我们建议桩文件只包含最少的代码,做到:

  • 学生可以立即开始实现能通过测试的逻辑
  • 学生不会遇到“奇怪”的语法错误

实际操作中,这意味着要定义测试套件所测试的函数/方法。 各个轨道可以自行决定如何组织这些代码,只要保证桩代码一开始会让所有测试失败即可。

示例

Python:

def two_fer(name):
    pass

Kotlin:

fun twofer(name: String): String {
    TODO("Implement the function to complete the task")
}

运行 lint 检查

最后一步是运行检查器,检查轨道的(配置)文件结构是否正确,包括语法和语义两方面。

首先,运行下面的命令,确保你使用的是最新版本的configlet:

bin/fetch-configlet

接着运行下面的命令,启动检查器:

bin/configlet lint

根据输出确认一切正常。

提交 Pull Request

一切正常之后,就可以向轨道仓库提交 Pull Request了。

提交之前,请阅读贡献者 Pull Request 指南和 Pull Request 指南。

确保 PR 描述中列出了要添加的练习。