{"id":16554568,"url":"https://github.com/tyrrrz/githubactionstestlogger","last_synced_at":"2026-04-02T13:28:40.318Z","repository":{"id":38257308,"uuid":"249215553","full_name":"Tyrrrz/GitHubActionsTestLogger","owner":"Tyrrrz","description":".NET test logger that reports to GitHub Actions","archived":false,"fork":false,"pushed_at":"2025-05-03T20:28:21.000Z","size":463,"stargazers_count":309,"open_issues_count":3,"forks_count":21,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-05-16T04:03:55.969Z","etag":null,"topics":["actions","annotations","diff","dotnet","github","job","msbuild","summary","test","testing"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tyrrrz.png","metadata":{"files":{"readme":"Readme.md","changelog":null,"contributing":null,"funding":null,"license":"License.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":"Tyrrrz","patreon":"Tyrrrz","custom":["buymeacoffee.com/Tyrrrz","tyrrrz.me/donate"]}},"created_at":"2020-03-22T15:42:39.000Z","updated_at":"2025-05-16T00:04:18.000Z","dependencies_parsed_at":"2023-02-08T20:16:32.794Z","dependency_job_id":"98888b8c-fa15-4c98-bdcf-5f25ee8e603f","html_url":"https://github.com/Tyrrrz/GitHubActionsTestLogger","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tyrrrz%2FGitHubActionsTestLogger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tyrrrz%2FGitHubActionsTestLogger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tyrrrz%2FGitHubActionsTestLogger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tyrrrz%2FGitHubActionsTestLogger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tyrrrz","download_url":"https://codeload.github.com/Tyrrrz/GitHubActionsTestLogger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254464891,"owners_count":22075570,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actions","annotations","diff","dotnet","github","job","msbuild","summary","test","testing"],"created_at":"2024-10-11T19:51:48.733Z","updated_at":"2026-04-02T13:28:40.262Z","avatar_url":"https://github.com/Tyrrrz.png","language":"C#","readme":"# GitHub Actions Test Logger\n\n[![Status](https://img.shields.io/badge/status-maintenance-ffd700.svg)](https://github.com/Tyrrrz/.github/blob/master/docs/project-status.md)\n[![Made in Ukraine](https://img.shields.io/badge/made_in-ukraine-ffd700.svg?labelColor=0057b7)](https://tyrrrz.me/ukraine)\n[![Build](https://img.shields.io/github/actions/workflow/status/Tyrrrz/GitHubActionsTestLogger/main.yml?branch=master)](https://github.com/Tyrrrz/GitHubActionsTestLogger/actions)\n[![Coverage](https://img.shields.io/codecov/c/github/Tyrrrz/GitHubActionsTestLogger/master)](https://codecov.io/gh/Tyrrrz/GitHubActionsTestLogger)\n[![Version](https://img.shields.io/nuget/v/GitHubActionsTestLogger.svg)](https://nuget.org/packages/GitHubActionsTestLogger)\n[![Downloads](https://img.shields.io/nuget/dt/GitHubActionsTestLogger.svg)](https://nuget.org/packages/GitHubActionsTestLogger)\n[![Discord](https://img.shields.io/discord/869237470565392384?label=discord)](https://discord.gg/2SUWKFnHSm)\n[![Fuck Russia](https://img.shields.io/badge/fuck-russia-e4181c.svg?labelColor=000000)](https://twitter.com/tyrrrz/status/1495972128977571848)\n\n\u003ctable\u003e\n    \u003ctr\u003e\n        \u003ctd width=\"99999\" align=\"center\"\u003eDevelopment of this project is entirely funded by the community. \u003cb\u003e\u003ca href=\"https://tyrrrz.me/donate\"\u003eConsider donating to support!\u003c/a\u003e\u003c/b\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"favicon.png\" alt=\"Icon\" /\u003e\n\u003c/p\u003e\n\n**GitHub Actions Test Logger** is a custom logger for `dotnet test` that integrates with GitHub Actions.\nWhen using this logger, failed tests are listed in job annotations and highlighted in code diffs.\nAdditionally, this logger also generates a job summary that contains detailed information about the executed test run.\n\n## Terms of use\u003csup\u003e[[?]](https://github.com/Tyrrrz/.github/blob/master/docs/why-so-political.md)\u003c/sup\u003e\n\nBy using this project or its source code, for any purpose and in any shape or form, you grant your **implicit agreement** to all the following statements:\n\n- You **condemn Russia and its military aggression against Ukraine**\n- You **recognize that Russia is an occupant that unlawfully invaded a sovereign state**\n- You **support Ukraine's territorial integrity, including its claims over temporarily occupied territories of Crimea and Donbas**\n- You **reject false narratives perpetuated by Russian state propaganda**\n\nTo learn more about the war and how you can help, [click here](https://tyrrrz.me/ukraine). Glory to Ukraine! 🇺🇦\n\n## Install\n\n- 📦 [NuGet](https://nuget.org/packages/GitHubActionsTestLogger): `dotnet add package GitHubActionsTestLogger`\n\n## Screenshots\n\n![annotations](.assets/annotations.png)\n![summary](.assets/summary.png)\n\n## Usage\n\nTo use **GitHub Actions Test Logger**, install it in your test project and modify your GitHub Actions workflow by adding `--logger GitHubActions` to `dotnet test`:\n\n```yaml\nname: main\non: [push, pull_request]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      - name: Checkout\n        uses: actions/checkout@v4\n\n      - name: Install .NET\n        uses: actions/setup-dotnet@v4\n\n      - name: Build \u0026 test\n        run: dotnet test --configuration Release --logger GitHubActions\n```\n\nBy default, the logger will only report failed tests in the job summary and annotations.\nIf you want the summary to include detailed information about passed and skipped tests as well, update the workflow as follows:\n\n```yaml\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      # ...\n\n      - name: Build \u0026 test\n        run: \u003e\n          dotnet test\n          --configuration Release\n          --logger \"GitHubActions;summary.includePassedTests=true;summary.includeSkippedTests=true\"\n```\n\n\u003e **Warning**:\n\u003e The new testing platform (i.e. `Microsoft.Testing.Platform`) [is not yet supported](https://github.com/Tyrrrz/GitHubActionsTestLogger/issues/41). This is because VSTest and MTP are using different extensibility models, and this project existed before MTP existed.\n\u003e To use **GitHub Actions Test Logger**, make sure to use the classic testing experience (`vstest`) instead.\n\n\u003e **Important**:\n\u003e Ensure that your test project references the latest version of **Microsoft.NET.Test.Sdk**.\n\u003e Older versions of this package may not be compatible with the logger.\n\n\u003e **Important**:\n\u003e If you are using **.NET SDK v2.2 or lower**, you need to [set the `\u003cCopyLocalLockFileAssemblies\u003e` property to `true` in your test project](https://github.com/Tyrrrz/GitHubActionsTestLogger/issues/5#issuecomment-648431667).\n\n### Collecting source information\n\n**GitHub Actions Test Logger** can leverage source information to link reported test results to the locations in the source code where the corresponding tests are defined.\nBy default, `dotnet test` does not collect source information, so the logger relies on stack traces to extract it manually.\nThis approach only works for failed tests, and even then may not always be fully accurate.\n\nTo instruct the runner to collect source information, add the `RunConfiguration.CollectSourceInformation=true` argument to the command as shown below:\n\n```yml\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      # ...\n\n      - name: Build \u0026 test\n        # Note that the space after the last double dash (--) is intentional\n        run: \u003e\n          dotnet test\n          --configuration Release\n          --logger GitHubActions\n          --\n          RunConfiguration.CollectSourceInformation=true\n```\n\n\u003e **Note**:\n\u003e This option can also be enabled by setting the corresponding property in a [`.runsettings` file](https://learn.microsoft.com/en-us/visualstudio/test/configure-unit-tests-by-using-a-dot-runsettings-file) instead.\n\n\u003e **Warning**:\n\u003e Source information collection may not work properly with legacy .NET Framework.\n\n### Customizing behavior\n\nWhen running `dotnet test`, you can customize the logger's behavior by passing additional options:\n\n```yml\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n      # ...\n\n      - name: Build \u0026 test\n        run: \u003e\n          dotnet test\n          --configuration Release\n          --logger \"GitHubActions;annotations.titleFormat=@test;annotations.messageFormat=@error\"\n```\n\n#### Custom annotation title\n\nUse the `annotations.titleFormat` option to specify the annotation title format used for reporting test failures.\n\nThe following replacement tokens are available:\n\n- `@test` — replaced with the display name of the test\n- `@traits.TRAIT_NAME` — replaced with the value of the trait named `TRAIT_NAME`\n- `@error` — replaced with the error message\n- `@trace` — replaced with the stack trace\n- `@framework` — replaced with the target framework\n\n**Default**: `@test`.\n\n**Examples**:\n\n- `@test` → `MyTests.Test1`\n- `[@traits.Category] @test` → `[UI Tests] MyTests.Test1`\n- `@test (@framework)` → `MyTests.Test1 (.NETCoreApp,Version=v6.0)`\n\n#### Custom annotation message\n\nUse the `annotations.messageFormat` option to specify the annotation message format used for reporting test failures.\nSupports the same replacement tokens as [`annotations.titleFormat`](#custom-annotation-title).\n\n**Default**: `@error`.\n\n**Examples**:\n\n- `@error` → `AssertionException: Expected 'true' but found 'false'`\n- `@error\\n@trace` → `AssertionException: Expected 'true' but found 'false'`, followed by stacktrace on the next line\n\n#### Include passed tests in summary\n\nUse the `summary.includePassedTests` option to specify whether passed tests should be included in the summary.\nIf you want to link passed tests to their corresponding source definitions, make sure to also enable [source information collection](#collecting-source-information).\n\n**Default**: `false`.\n\n\u003e **Warning**:\n\u003e If your test suite is really large, enabling this option may cause the summary to exceed the [maximum allowed size](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#step-isolation-and-limits).\n\n#### Include skipped tests in summary\n\nUse the `summary.includeSkippedTests` option to specify whether skipped tests should be included in the summary.\nIf you want to link skipped tests to their corresponding source definitions, make sure to also enable [source information collection](#collecting-source-information).\n\n**Default**: `false`.\n\n\u003e **Warning**:\n\u003e If your test suite is really large, enabling this option may cause the summary to exceed the [maximum allowed size](https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#step-isolation-and-limits).\n\n#### Include not found tests in summary\n\nUse the `summary.includeNotFoundTests` option to specify whether empty test assemblies should be included in the summary.\n\nUsing [test filters](https://learn.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests) might result in some test assemblies not yielding any matching tests.\nThis might be done on purpose in which case reporting these may not be helpful. \n\n**Default**: `true`.\n","funding_links":["https://github.com/sponsors/Tyrrrz","https://patreon.com/Tyrrrz","buymeacoffee.com/Tyrrrz","tyrrrz.me/donate"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftyrrrz%2Fgithubactionstestlogger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftyrrrz%2Fgithubactionstestlogger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftyrrrz%2Fgithubactionstestlogger/lists"}