Writing Tests (Unit Tests, Integration Tests) is not only the best practice but also essential to ensure quality code.
From the DevOps side, it is essential to put a gate to check for successful unit test execution with each pull request or push. So in this article, we will see how to implement a pipeline to run the unit tests and publish the results.
What do we need?
- We need a pipeline to be triggered with every pull request for your code repo.
- Jobs to run the unit tests and publish the results.
Please follow my other articles to learn more about GitHub Actions: CI/CD with GitHub Actions, CI/CD with GitHub Actions to deploy Applications to Azure App Service, CI/CD with GitHub Actions to deploy Application to Azure Kubernetes Cluster
Let’s create our pipeline for unit test execution. To do this add a yaml/yml file as .github/workflows/buildAndRunTest.yml in the root project folder and then starts with defining the name & triggering action.
name: Build and run tests
env:
DOTNET_VERSION: '6.0' # set this to the .NET Core version to use
WORKING_DIRECTORY: './src' #define the root folder path
on:
workflow_dispatch: #for manual trigger
pull_request: #trigger action with pull request
branches:
- main #your branch name
Next step, we will define the job and mention the target machine (Linux/windows) then perform the necessary steps for code checkout and setting .net core
jobs:
build:
runs-on: ubuntu-latest #target machine is ubuntu
steps:
- uses: actions/checkout@v2
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: ${{ env.DOTNET_VERSION }} #reading it from env variable defined above
I’m using “EnricoMi/publish-unit-test-result-action” action from the marketplace with JUnit logger hence we need to install the related package for each test project as the next step.
Xml logger for JUnit v5 compliant xml report when test is running with “dotnet test” or “dotnet vstest”.
- name: Setup test loggers
shell: pwsh
run: |
foreach ($file in Get-ChildItem -Path .src/tests/*Tests.csproj -Recurse)
{
dotnet add $file package JunitXml.TestLogger --source 'https://api.nuget.org/v3/index.json'
}
From the above code, looping through all test projects inside the src/tests folder.
Next step we will execute the tests with dotnet command.
- name: Run unit tests
shell: bash
working-directory: ./src
run: |
dotnet test myDemoApp.sln --logger 'junit;LogFileName=TestResults.xml' \
--verbosity normal --results-directory ./_test-results
The above code will run all the unit tests in the project and save the result inside the src/_test-results/TestResults.xml file.
If you have categorized tests then you can use the filter option with dotnet test as:
dotnet test — filter “TestCategory=CategoryA”
Finally will publish the results using “EnricoMi/publish-unit-test-result-action” from the marketplace.
- name: Publish Unit Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
if: always()
with:
junit_files: ./src/_test-results/*.xml
We are done so With this if you the actions pipeline you will see the results as:
Note: There are various actions available in the GitHub marketplace to publish your test results, please explore them too.
Hope you enjoyed the content, follow me for more like this, and please don’t forget to LIKE it. Happy programming.
No comments:
Post a Comment