Run smoke tests to verify the extension loads and basic functionality works in a real VS Code environment.
When to Use This Skill
- •After making changes to extension activation code
- •After modifying commands or API exports
- •Before submitting a PR to verify nothing is broken
- •When the user asks to "run smoke tests" or "verify the extension works"
Quick Reference
| Action | Command |
|---|---|
| Run all smoke tests | npm run compile && npm run compile-tests && npm run smoke-test |
| Run specific test | npm run smoke-test -- --grep "Extension activates" |
| Debug in VS Code | Debug panel → "Smoke Tests" → F5 |
How Smoke Tests Work
Unlike unit tests (which mock VS Code), smoke tests run inside a real VS Code instance:
- •
npm run smoke-testuses@vscode/test-cli - •The CLI downloads a standalone VS Code binary (cached in
.vscode-test/) - •It launches that VS Code with your extension installed
- •Mocha runs test files inside that VS Code process
- •Results are reported back to your terminal
This is why smoke tests are slower (~10-60s) but catch real integration issues.
Workflow
Step 1: Compile and Run
bash
npm run compile && npm run compile-tests && npm run smoke-test
Step 2: Interpret Results
Pass: 4 passing (2s) → Extension works, proceed.
Fail: See error message and check Debugging section.
Running Individual Tests
To run a specific test instead of the whole suite:
bash
# By test name (grep pattern)
npm run smoke-test -- --grep "Extension activates"
# Or temporarily add .only in code:
test.only('Extension activates without errors', ...)
Debugging Failures
| Error | Cause | Fix |
|---|---|---|
Extension not installed | Build failed or ID mismatch | Run npm run compile, check extension ID |
Extension did not become active | Error in activate() | Debug with F5, check Debug Console |
Command not registered | Missing from package.json | Add to contributes.commands |
Timeout exceeded | Slow startup or infinite loop | Increase timeout or check for blocking code |
For detailed debugging, use VS Code: Debug panel → "Smoke Tests" → F5
Adding New Smoke Tests
Create a new file in src/test/smoke/ with the naming convention *.smoke.test.ts:
typescript
import * as assert from 'assert';
import * as vscode from 'vscode';
import { waitForCondition } from '../testUtils';
import { ENVS_EXTENSION_ID } from '../constants';
suite('Smoke: [Feature Name]', function () {
this.timeout(60_000);
test('[Test description]', async function () {
// Arrange
const extension = vscode.extensions.getExtension(ENVS_EXTENSION_ID);
assert.ok(extension, 'Extension not found');
// Ensure extension is active
if (!extension.isActive) {
await extension.activate();
}
// Act
const result = await someOperation();
// Assert
assert.strictEqual(result, expected, 'Description of what went wrong');
});
});
Key patterns:
- •Use
waitForCondition()instead ofsleep()for async assertions - •Set generous timeouts (
this.timeout(60_000)) - •Include clear error messages in assertions
Test Files
| File | Purpose |
|---|---|
src/test/smoke/activation.smoke.test.ts | Extension activation tests |
src/test/smoke/index.ts | Test runner entry point |
src/test/testUtils.ts | Utilities (waitForCondition, etc.) |
Prerequisites
- •CI needs webpack build: The extension must be built with
npm run compile(webpack) before tests run. The test runner usesdist/extension.jswhich is only created by webpack, not bynpm run compile-tests(tsc) - •Extension builds: Run
npm run compilebefore tests
Notes
- •First run downloads VS Code (~100MB, cached in
.vscode-test/) - •Tests auto-retry once on failure