语法高亮工具是如何实现自动化测试的?
How do syntax highlighting tools implement automated testing?
pygments and textmate bundle等语法高亮工具是如何进行自动化测试的?
像这样的工具通常只是求助于代表所选输入和预期输出的大量文本片段。例如,如果您查看 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 似乎使用基于 Python 的工具,称为 pyTest),这本质上包括 运行 通过您的工具在一个循环中循环每个 input
,读取输出,并将其与预期值进行比较。如果输出不匹配,您可以显示一条消息,显示哪些测试失败,input/output/expected/error 值是什么。如果输出通过,您可以简单地用快乐的绿色复选标记发出信号。然后当测试完成时,开发人员可以通过查看结果来推断出他们破坏了什么。
随机化这些输入的顺序通常是个好主意,这样您就可以确保测试中的每个步骤都没有副作用,这些副作用会传递给下一个测试并使其通过或错误地失败。计算完整测试的时间长度也是一个好主意。如果昨天整个事情需要 12 秒,但现在需要两分钟,即使所有测试在技术上“通过”,我们也可能已经破坏了一些东西。
在代码高亮器之类的工具中,您通常可以很好地了解许多输入和输出的外观,然后才能对所有内容进行编码,例如,如果某些规范文档已经存在。在这种情况下,包含您知道不会立即通过的测试可能是个好主意,但用一些标签标记它们(可能是文件中的一些文本标记,上面写着“未通过”,或者将文件命名为某种方式),并告诉您的测试套件期望这些测试失败。然后,当您修复错误并添加功能时,假设您修复了错误 X 以尝试使测试 #144 通过。现在,当您 运行 文本时,它还会提醒您其他 10 个应该失败的测试现在都通过了。恭喜!您刚刚为自己节省了很多工作,试图解决实际上是由同一个根本问题引起的几个不同的问题。
随着代码库的更新,开发人员会 运行 并重新运行 测试以确保他所做的任何更改都不会破坏之前有效的测试,然后会添加新的对集合进行测试,以验证他的新功能、固定边缘情况等,现在有一个已知的预期输出,您可以确保将来不会有人意外破坏。
pygments and textmate bundle等语法高亮工具是如何进行自动化测试的?
像这样的工具通常只是求助于代表所选输入和预期输出的大量文本片段。例如,如果您查看 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 似乎使用基于 Python 的工具,称为 pyTest),这本质上包括 运行 通过您的工具在一个循环中循环每个 input
,读取输出,并将其与预期值进行比较。如果输出不匹配,您可以显示一条消息,显示哪些测试失败,input/output/expected/error 值是什么。如果输出通过,您可以简单地用快乐的绿色复选标记发出信号。然后当测试完成时,开发人员可以通过查看结果来推断出他们破坏了什么。
随机化这些输入的顺序通常是个好主意,这样您就可以确保测试中的每个步骤都没有副作用,这些副作用会传递给下一个测试并使其通过或错误地失败。计算完整测试的时间长度也是一个好主意。如果昨天整个事情需要 12 秒,但现在需要两分钟,即使所有测试在技术上“通过”,我们也可能已经破坏了一些东西。
在代码高亮器之类的工具中,您通常可以很好地了解许多输入和输出的外观,然后才能对所有内容进行编码,例如,如果某些规范文档已经存在。在这种情况下,包含您知道不会立即通过的测试可能是个好主意,但用一些标签标记它们(可能是文件中的一些文本标记,上面写着“未通过”,或者将文件命名为某种方式),并告诉您的测试套件期望这些测试失败。然后,当您修复错误并添加功能时,假设您修复了错误 X 以尝试使测试 #144 通过。现在,当您 运行 文本时,它还会提醒您其他 10 个应该失败的测试现在都通过了。恭喜!您刚刚为自己节省了很多工作,试图解决实际上是由同一个根本问题引起的几个不同的问题。
随着代码库的更新,开发人员会 运行 并重新运行 测试以确保他所做的任何更改都不会破坏之前有效的测试,然后会添加新的对集合进行测试,以验证他的新功能、固定边缘情况等,现在有一个已知的预期输出,您可以确保将来不会有人意外破坏。