了解如何在 Exercism 上测试你的 YAMLScript 练习
测试用 YAMLScript 编写的 Exercism 练习解答极其简单。运行简单,理解也简单。
只需在练习目录中运行make test。
第一次运行make test时,所有测试都会失败,原因很简单:你还没有写任何代码来让这些测试通过。
正常的练习开发流程是先从make test开始,然后一次只专注于一个测试,写代码让那个测试通过。当所有测试都通过时,你就完成了!
额外的好处是,运行make test还会确保正确版本的ys YAMLScript 解释器(当前练习所要求的那个版本)安装在正确的位置(/path/to/exercism/yamlscript/.local/)。这意味着你甚至不必事先安装ys就能开始!
如果你正在做名为the-great-exercise的练习,那么exercism download --exercise=the-great-exercise --track=yamlscript会创建目录/path/to/exercism/yamlscript/the-great-exercise。
在这个目录中,测试文件名会是the-great-exercise-test.ys,解答程序文件名会是the-great-exercise.ys。此外还会有一个README.md文件,里面是练习的描述;以及一个HELP.md文件,在你卡住时提供一些有用的信息。
make会有两个文件:Makefile和GNUmakefile。这是为了(并非双关)确保你使用的是 GNU make 来运行测试,而不是系统上可能安装的其他make命令。GNUmakefile才是真正的那个,GNU make 总是优先使用它而不是Makefile。其他make命令会使用Makefile,它应该会报错,并提示你改用 GNU make!
YAMLScript 的测试当然是用 YAMLScript 写的!既然 YAMLScript 就是 YAML,而 YAML 就是数据,那么测试基本上就只是数据。
下面是一个简单测试文件的例子。它其实就是acronym练习中的前 3 个测试。:-)
#!/usr/bin/env ys-0
use ys::taptest: :all
load: 'acronym.ys'
test::
- name: Basic
code: abbreviate('Portable Network Graphics')
want: PNG
- name: Lowercase words
code: abbreviate('Ruby on Rails')
want: ROR
- name: Punctuation
code: abbreviate('First In, First Out')
want: FIFO
done: 3
第一行是 shebang 行,它告诉prove命令(由 Makefile 运行)使用 YAMLScript 的ys解释器来运行测试,而不是prove默认使用的perl。
第二行是一条use语句,它加载 YAMLScript 的ys::taptestTAP测试库。
注意:TAP 是测试脚本与测试框架之间一种简单的基于文本的接口,而
prove是在 Perl 中运行 TAP 测试的标准框架。由于 Perl 无处不在,使用 TAP 和prove最终成了许多语言(包括 YAMLScript)测试套件的绝佳选择。
use语句加载acronym.ys解答程序,这样这个测试文件才有东西可以测试。
我们的所有测试都放在test键下的一个 YAML 序列中。
最后一行done:是必需的,它告诉测试框架所有测试确实都已运行。那个数字(可选)是我们预期运行的测试数量。
每个测试(位于test键下)都是一个映射,包含以下键值对:
name::由prove -v打印的测试标签。code::要运行的 YAMLScript 代码。这段代码会调用我们正在编写的解答程序中的某个函数。what::对于预期会发生错误的测试,其值为error。对于普通测试,则没有这一对。want::测试的预期结果。这是一个 YAML 值,可能是字符串、数字、布尔值、序列或映射。如果what:是error,那么这个值就是预期的错误消息。SKIP::把它设为true即可跳过该测试。ONLY::把它设为true则只运行该测试。如果有多个ONLY:测试,它们都会被运行。这些应该就是你在 Exercism 的练习中用 YAMLScript 进行测试驱动开发所需要知道的全部内容了!
ys::taptest库还有其他功能,可以用来编写更复杂的测试,不过 Exercism 的测试已经为你写好了。想进一步了解ys::taptest库,请查看文档。