本站点文档内容均翻译自code.visualstudio.com,仅供个人学习,如有差异请以官网为准。

测试扩展

Visual Studio Code 支持在扩展中运行和调试测试。这些测试将在一个特殊的 VS Code 实例中运行,称为扩展开发主机,并可以完全访问 VS Code API。我们把这些测试称为集成测试,因为它们超越了可以在没有 VS Code 实例的情况下运行的单元测试。本文档重点介绍 VS Code 集成测试。

概述

如果您正在使用Yeoman Generator来构建扩展,集成测试已经为您创建好了。

在生成的扩展中,你可以使用npm 运行测试纱线测试运行集成测试,这些测试:

  • 下载并解压最新版本的 VS Code。
  • 运行Mocha测试,这些测试由扩展测试运行脚本指定。

快速设置:测试命令行界面

VS Code 团队发布了一个命令行工具来运行扩展测试。你可以在extensions sample repo中找到一个示例。

测试 CLI 提供快速设置,并允许您使用 扩展测试运行器 轻松运行和调试 VS Code UI 的测试。 CLI 在底层专门使用 Mocha

要开始,您首先需要安装@vscode/测试命令行模块,以及@vscode/测试-electron模块使能够在 VS Code 桌面版中运行测试:

npm install --save-dev @vscode/test-cli @vscode/test-electron

安装模块后,您将拥有vscode测试命令行,您可以将其添加到脚本在你的部分package.json输入:

