如何测试语法高亮工具?

时间:2017-08-01 23:43:30

标签: regex continuous-integration pygments textmatebundles

pygmentstextmate bundle等语法突出显示工具如何进行自动化测试?

1 个答案:

答案 0 :(得分:1)

像这样的工具通常只是求助于大量代表所选输入和预期输出的文本片段。例如,如果您查看 Pygments Github,您可以看到它们有大量文本文件,分为 input 部分和 tokens 部分,如下所示:

---input---
f'{"quoted string"}'

---tokens---
'f'           Literal.String.Affix
"'"           Literal.String.Single
'{'           Literal.String.Interpol
'"'           Literal.String.Double
'quoted string' Literal.String.Double
'"'           Literal.String.Double
'}'           Literal.String.Interpol
"'"           Literal.String.Single
'\n'          Text

由于高亮工具读取一段代码,然后必须识别哪些文本位是哪些位代码的一部分(这是函数的开始?这是注释吗?它是变量名吗?),他们通常执行各种处理步骤,这些步骤将产生上述标记列表,然后他们可以将其输入到下一步(从第一个 Literal.String.Interpol 到下一个插入突出显示,将任何 Literal.String.Single 加粗,等等. 通过生成适当的 HTML 或 CSS 或其他与系统相关的标记)。检查这些标记是否从输入文本正确生成是关键。

然后,根据工具内置的语言,您可能会使用现有的测试套件或构建自己的测试套件(pygments 似乎使用名为 pyTest 的基于 Python 的工具),这主要包括运行每个input 循环通过您的工具,读取输出,并将其与预期值进行比较。如果输出不匹配,您可以显示一条消息,显示哪些测试失败、输入/输出/预期/错误值是什么。如果输出通过,您可以简单地用一个快乐的绿色复选标记发出信号。然后,当测试完成时,开发人员希望能够通过查看结果来推断出他们破坏了什么。

随机化这些输入的顺序通常是一个好主意,这样您就可以确保测试中的每个步骤都没有传递到下一个测试并导致它通过或失败的副作用不正确。对完整测试的时间进行计时也可能是一个好主意。如果昨天整个过程需要 12 秒,而现在需要 2 分钟,那么即使所有测试在技术上“通过”,我们也可能破坏了某些东西。

在诸如代码高亮器之类的工具中,在对所有内容进行编码之前,您通常对许多输入和输出的外观有一个很好的了解,例如,如果某个规范文档已经存在。在这种情况下,包含您知道不会立即通过的测试可能是一个好主意,但用一些标签标记它们(可能是文件中显示“未通过”的一些文本标记,或以某种方式),并告诉您的测试套件预计这些测试会失败。然后,当您修复错误和添加功能时,假设您修复了错误 X 以尝试通过测试 #144。现在,当您运行文本时,它还会提醒您其他 10 个应该失败的测试现在正在通过。恭喜!您只需在尝试修复几个实际上由同一根问题引起的不同问题时省去大量工作。

随着代码库的更新,开发人员将运行并重新运行测试以确保他所做的任何更改不会破坏之前工作的测试,然后将新测试添加到集合中以验证他的新功能,固定边缘情况等,现在有一个已知的预期输出,您可以确保将来不会有人意外破坏。