111 lines
3.0 KiB
Markdown
111 lines
3.0 KiB
Markdown
# TeamCity Test Integration
|
|
|
|
This project includes TeamCity test reporting integration using the `TeamcityReporter` class.
|
|
|
|
## Usage
|
|
|
|
### In TeamCity CI
|
|
|
|
When running tests in TeamCity, use the `test:teamcity` script:
|
|
|
|
```bash
|
|
bun run test:teamcity
|
|
```
|
|
|
|
This will automatically detect the TeamCity environment (via `TEAMCITY_VERSION` env variable) and output test results in TeamCity's service message format.
|
|
|
|
### Local Development
|
|
|
|
For local testing, simply use:
|
|
|
|
```bash
|
|
bun test
|
|
```
|
|
|
|
The TeamCity reporter will be disabled automatically when not running in TeamCity.
|
|
|
|
## How It Works
|
|
|
|
The integration uses a TAP (Test Anything Protocol) to TeamCity converter:
|
|
|
|
1. **TAP Reporter**: Bun's built-in TAP reporter outputs test results in TAP format
|
|
2. **Converter**: `scripts/test-tap-teamcity.ts` parses TAP output and converts it to TeamCity service messages
|
|
3. **TeamcityReporter**: `tests/TeamcityReporter.ts` formats and outputs TeamCity service messages
|
|
|
|
## TeamCity Service Messages
|
|
|
|
The reporter outputs the following TeamCity service messages:
|
|
|
|
- `##teamcity[testSuiteStarted name='...']` - When a test suite starts
|
|
- `##teamcity[testSuiteFinished name='...']` - When a test suite ends
|
|
- `##teamcity[testStarted name='...']` - When a test starts
|
|
- `##teamcity[testFinished name='...']` - When a test completes successfully
|
|
- `##teamcity[testFailed name='...' message='...' details='...']` - When a test fails
|
|
- `##teamcity[testIgnored name='...']` - When a test is skipped
|
|
|
|
## Special Character Escaping
|
|
|
|
The reporter properly escapes special characters according to [TeamCity's specification](https://www.jetbrains.com/help/teamcity/service-messages.html#Escaped+values):
|
|
|
|
- `|` → `||`
|
|
- `'` → `|'`
|
|
- `\n` → `|n`
|
|
- `\r` → `|r`
|
|
- `[` → `|[`
|
|
- `]` → `|]`
|
|
|
|
## Available Test Scripts
|
|
|
|
| Script | Description |
|
|
|--------|-------------|
|
|
| `bun test` | Run tests normally (local development) |
|
|
| `bun test --watch` | Run tests in watch mode |
|
|
| `bun run test:teamcity` | Run tests with TeamCity reporting |
|
|
| `bun run ci-test` | Alias for `test:teamcity` (used in CI) |
|
|
|
|
## TeamCity Build Configuration
|
|
|
|
Add this build step to your TeamCity build configuration:
|
|
|
|
```bash
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
# Install dependencies
|
|
bun install
|
|
|
|
# Run tests with TeamCity reporting
|
|
bun run ci-test
|
|
```
|
|
|
|
## Files
|
|
|
|
- `tests/TeamcityReporter.ts` - TeamCity service message formatter
|
|
- `scripts/test-tap-teamcity.ts` - TAP to TeamCity converter
|
|
- `scripts/test-teamcity.ts` - Alternative direct output parser (not currently used)
|
|
- `tests/setup.ts` - Test setup utilities
|
|
|
|
## Testing the Integration
|
|
|
|
To test TeamCity reporting locally:
|
|
|
|
```bash
|
|
# Simulate TeamCity environment
|
|
export TEAMCITY_VERSION="2024.1"
|
|
bun run test:teamcity
|
|
|
|
# Unset when done
|
|
unset TEAMCITY_VERSION
|
|
```
|
|
|
|
You should see output like:
|
|
|
|
```
|
|
##teamcity[testSuiteStarted name='HashMap']
|
|
##teamcity[testStarted name='HashMap > constructor > should create an empty map with default capacity']
|
|
##teamcity[testFinished name='HashMap > constructor > should create an empty map with default capacity']
|
|
...
|
|
##teamcity[testSuiteFinished name='HashMap']
|
|
```
|
|
|