YAMLScript 轨道上的测试

了解如何在 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库,请查看文档。