{
  "name": "my-cool-extension",
  "scripts": {
+   "test": "vscode-test"

vscode测试寻找一个.vscode-test.js/mjs/cjs 相对于当前工作目录的文件。此文件为测试运行器提供配置,您可以在此找到完整的定义

常见选项包括:

  • (必填) 文件- 一个模式、模式列表或包含要运行测试的绝对路径。
  • 版本- 运行测试所使用的 VS Code 版本(默认为稳定)。
  • 工作区文件夹- 在测试期间打开的工作区路径。
  • 扩展开发路径- 指向你的扩展文件夹的路径(默认为配置文件所在的目录)。
  • 摩卡 - 一个包含额外选项的对象,传递给Mocha。

配置可能如下所示:

// .vscode-test.js
const { defineConfig } = require('@vscode/test-cli');

模块.导出 = 定义配置({ 文件: 'out/test/**/*.test.js' });

...或更高级:

// .vscode-test.js
const { defineConfig } = require('@vscode/test-cli');

模块.导出 = 定义配置([
  {
    标签: '单元测试',
    文件: 'out/test/**/*.test.js',
    版本: '内部测试版',
    工作区文件夹: './sampleWorkspace',
    mocha: {
      用户界面: 'tdd',
      超时时间: 20000
    }
  }
  // 你也可以指定其他测试配置
]);

如果你通过传递数组定义了多个配置,当你运行时,它们将按顺序执行vscode测试您可以按以下条件筛选Tab并单独运行它们使用--标签旗帜,例如vscode-test --label 单元测试运行vscode-test --帮助请参阅完整的命令行选项。

测试脚本

一旦 CLI 设置完成,你就可以编写和运行测试。测试脚本可以访问 VS Code API,并在 Mocha 下运行。这是一个示例 (src/test/suite/extension.test.ts):

导入 * 作为 断言 '断言';

// 你可以从.vscode模块导入和使用所有API
// 以及导入你的扩展进行测试
import * as vscode from 'vscode';
// import * as myExtension from '../extension';

suite('Extension Test Suite', () => {
  suiteTeardown(() => {
    vscode.window.showInformationMessage('All tests done!');
  });

  测试('示例测试', () => {
    断言.严格等于(-1, [1, 2, 3].indexOf(5));
    断言.严格等于(-1, [1, 2, 3].indexOf(0));
  });
});

你可以运行这个测试npm 测试命令,或者在安装扩展测试运行器后在 VS Code 中使用命令运行所有测试。你也可以使用命令调试所有测试来调试测试。

高级设置:您自己的跑者

你可以在这个指南的配置中找到 helloworld-test-sample。本文件的其余部分将解释这些文件在示例中的作用:

VS Code 提供了两个 CLI 参数用于运行扩展测试,--扩展开发路径--扩展测试路径输入:.

例如:

# - 启动 VS Code 扩展主机
# - 在 <EXTENSION-ROOT-PATH> 加载扩展
# - 执行 <TEST-RUNNER-SCRIPT-PATH> 的测试运行脚本
code \
--extensionDevelopmentPath=<EXTENSION-ROOT-PATH> \
--extensionTestsPath=<TEST-RUNNER-SCRIPT-PATH>

测试脚本 (src/test/runTest.ts) 使用@vscode/测试-electronAPI 以简化下载、解压和启动 VS Code 的过程,并带有扩展测试参数:

导入 * 作为 路径 '路径';

导入 { 运行测试 } 来自 '@vscode/test-electron';

async function main() {
  try {
    // The folder containing the Extension Manifest package.json
    // Passed to `--extensionDevelopmentPath`
    const extensionDevelopmentPath = path.resolve(__dirname, '../../');

    // The path to the extension test runner script
    // Passed to --extensionTestsPath
    const extensionTestsPath = path.resolve(__dirname, './suite/index');

    ```plaintext
    // 下载 VS Code,解压并运行集成测试
    await runTests({ extensionDevelopmentPath, extensionTestsPath });
  } catch (err) {
    console.error(err);
    console.error('测试运行失败');
    process.exit(1);
  }
}
```

();

@vscode/测试-electronAPI 还允许:

  • 使用特定工作区启动 VS Code。
  • 下载不同版本的 VS Code 而不是最新的稳定版本。
  • 使用附加的 CLI 参数启动 VS Code。

您可以在 microsoft/vscode-test 找到更多 API 使用示例。

测试运行脚本

在运行扩展集成测试时,--扩展测试路径 指向 测试运行器脚本 (src/test/suite/index.ts) 用于程序化运行测试套件的脚本。以下是 测试运行器脚本Hello World-测试样本 使用 Mocha 运行测试套件。你可以以此为基础,并使用 Mocha 的 API来自定义你的设置。你也可以用任何其他可以程序化运行的测试框架替换 Mocha。

import * as path from 'path';
import * as Mocha from 'mocha';
import { glob } from 'glob';

export function run(): Promise<void> {
  // Create the mocha test
  const mocha = new Mocha({
    ui: 'tdd',
    color: true
  });

  const testsRoot = path.resolve(__dirname, '..');

  return new Promise((c, e) => {
    glob('**/**.test.js', { cwd: testsRoot })
      .then(files => {
        // Add files to the test suite
        files.forEach(f => mocha.addFile(path.resolve(testsRoot, f)));

        try {
          // Run the mocha test
          mocha.run(failures => {
            if (failures > 0) {
              e(new Error(`${failures} tests failed.`));
            } else {
              c();
            }
          });
        } catch (err) {
          e(err);
        }
      })
      .catch(err => {
        return e(err);
      });
  });
}

测试运行器脚本和*.test.js文件可以访问 VS Code API。

这是一个示例测试 (src/test/suite/extension.test.ts):

导入 * 作为 断言 '断言';
导入 { 之后 }  'mocha';

// You can import and use all API from the 'vscode' module
// as well as import your extension to test it
import * as vscode from 'vscode';
// import * as myExtension from '../extension';

suite('Extension Test Suite', () => {
  after(() => {
    vscode.window.showInformationMessage('All tests done!');
  });

  测试('示例测试', () => {
    断言.严格等于(-1, [1, 2, 3].indexOf(5));
    断言.严格等于(-1, [1, 2, 3].indexOf(0));
  });
});

调试测试

调试测试与调试扩展类似。

这是一个示例launch.json调试器配置:

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Extension Tests",
      "type": "extensionHost",
      "request": "launch",
      "runtimeExecutable": "${execPath}",
      "args": [
        "--extensionDevelopmentPath=${workspaceFolder}",
        "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
      ],
      "outFiles": ["${workspaceFolder}/out/test/**/*.js"]
    }
  ]
}

小贴士

使用Insiders版本进行扩展开发

由于 VS Code 的限制,如果你正在使用 VS Code 稳定版并尝试在 CLI 上运行集成测试,它将抛出一个错误:

从命令行运行扩展测试目前仅支持在没有其他实例运行 Code 的情况下。

一般来说,如果你从命令行运行扩展测试,测试所使用的版本不能已经在运行。作为解决方案,你可以在VS Code稳定版中运行测试,并使用VS Code Insiders进行开发。只要你不从VS Code Insiders的命令行运行测试,而是在VS Code稳定版中运行,这个设置就会正常工作。

另一种选择是直接在 VS Code 中运行扩展测试,来自 debug 启动配置。这还有一个额外的优势,那就是你甚至可以调试测试。

在调试时禁用其他扩展

当您在 VS Code 中调试扩展测试时,VS Code 会使用全局安装的 VS Code 实例,并会加载所有已安装的扩展。您可以添加--禁用扩展配置到launch.json启动参数选项@vscode/测试-electron'运行测试应用程序编程接口。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Extension Tests",
      "type": "extensionHost",
      "request": "launch",
      "runtimeExecutable": "${execPath}",
      "args": [
        "--disable-extensions",
        "--extensionDevelopmentPath=${workspaceFolder}",
        "--extensionTestsPath=${workspaceFolder}/out/test/suite/index"
      ],
      "outFiles": ["${workspaceFolder}/out/test/**/*.js"]
    }
  ]
}
等待 运行测试({
  扩展开发路径,
  扩展测试路径,
  /**
   * 传递给 VS Code 可执行文件的启动参数列表,除了由 `extensionDevelopmentPath` 和 `extensionTestsPath` 提供的 `--extensionDevelopmentPath`
   * 和 `--extensionTestsPath` 选项。
   * 
   * 如果第一个参数是文件/文件夹/工作区的路径,启动的 VS Code 实例
   * 将打开它。
   * 
   * 查看 `code --help` 了解可能的参数。
   */
   启动参数:
  ['--禁用扩展']});

