Add test results to change requests using test API
Summarize
Summary of Add test results to change requests using test API
This capability allows ServiceNow customers to add test results directly to DevOps change requests using theDevOps - POST /devops/tool/{capability}API. It supports all test types across various orchestration tools integrated with DevOps Change Velocity. This integration enables you to automatically capture and associate test outcomes such as performance, functional, and unit tests with your change requests, improving traceability and visibility into deployment quality.
Show less
Prerequisites
- You must have the sndevops.admin role to use the API.
- Ensure the test type you want to report is configured and mapped in DevOps Change Velocity under Test types and Test type mappings.
- The orchestration tool (e.g., Azure DevOps, GitHub, Jenkins) must be connected and configured in DevOps Change Velocity.
Using the API with Orchestration Tools
The API endpoint format is:
/api/sndevops/v1/devops/tool/test?toolId=<devopsToolID>&testType=<testtype>
Here, toolId corresponds to the configured tool in DevOps Change Velocity, and testType must be a mapped test type.
Azure DevOps
- Test results are posted using JSON payloads tailored to the test type (performance, functional/unit tests).
- Example parameters include metrics like duration, throughput, passed/failed tests, and timestamps.
- Sample YAML pipeline steps demonstrate how to invoke the POST API task with necessary authentication.
GitHub Actions
- Use shell scripts within GitHub workflows to call the API with JSON body including test summaries.
- Authentication uses base64 encoded credentials of
devops.integration.user. - Separate pipeline samples are provided for performance tests and other test types like smoke tests.
Jenkins
- Jenkins pipelines utilize scripted Groovy steps to construct and send the JSON payload to the API.
- Authentication is done via base64 encoded credentials in HTTP headers.
- Example pipelines cover both performance test reports and functional/unit test summaries.
Key Outcomes
- Test results are automatically attached to DevOps change requests in your ServiceNow instance, enhancing change visibility and quality tracking.
- Supports multiple test types and orchestration tools, providing flexibility across your CI/CD pipelines.
- Enables integration of detailed test metrics such as test durations, pass/fail counts, throughput, and timing percentiles.
Limitations
- The API does not handle waiting logic for test completion.
- It cannot manage re-run test scenarios automatically.
By following the configurations and sample pipeline scripts, ServiceNow customers can efficiently integrate and report test results into change requests, streamlining DevOps workflows and improving release quality assurance.
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.
- Navigate to .
You can also use the classic UI navigation .
- Verify if the test type is available in the Test types table.
- For custom test types, select New and add the test type to the list.
- In the Test type field, enter a name for your test type.
- From the Test category list, select the category of your test type.
- Select Save.
- Navigate to .
You can also use the classic UI navigation .
- Verify if the test type is mapped to your orchestration tool.
- If the mapping is not available, then select New and create the mapping.
- From the Test type list, select the test type that you want to map.
- From the Tool integration list, select your orchestration tool.
- Select Save.
Azure DevOps
For Azure DevOps pipelines, use the format given here to add test results to change requests for various test types.
/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.
- username: devops.integration.user
- password: <devops.integration.user password>
Pipeline configuration for performance tests
{
"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"
}Performance test summary in your Now instance:
Test summary attached to your DevOps change request:
Pipeline configuration for other functional and unit tests
{
"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"
}Test summary attached to your DevOps change request:
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'
Release pipeline
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
Pipeline configuration for other functional and unit tests
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
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
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}"
}
}
}
}
}
}Pipeline configuration for other functional and unit tests
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}"
}
}
}
}
}
}Limitations of the test API
- Waiting logic will not be taken care of.
- Re-run scenarios cannot be handled.