Integrating qTest with CI/CD Pipelines: A Practical Decision Guide
Integrate qTest with CI/CD pipelines using Automation Bridge for reliable test result synchronization. Compare REST API vs bridge methods and implement a Jenkins pipeline with authentication and rate limiting handled.
28 Sept 2025, 18:46 UTC

The Decision: Automate Test Reporting to qTest Without Manual Overhead
When automating tests through Jenkins, GitLab CI, or Azure DevOps, the key question is how to reliably push test results into qTest for visibility and traceability.
The constraint is maintaining accurate test run data while handling authentication, rate limits, and environment mapping across multiple CI agents.
Supported Integration Options Compared
| Method | Setup Complexity | Authentication | Real-time Sync | Artifact Upload | Rate Limit Handling |
|---|---|---|---|---|---|
| qTest Automation Bridge | Medium deploy bridge service | API token per bridge | Yes webhook-driven | Built-in | Automatic queuing |
| Direct REST API v2 | High custom scripting | Personal access token | Polling required | Manual upload | Client-side throttling |
| Pre-built Selenium Connector | Low install plugin | Inherits bridge auth | Yes | Limited to logs | Handled by bridge |
Trade-offs to Consider
Automation Bridge is recommended for most teams because it handles token rotation, rate limiting, and artifact staging. It requires a persistent service reachable from both CI agents and the qTest server.
Direct API integration gives maximum control but shifts complexity to pipeline code. You must implement retry logic, token refresh, and batch uploads to avoid rate limits.
The Selenium connector is fastest to implement but ties you to that test framework. It cannot upload arbitrary artifacts like JMeter logs or Postman collections.
Concrete Implementation: Jenkins Pipeline Using Automation Bridge
Prerequisites: qTest Automation Bridge deployed and registered in qTest web console; API token with test run creation scope.
Configure Jenkins credentials to store the qTest token.
pipeline {
agent any
environment {
QTEST_TOKEN = credentials('qtest-api-token')
PROJECT_ID = '12345'
TEST_RUN_NAME = 'Build-${BUILD_NUMBER}-Tests'
}
stages {
stage('Execute Tests') {
steps {
sh '''
python -m pytest tests/ --junitxml=test-results.xml
curl -X POST -H 'X-AUTH-TOKEN: ${QTEST_TOKEN}' -F 'file=@test-results.xml' -F 'name=${TEST_RUN_NAME}' https://qtest.example.com/api/v2/projects/${PROJECT_ID}/test-runs
'''
}
}
}
post {
always {
archiveArtifacts artifacts: 'test-results.xml', allowEmptyArchive: true
}
}
}
Verification commands:
- curl -X GET -H 'X-AUTH-TOKEN: $QTEST_TOKEN' https://qtest.example.com/api/v2/projects/12345/test-runs
- Check qTest web console Test Runs tab for new entry
- Confirm Automation Bridge shows Connected status in qTest console
Validation Checklist
- API token is valid and has required scope
- CI agent can resolve qTest server hostname
- Bridge service shows Connected status in qTest console
- Test environment ID in qTest matches CI agent label
- Rate limit errors absent in bridge logs
Limitations and Next Steps
Test environment configuration must match between CI system and qTest project settings.
Automation Bridge deployment requires network connectivity to qTest server.
Verify your setup by running GET /api/v2/projects/{projectId}/test-cases with your token to confirm read access before attempting write operations.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.