运行测试套件

Prism 有一个测试套件,可确保匹配正确的标记。

运行测试套件

运行测试套件很简单:只需调用 npm test

所有测试文件都独立运行。为每个测试用例创建一个新的 Prism 实例。这会稍微降低测试运行器的速度,但我们可以确保没有任何内容泄漏到下一个测试用例中。

针对特定语言运行测试

要仅针对一种语言运行测试,可以使用 language 参数

npm run test:languages -- --language=markup

甚至可以指定多种语言

npm run test:languages -- --language=markup --language=css

编写测试

感谢编写测试!测试太棒了!它们确保我们可以在不破坏任何内容的情况下改进代码库。此外,通过这种方式,我们可以确保 Prism 升级对您尽可能轻松。

可以通过在位于 /tests/languages/${language} 的测试目录中创建新的测试用例文件(带有 .test 文件扩展名)来添加新测试。

语言目录

所有测试都按目录归类到 tests/languages 目录中。每个目录名称编码您当前正在测试的语言。

所有语言名称都必须与 components.json 中定义的名称相匹配。

示例 1:独立测试一种语言(默认用例)

只需将测试文件放入您要测试的语言目录中。

因此,如果您想测试 CSS,请将您的测试文件放入 /tests/languages/css 中以仅测试 CSS。如果您在此目录中创建一个测试用例,测试运行器将确保正确加载 css 语言定义(包括所有必需的语言定义)。

示例 2:测试语言注入

如果您想测试语言注入,通常需要加载两种或多种语言,其中一种语言是正在测试的“主”语言,而所有其他语言都被注入其中。

您需要使用 + 号将多种语言分隔开来以定义多种语言:markup+php

语言按顺序加载,因此首先加载标记(+ 依赖项),然后加载 php(+ 依赖项)。测试加载器将确保没有语言被加载超过一次(例如,如果两种语言具有相同的依赖关系)。

默认情况下,最后一种语言是主语言:php+markup 会将 markup 作为主语言。这与将您的代码放入以下代码块中相同

...
<pre><code class="language-markup">
	<!-- your code here -->
</code><pre>
...

如果您需要按照特定顺序加载语言,但不想将最后一种语言用作主语言,则可以使用叹号来标记主语言:php!+markup。这会使用 php 作为主语言。(您只能定义一种主语言。测试运行器会使具有一个以上主语言的目录中的所有测试都失败。)

注意:通过加载多种语言,可以进行集成测试(确保同时加载两种或多种语言不会破坏任何内容)。

创建测试用例文件

首先,您需要在您想要测试的语言目录中创建一个新文件。

为测试用例使用一个合适的名称。请使用下列约定中的一种情况

您可以前缀使用所有约定,因此 string_interpolation_feature_inline.test 是可能的。但是请花一两分钟的时间考虑测试用例文件的合适名称。您不仅为计算机,也为其他开发人员编写代码。

编写测试

测试用例文件由两到三部分构成,以十个或更多破折号 - 分隔,从行开始。这些部分如下

  1. 您的代码片段。您想要使用 Prism 进行标记化的代码。(必需
  2. 您期望的简化标记流。必须是有效的 JSON。(可选
    如果不存在,测试运行器将自动插入此内容。仔细检查已插入的标记流是否符合您的预期。
    如果测试用例失败,因为 JSON 存在但内容不正确,那么您可以使用 --update 标志 来覆盖它。
  3. 简要的评论,解释测试用例。(可选

这是一个示例

var a = 5;

----------------------------------------------------

[
	["keyword", "var"],
	" a ",
	["operator", "="],
	["number", "5"],
	["punctuation", ";"]
]

----------------------------------------------------

This is a comment explaining this test case.

编写测试的简单方法

创建一或多个新测试用例的简单方法是

  1. 创建一个新的测试用例文件 tests/languages/{language}/{test-case}.test
  2. 插入您想要测试的代码(仅限代码)。
  3. 对您想要的任意多个测试用例重复前两个步骤。
  4. 运行 npm run test:languages
  5. 完成。

更新现有测试用例文件也很容易!

  1. 运行 npm run test:languages -- --update
  2. 完成。

它的工作原理是让测试运行器将您测试代码的实际标记流作为预期标记流插入。仔细检查已插入的标记流是否实际上符合您的预期,否则测试毫无意义!

更新测试

在创建和修改语言时,必须更新它们的测试文件才能对语言进行妥善测试。可以利用以下命令自动完成更新测试文件的繁琐任务

npm run test:languages -- --update

更新(覆盖)所有失败的测试文件的预期标记流。运行此命令后,语言测试一定会通过。

请注意:此命令让创建/更新测试文件变得轻而易举,但这并不意味着测试是正确的。务必仔细检查插入/更新的标记流!

简化标记流说明

Prism 在高亮显示时会将源代码转换成一个标记流。这本质上是嵌套标记(数组或字符串)的树。

由于难以手工编写这些树,所以测试运行程序采用了其简化版本。

它使用以下规则

简化标记流不包含标记的别名。

有关更多信息:阅读测试运行程序的测试(tests/testrunner-tests.js)将帮您理解该转换。

编写特定测试

有时,使用标记流测试还不够强大。通过创建扩展名为 .html.test 的测试文件(而不是 .test),可以让 Prism 高亮显示任意代码块,并检查其 HTML 结果。

语言由包含测试文件所在文件夹确定,如前一节所述。

例如,测试文件结构如下所示

&amp;
&#x41;

----------------------------------------------------

<span class="token entity named-entity" title="&amp;">&amp;amp;</span>
<span class="token entity" title="&#x41;">&amp;#x41;</span>

----------------------------------------------------

This is a comment explaining this test case.

测试运行程序测试

测试运行程序本身在单独的测试用例中进行测试。您可以在 tests/testrunner-tests.js 中找到所有与“测试核心”相关的测试。

除了修改测试运行程序代码之外,您无需再接触此文件。

内部结构

全局测试流程如下

  1. 运行所有内部测试(测试测试运行程序)。
  2. 查找所有语言测试。
  3. 为各个语言测试运行所有测试。
  4. 报告结果。