Executing unit tests and viewing results in unit tests in a build pipeline is essential to keep high quality in an application deployment via any pipeline system. GitHub actions are the way forward to implement pipelines with repositories in GitHub. Let's explore how to run unit tests and view results in GitHub actions workflow.
Expected outcome
We need a test run report as shown below, showing summary of each project unit test results as well as details of each project test results.
We can run tests for Windows as well and get a Windows test results report as shown below.
The report should give us any failed test details as whown below.
How to do
Let's look at step by step how to implment a github action workflow to build and run uni tests for a .NET applications, then generate a results report as shown above.
Full code example for the workflow can be found here in GitHub.
Let's look at how to run the build and unit test steps for Linux first.
Here we allow to build on push as well as with a manual trigger.
Next we need to create a job for Linux. Here we use ubuntu_latest runner. The permission setting is required to enable the test results trx files to be read for reporting.The next step is to restore NuGet packages and build the projects. Then run unit tests for each test project (*.Tests.csproj). Each test project generates results as a .trx. Full job code is shown below. build_and_unittest_linux:
runs-on: "ubuntu-latest"
permissions:
id-token: write
contents: read
checks: write
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
- name: Install dependencies
run: dotnet restore
- name: Build all projects
run: dotnet build --no-restore
- name: Run unit tests
uses: Amadevus/pwsh-script@v2.0.3
id: dotnet_test
with:
script: |
dir "*.Tests.csproj" -Recurse | %{dotnet test $PSItem.FullName --logger ("trx;LogFileName=" + ($PSItem.Name -replace ".csproj", ".trx")) --no-restore --no-build}
dir "*.Tests.trx" -Recurse | %{ copy-item -Path $PSItem.FullName };
- run: echo '${{ steps.dotnet_test.outputs.result }}'
- name: Create test report
uses: dorny/test-reporter@v1.6.0
if: success() || failure() # run this step even if previous step failed
with:
name: Test Results Linux # Name of the check run which will be created
path: ./*.Tests.trx # Path to test results
reporter: dotnet-trx # Format of test results
build_and_unittest_windows:
runs-on: "windows-latest"
permissions:
id-token: write
contents: read
checks: write
steps:
- uses: actions/checkout@v3
- uses: actions/setup-dotnet@v3
with:
dotnet-version: '6.0.x'
- name: Install dependencies
run: dotnet restore
- name: Build all projects
run: dotnet build --no-restore
- name: Run unit tests
uses: Amadevus/pwsh-script@v2.0.3
id: dotnet_test
with:
script: |
dir "*.Tests.csproj" -Recurse | %{dotnet test $PSItem.FullName --logger ("trx;LogFileName=" + ($PSItem.Name -replace ".csproj", ".trx")) --no-restore --no-build}
dir "*.Tests.trx" -Recurse | %{ copy-item -Path $PSItem.FullName };
- run: echo '${{ steps.dotnet_test.outputs.result }}'
- name: Create test report
uses: dorny/test-reporter@v1.6.0
if: success() || failure() # run this step even if previous step failed
with:
name: Test Results Windows # Name of the check run which will be created
path: ./*.Tests.trx # Path to test results
reporter: dotnet-trx # Format of test results
We can see some code duplication in the above two jobs. In a next post lest look at how to make it refactored to avoid duplication.
No comments:
Post a Comment