定制设置@vscode/测试-electron

有时你可能需要运行自定义设置,例如运行代码 --安装扩展在开始测试之前,请安装另一个扩展。@vscode/测试-electron有一个更细致的API来适应这种情况:

导入 * 作为 cp 'child_process';
导入 * 作为 path 'path';
导入 {
  downloadAndUnzipVSCode,
  resolveCliArgsFromVSCodeExecutablePath,
  runTests
} '@vscode/test-electron';

async function main() {
  try {
    const extensionDevelopmentPath = path.resolve(__dirname, '../../../');
    const extensionTestsPath = path.resolve(__dirname, './suite/index');
    const vscodeExecutablePath = await downloadAndUnzipVSCode('1.40.1');
    const [cliPath, ...args] = resolveCliArgsFromVSCodeExecutablePath(vscodeExecutablePath);

    // Use cp.spawn / cp.exec for custom setup
    cp.spawnSync(
      cliPath,
      [...args, '--install-extension', '<EXTENSION-ID-OR-PATH-TO-VSIX>'],
      {
        encoding: 'utf-8',
        stdio: 'inherit'
      }
    );

    ```plaintext
    // 运行扩展测试
    await runTests({
      // 使用指定的 `code` 可执行文件
      vscodeExecutablePath,
      extensionDevelopmentPath,
      extensionTestsPath
    });
  } catch (err) {
    console.error('测试失败');
    process.exit(1);
  }
}
```

();

下一步

  • 持续集成 - 在 Azure DevOps 等持续集成服务中运行您的扩展测试。