测试扩展
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。本文件的其余部分将解释这些文件在示例中的作用:
- 测试脚本 (
src/test/runTest.ts) - 测试运行脚本 (
src/test/suite/index.ts)
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 等持续集成服务中运行您的扩展测试。