Skip to content

AriPerkkio/vitest-sonar-reporter

Folders and files

NameName
Last commit message
Last commit date
Apr 14, 2024
Jan 16, 2025
Jan 3, 2025
Apr 24, 2024
Dec 8, 2022
Feb 25, 2024
Mar 20, 2022
Mar 13, 2024
Apr 14, 2024
Feb 24, 2025
Feb 24, 2025
Apr 14, 2024
Mar 20, 2022
Feb 4, 2024

Repository files navigation

vitest-sonar-reporter

Version Downloads Compatibility with vitest@latest

Live examples | Installation | Configuration | Code coverage | Examples


SonarQube reporter for Vitest

Generates Generic Execution reports from vitest tests for SonarQube to analyze.

Live examples

Installation

vitest-sonar-reporter should be included in development dependencies. vitest is required as peer dependency.

npm install --save-dev vitest-sonar-reporter

Configuration

Add new custom reporter and define outputFile in your vite.config.ts:

import { defineConfig } from 'vitest/config';

export default defineConfig({
    test: {
        reporters: [
            'default', // Vitest's default reporter so that terminal output is still visible
            ['vitest-sonar-reporter', { outputFile: 'sonar-report.xml' }],
        ],
    },
});

If you are using Vitest below version ^1.3.0 you can define file in test.outputFile:

test: {
    reporters: ['json', 'verbose', 'vitest-sonar-reporter'],
    outputFile: {
        json: 'my-json-report.json',
        'vitest-sonar-reporter': 'sonar-report.xml',
    },
},

Instruct SonarQube to pick report in your sonar-project.properties:

sonar.testExecutionReportPaths=sonar-report.xml

Options

You can pass additional options to reporter. Note that this requires vitest@^1.3.0.

silent

Silence reporter's verbose logging.

test: {
    reporters: [
        ['vitest-sonar-reporter', { silent: true }]
    ],
}

onWritePath

Rewrite path attribute of <file>. This can be useful when you need to change relative paths of the files.

test: {
    reporters: [
        ['vitest-sonar-reporter', {
            onWritePath(path: string) {
                // Prefix all paths with root directory
                // e.g. '<file path="test/math.ts">' to '<file path="frontend/test/math.ts">'
                return `frontend/${path}`;
            }
        }]
    ],
}
<testExecutions version="1">
-  <file path="test/math.ts">
+  <file path="frontend/test/math.ts">
    <testCase name="multiply" duration="123" />
  </file>
</testExecutions>

outputFile

Location for the report.

test: {
    reporters: [
        ['vitest-sonar-reporter', { outputFile: 'sonar-report.xml' }]
    ],
}

Code Coverage

This reporter does not process code coverage - Vitest already supports that out-of-the-box!

Simply configure vitest to output LCOV reports and instruct SonarQube to pick these reports.

test: {
    coverage: {
        reporters: 'lcov',
    },
},
sonar.javascript.lcov.reportPaths=./coverage/lcov.info

Examples

Workspace

See examples/example-workspace for example setup using Vitest Workspaces.

Basic

import { describe, expect, test } from 'vitest';

describe('animals', () => {
    test('dogs say woof', () => {
        const dog = { say: () => 'woof' };
        expect(dog.say()).toBe('woof');
    });

    test.todo('figure out what rabbits say', () => {
        const rabbit = { say: () => '????' };
        expect(rabbit.say()).toBe('?');
    });

    describe('flying ones', () => {
        test('cats can fly', () => {
            const cat = { fly: () => false };
            expect(cat.fly()).toBe(true);
        });

        test('birds can fly', () => {
            const bird = { fly: () => true };
            expect(bird.fly()).toBe(true);
        });
    });
});
<testExecutions version="1">
  <file path="test/animals.test.ts">
    <testCase name="animals - dogs say woof" duration="2" />
    <testCase name="animals - figure out what rabbits say" duration="0">
      <skipped message="figure out what rabbits say" />
    </testCase>
    <testCase name="animals - flying ones - cats can fly" duration="4">
      <failure message="expected false to be true // Object.is equality">
        <![CDATA[AssertionError: expected false to be true // Object.is equality
    at /workspaces/example/test/animals.test.ts:15:47
    at /workspaces/example/node_modules/vitest/dist/chunk-runtime-chain.7032872a.js:82:26
    at runTest (/workspaces/example/node_modules/vitest/dist/entry.js:771:40)
    at async runSuite (/workspaces/example/node_modules/vitest/dist/entry.js:836:13)
    at async runSuite (/workspaces/example/node_modules/vitest/dist/entry.js:836:13)
    at async runSuite (/workspaces/example/node_modules/vitest/dist/entry.js:836:13)
    at async runFiles (/workspaces/example/node_modules/vitest/dist/entry.js:873:5)
    at async startTests (/workspaces/example/node_modules/vitest/dist/entry.js:879:3)
    at async /workspaces/example/node_modules/vitest/dist/entry.js:906:7
    at async withEnv (/workspaces/example/node_modules/vitest/dist/entry.js:503:5)]]>
      </failure>
    </testCase>
    <testCase name="animals - flying ones - birds can fly" duration="5" />
  </file>
</testExecutions>