Add test results to change requests using test API

  • Release version: Zurich
  • Updated March 12, 2026
  • 5 minutes to read
  • Summarize
    Summarized using AI
    This content was generated using new OpenAI-powered functionality. Results are provided on an as is basis and are not guaranteed to be accurate or complete.

    Summary of Add test results to change requests using test API

    This capability enables ServiceNow customers to add test results directly to DevOps change requests by leveraging theDevOps - POST /devops/tool/{capability}API. It supports all test types across various orchestration tools integrated with DevOps Change Velocity, such as Azure DevOps, GitHub, and Jenkins.

    Show full answer Show less

    This integration allows test data from CI/CD pipelines to be automatically attached to change requests, providing visibility into testing outcomes as part of the DevOps process.

    Prerequisites

    • User must have the sndevops.admin role.
    • The test type used in the API must be defined and active in DevOps Change Velocity under DevOps Change Workspace > Administration > Integrations > Test types.
    • Test types must be mapped to the corresponding orchestration tools in Test type mappings for proper integration.

    Key Features

    • Universal API endpoint: Use the format /api/sndevops/v1/devops/tool/test?toolId=<devopsToolID>&testType=<testtype> where toolId is your connected tool's ID and testType is the mapped test type.
    • Supports multiple test types: Including performance, functional, smoke, unit, and load tests.
    • Predefined request body formats: JSON payloads are provided for different test types containing relevant metrics such as duration, passed/failed tests, throughput, virtual users, and timestamps.
    • Integration examples for CI/CD tools: Detailed pipeline configurations are provided for Azure DevOps (YAML pipelines), GitHub Actions, and Jenkins pipelines, demonstrating how to make authenticated POST calls to the API with test results.
    • Authentication: Use the generic connection credentials (username: devops.integration.user) with the corresponding encoded password for API calls.

    Usage Highlights for Supported CI/CD Tools

    • Azure DevOps: Use the REST API task within YAML pipelines to send performance or functional test summaries with build-specific metadata.
    • GitHub Actions: Leverage shell scripts with curl commands to POST test result JSON payloads to the ServiceNow API, including build and workflow details.
    • Jenkins: Use scripted pipelines with the httpRequest step to post test data, handling responses and errors appropriately.

    Limitations

    • The API does not handle waiting or polling logic, so customers must manage timing externally.
    • Re-run test scenarios are not supported natively through this API.

    What Customers Can Expect

    By integrating test results through this API, customers will have automated, consistent visibility of testing outcomes reflected in their DevOps change requests. This streamlines change validation and improves traceability, facilitating better collaboration between development, testing, and operations teams within the ServiceNow DevOps Change Velocity framework.

    Add test results to DevOps change requests using the test capability of the DevOps - POST /devops/tool/{capability} API. The API is available for all test types for various tools connected to DevOps Change Velocity.

    For more information about the API, see DevOps - POST /devops/tool/{capability}. To use the API in Azure DevOps, GitHub, and Jenkins, you must use the format mentioned in the respective sections below.

    Prerequisites

    Role required: sn_devops.admin

    You must make sure that the test type you want to use in the API is available as a test type in DevOps Change Velocity and that it is mapped with the respective orchestration tool.

    1. Navigate to DevOps Change Workspace > Administration > Integrations > Test types.

      You can also use the classic UI navigation DevOps > Integrations > Test Types.

    2. Verify if the test type is available in the Test types table.

      Test types table.

    3. For custom test types, select New and add the test type to the list.
      1. In the Test type field, enter a name for your test type.
      2. From the Test category list, select the category of your test type.
      3. Select Save.
    4. Navigate to DevOps Change Workspace > Administration > Integrations > Test type mappings.

      You can also use the classic UI navigation DevOps > Integrations > Test Type Mappings.

    5. Verify if the test type is mapped to your orchestration tool.

      Test type mappings table.

    6. If the mapping is not available, then select New and create the mapping.
      1. From the Test type list, select the test type that you want to map.
      2. From the Tool integration list, select your orchestration tool.
      3. Select Save.

    Azure DevOps

    For Azure DevOps pipelines, use the format given here to add test results to change requests for various test types.

    Format for URL suffix and parameters:
    /api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolID>&testType=<test_type>
    • The parameter toolId must be a valid Tool Id from a connected and configured tool in DevOps Change Velocity.
    • The parameter testType should have a test type mapping in DevOps Change Velocity.

    Within the Body, you must pass the parameters based on the test type.

    Note:
    For the generic connection, use the following:
    • username: devops.integration.user
    • password: <devops.integration.user password>

    Pipeline configuration for performance tests

    Sample parameters for the body:
    {
      "name": "Perf. tests DEMO5",
      "duration": 0,
      "maximumVirtualUsers": 10,
      "throughput": "5/min",
      "maximumTime": 10000,
      "minimumTime": 5000,
      "averageTime": 7000,
      "ninetyPercent": 8000,
      "standardDeviation": 2,
    "startTime": "2023-12-14T23:31:31z",
      "finishTime": "2023-12-14T23:40:32z",
      "buildNumber": $(Build.BuildNumber),
      "stageName": "Test API Job",
      "pipelineName": "TEST-CI-PIPELINE"
    }

    Sample Azure DevOps pipeline configuration for performance tests.

    Performance test summary in your Now instance:

    Performance test summary.

    Test summary attached to your DevOps change request:

    Change request test summary.

    Pipeline configuration for other functional and unit tests

    Sample parameters for the body:
    {
      "name":" Smoke Test summary",
       "duration":0.0,
       "passedTests":1,
       "failedTests":1,
       "skippedTests":1,
       "blockedTests":1,
       "totalTests":4,
      "startTime": "2023-12-14T23:31:31z",
      "finishTime": "2023-12-15T23:31:31z",
      "buildNumber": $(Build. BuildNumber),
     "stageName": "Test API Job",
      "pipelineName": "TEST-CI-PIPELINE"
    }

    Sample Azure DevOps pipeline configuration for other functional tests.

    Test summary attached to your DevOps change request:

    Change request test summary.

    Azure DevOps YAML pipeline

    Sample pipeline:

    stages:
      - stage: BashScript
        jobs:
          - job: 'bash'
            steps:
            - script: echo Hello, world!
              displayName: 'BashScript'
    
            
      - stage: TestAPI
        dependsOn: BashScript
        jobs:
          - job: 'RESTTestAPI'
            # dependsOn: BashScript
            pool: server
            steps:
            - task: InvokeRESTAPI@1
              displayName: 'Invoke REST API: POST'
              inputs:
                connectionType: 'connectedServiceName'
                serviceConnection: 'v01 - generic connection'
                method: 'POST'
                body: |
                  {
                                "name": "Performance test summary kl2",
                                "duration": 0,
                                "maximumVirtualUsers": 10,
                                "throughput": "5/min",
                                "maximumTime": 10000,
                                "minimumTime": 5000,
                                "averageTime": 7000,
                                "ninetyPercent": 8000,
                                "standardDeviation": 2,
                                "startTime": "2023-12-14T23:31:31z",
                                "finishTime": "2023-12-14T23:40:32z",
                                "buildNumber": $(Build.BuildId),
                                "stageName": "TestAPI/RestTestAPI",
                                "pipelineName": "TESTYMLPipeline"
                              }
                urlSuffix: '/api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolID>&testType=<test_type>'
                waitForCompletion: 'false'
    
              

    Azure DevOps yml pipeline.

    Release pipeline

    Azure DevOps release pipeline yml.

    GitHub

    For GitHub pipelines, use the format given here to add test results to change requests for various test types.

    Pipeline configuration for performance tests

    Sample pipeline:

    name: Test API Call Perf
    
    on: 
      workflow_dispatch:
    
    jobs:
      post_api_call_perf:
        runs-on: ubuntu-latest
        
        steps:
        - name: Checkout Repository
          uses: actions/checkout@v2
    
        - name: post_api_call_perf
          run: |
            apiUrl="https://<your_instance>.service-now.com/api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolId>&testType=<performance_test_type>"
            requestBody='{"toolId": "<devops_ToolId>", "buildNumber": '${{ github.run_number }}' , "workflow": "Test API Call Perf", "repository": "<your_GitHub_repository>", "stageName":"post_api_call_perf","pipelineName":"Test API Call Perf", "testType": "Load", "buildNumber": '${{ github.run_number }}', "buildId": '${{ github.run_id }}' , "attemptNumber" : '${{ github.run_attempt }}', "name": "GitHub Test Summary - Performance 1.0","duration": 0.0,"maximumVirtualUsers": 10,"throughput": "5/min","maximumTime": 1000,"minimumTime": 5000,"averageTime": 7000,"startTime": "2023-12-14T23:31:31z","finishTime": "2023-12-14T23:31:31z","ninetyPercent": 8000, "standardDeviation": 2.0 }'
            auth="devops.integration.user:<password> in base64 encoded"
            authHeader="Basic $auth"
            response=$(curl -X POST -H "Content-Type: application/json" -H "Authorization: $authHeader" -d "$requestBody" $apiUrl)
            exitCode=$?
            
            if [ $exitCode -eq 0 ]; then
              echo "API call successful!"
              echo "Response: $response"
            else
              echo "API call failed!"
              echo "Response: $response"
              exit 1
            fi
    

    Sample GitHub pipeline configuration for performance tests.

    Pipeline configuration for other functional and unit tests

    Sample pipeline:
    name: Test API Call
    
    on: 
      workflow_dispatch:
    
    jobs:
      post_api_call:
        runs-on: ubuntu-latest
        
        steps:
        - name: Checkout Repository
          uses: actions/checkout@v2
    
        - name: post_api_call
          run: |
            apiUrl="https://<your_instance>.service-now.com/api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolID>&testType=<test_type>"
            requestBody='{"toolId": "<devops_ToolID>", "buildNumber": '${{ github.run_number }}' , "workflow": "Test API Call", "repository": "<your_GitHub_repository>", "stageName":"post_api_call","pipelineName":"TestAPICall", "testType": "Smoke", "buildNumber": '${{ github.run_number }}', "buildId": '${{ github.run_id }}' , "attemptNumber" : '${{ github.run_attempt }}', "testSummaries": [{"name": "GitHub Test Summary - smoke","passedTests": 1,"failedTests": 1,"skippedTests": 1,"ignoredTests": 0,"blockedTests": 1,"totalTests": 4,"startTime": "2023-12-14T23:31:31z","endTime": "2023-12-14T23:31:31z","duration": 0.0,"testType": "Smoke", "suites": []}] }'
            auth="devops.integration.user:<password> in base64 encoded"
            
            authHeader="Basic $auth"
            response=$(curl -X POST -H "Content-Type: application/json" -H "Authorization: $authHeader" -d "$requestBody" $apiUrl)
            exitCode=$?
            
            if [ $exitCode -eq 0 ]; then
              echo "API call successful!"
              echo "Response: $response"
            else
              echo "API call failed!"
              echo "Response: $response"
              exit 1
            fi
    

    Sample GitHub pipeline configuration for other functional tests.

    Jenkins

    For Jenkins pipelines, use the format given here to add test results to change requests for various test types.

    Pipeline configuration for performance tests

    Sample pipeline:
    pipeline {
        agent any
        stages {
            stage('POST API Call') {
                steps {
                    script {
                        def apiUrl = 'https://<your_instance>.service-now.com/api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolID>&testType=<performance_test_type>'
                        def requestBody = [
                            name: "Performance Load tests jenkins",
                            duration: 0.0,
                            maximumVirtualUsers: 10,
                            throughput: "6/min",
                            maximumTime: 1000,
                            minimumTime: 300,
                            averageTime: 700,
                            ninetyPercent: 600,
                            standardDeviation: 2.0,
                            startTime: "2023-12-14T23:31:31z",
                            finishTime: "2023-12-14T23:40:32z",
                            buildNumber: env.BUILD_NUMBER,
                            stageName: "POST API Call",
                            pipelineName: "KLPerformanceTestPipeline"
                        ]
                        def auth = "<password>" // devops.integration.user:<password> in base64 encoded.
                        def authHeader = "Basic " + auth
                        def response = httpRequest(
                            contentType: 'APPLICATION_JSON',
                            httpMode: 'POST',
                            requestBody: groovy.json.JsonOutput.toJson(requestBody),
                            url: apiUrl,
                            customHeaders: [[name: 'Authorization', value: authHeader]]
                        )
    
                        if (response.status == 200 || response.status == 201) {
                            echo "API call successful!"
                            echo "Response: ${response.content}"
                        } else {
                            error "API call failed with status ${response.status}"
                        }
                    }
                }
            }
        }
    }

    Sample Jenkins pipeline configuration for performance tests.

    Pipeline configuration for other functional and unit tests

    Sample pipeline:
    pipeline {
        agent any
        
        stages {
            stage('POST API Call') {
                steps {
                    script {
                        def apiUrl = 'https://<your_instance>.service-now.com/api/sn_devops/v1/devops/tool/test?toolId=<devops_ToolID>&testType=<test_type>'
                        def requestBody = [
                            name: "Smoke tests",
                            duration: 0.0,
                            passedTests: 1,
                            failedTests: 1,
                            skippedTests: 1,
                            blockedTests: 1,
                            totalTests: 4,
                            startTime: "2023-12-14T23:31:31z",
    	                    finishTime: "2023-12-15T23:31:31z",
                            buildNumber: env.BUILD_NUMBER,
                            stageName: "POST API Call",
                            pipelineName: "TestPipelineKL"
                        ]
                        
                        def auth = "<password>" // devops.integration.user:<password> in base64 encoded.
                        def authHeader = "Basic " + auth
                        
                        def response = httpRequest(
                            contentType: 'APPLICATION_JSON',
                            httpMode: 'POST',
                            requestBody: groovy.json.JsonOutput.toJson(requestBody),
                            url: apiUrl,
                            customHeaders: [[name: 'Authorization', value: authHeader]]
                        )
                        
                        if (response.status == 200 || response.status == 201) {
                            echo "API call successful!"
                            echo "Response: ${response.content}"
                        } else {
                            error "API call failed with status ${response.status}"
                        }
                    }
                }
            }
        }
    }

    Sample Jenkins pipeline configuration for other functional tests.

    Limitations of the test API

    • Waiting logic will not be taken care of.
    • Re-run scenarios cannot be handled.