Jenkins integration for dotnet test

后端 未结 3 1611
南笙
南笙 2020-12-31 11:32

I\'m running a unit test of a dotnet core library using dotnet test. I run the test on my Jenkins slave like this.

dotnet test test/Turbine.Domain.UnitTest -         


        
相关标签:
3条回答
  • 2020-12-31 12:00

    Thanks Matt and kiml42!

    I'm using dotnet core 2.2 with MSpec as my test framework, and don't need the hacky copying, and can use the trx format (https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet-test?tabs=netcore21#examples).

    The test command I use is: dotnet test --logger "trx;LogFileName=UnitTests.trx", which runs tests in each of the test projects, and writes the results to {ProjectFolder}/TestResults/UnitTests.trx

    I do have the MSTest plugin installed, which converts from trx to junit format (https://wiki.jenkins.io/display/JENKINS/MSTest+Plugin).

    I also link to the test results using a post/always/step block as follows:

      post {
        always {
          step ([$class: 'MSTestPublisher', testResultsFile:"**/TestResults/UnitTests.trx", failOnError: true, keepLongStdio: true])
        }
      }
    

    I have the following declarative Jenkinsfile pipeline:

    pipeline {
      agent any
      stages {
        stage('Restore') {
          steps {
            sh 'dotnet restore'
          }
        }
        stage('Test') {
          steps {
            sh 'dotnet test --logger "trx;LogFileName=UnitTests.trx"'
          }
        }
        stage('Build') {
          steps {
            sh 'dotnet build'
          }
        }
        stage('Stop') {
          steps {
            sh 'sudo systemctl stop core-app.service'
          }
        }
        stage('Deploy') {
          steps {
            sh 'rm -rf /var/www/core-app'
            sh 'cp -R . /var/www/core-app'
          }
        }
        stage('Start') {
          steps {
            sh 'sudo systemctl start core-app.service'
          }
        }
      }
      post {
        always {
          step ([$class: 'MSTestPublisher', testResultsFile:"**/TestResults/UnitTests.trx", failOnError: true, keepLongStdio: true])
        }
      }
      tools {
        msbuild '.NET Core 2.2.103'
      }
      environment {
        ASPNETCORE_ENVIRONMENT = 'Production'
      }
    }
    
    0 讨论(0)
  • 2020-12-31 12:06

    You can use the following Pipeline code to run and publish the dotnet core test results:

    node {
    stage 'Checkout'
        cleanWs()
        checkout scm
    
    stage 'Build'
        bat "\"C:/Program Files/dotnet/dotnet.exe\" restore \"${workspace}/YourProject.sln\""
        bat "\"C:/Program Files/dotnet/dotnet.exe\" build \"${workspace}/YourProject.sln\""
    
    stage 'UnitTests'
        bat returnStatus: true, script: "\"C:/Program Files/dotnet/dotnet.exe\" test \"${workspace}/YourProject.sln\" --logger \"trx;LogFileName=unit_tests.xml\" --no-build"
        step([$class: 'MSTestPublisher', testResultsFile:"**/unit_tests.xml", failOnError: true, keepLongStdio: true])
    }
    

    I have uploaded some examples that I made to my GitHub for everyone to use and contribute, feel free to take a look:

    https://github.com/avrum/JenkinsFileFor.NETCore

    Those pipline jenkinsfile will add this pipline template to your build:

    0 讨论(0)
  • 2020-12-31 12:26

    So I'm using xUnit and the trx format which works happily:

    Run Tests:

    dotnet test test_dir\test_project.csproj --logger "trx;LogFileName=results\unit_tests.xml"
    

    However using this gives me the following issue:

    No test discoverer is registered to perform discovery of test cases.
    Register a test discoverer and try again.
    

    And so copying the xunit runner manually to the bin folder of the test project fixes this (yes this is hacky):

    copy packages\xunit.runner.visualstudio.2.2.0\build\_common\*.dll test_dir\bin\Release /Y
    

    I then add a Publish xUnit tests step as shown:

    Tests then get reported correctly on the project and build pages.

    0 讨论(0)
提交回复
热议问题