I implemented a solution (in JScript) using the .NET api bindings from the testrail website:
// Note: this functionality depends on 3rd party .NET libraries that needed to be compiled by you. We downloaded the testrail .NET api bindings
// from the testrail website, along with the Json.NET library. Using visual Studio 2010, we built the Gurock.TestRail library, referencing the Newtonsoft.Json
// library. We built x86 and x64 versions using .NET 3.5. In this project, the libraries are stored in a folder next to the project, and have
// already been linked to the project via the CLR bridge.
testrail = {};
// Use these methods for updating test case statuses in TestRail
// Use the methods testrail.passCase, testrail.failCase, testrail.blockedCase, and testrail.retestCase to add case results.
// The methods require the run id and the case id
// A run id in test rail is formatted like 'R4683'. Remove the letter R from the beginning and just supply the integer.
// A case id in test rail is formatted like 'C866870'. Remove the letter C from the beginning and just supply the integer.
//
// Supplying the additionalFields json object is optional. The request fields can be found in the add_result method definition
// of the api at http://docs.gurock.com/testrail-api2/reference-results
// e.g. {comment: '<A comment to be logged in the result record>', version: '<free form version info>'}
testrail.passCase = function(runId, caseId, additionalFields) {
testrail.addStatusAndResultForCase(runId, caseId, additionalFields, 1);
};
testrail.failCase = function(runId, caseId, additionalFields) {
testrail.addStatusAndResultForCase(runId, caseId, additionalFields, 5);
};
testrail.blockedCase = function(runId, caseId, additionalFields) {
testrail.addStatusAndResultForCase(runId, caseId, additionalFields, 2);
};
testrail.retestCase = function(runId, caseId, additionalFields) {
testrail.addStatusAndResultForCase(runId, caseId, additionalFields, 4);
};
testrail.runIdAndCaseIdFromTestId = function(testId) {
test = testrail.getTest(testId);
caseId = test.Item('case_id').Value_2.m_value;
runId = test.Item('run_id').Value_2.m_value;
return {runId: runId, caseId: caseId};
};
// Support functions for the above functions. These do not need to be called directly outside of this file.
testrail.addStatusAndResultForCase = function(runId, caseId, additionalFields, statusId) {
additionalFields = additionalFields || {};
additionalFields.status_id = statusId;
testrail.addResultForCase(runId, caseId, additionalFields);
};
testrail.addResultForCase = function(runId, caseId, additionalFields) {
dataObj = testrail.dataDictonary(additionalFields);
testrail.sendPost("add_result_for_case/" + runId + "/" + caseId, dataObj);
};
testrail.getTest = function(testId) {
result = testrail.sendGet('get_test/' + testId);
return result;
};
testrail.sendPost = function(apiArgsAsString, dataDictionaryObj) {
testrail.apiClient().SendPost(apiArgsAsString, dataDictionaryObj);
};
testrail.sendGet = function(apiArgumentString) {
results = testrail.apiClient().SendGet(apiArgumentString);
return results;
};
testrail.dataDictonary = function(jsonObj) {
var dataD = dotNET.System_Collections.Hashtable.zctor();
for (var key in jsonObj) {
if (jsonObj.hasOwnProperty(key)) {
dataD.Add(key, jsonObj[key]);
}
}
return dataD;
};
testrail.apiClient = function() {
var client = dotNET.Gurock_TestRail.APIClient.zctor("https://testrail.blahblah1234.com/testrail/");
client.User = "bojack.horseman@blahblah1234.com";
client.Password = "api_key_from_your_testrail_instance_instead_of_users_pwd";
return client;
};
//TODO: add error handling
//TODO: implement the add_results api call so we can do a bulk update instead of calling add_result_for_case for each case
Usage:
//USEUNIT TestRail
function testUpdateTestRail() {
testrail.retestCase(4683, 866867);
testrail.passCase(4683, 866868, {version: 'Build 10.0.0.1234'});
testrail.blockedCase(4683, 866869, {comment: 'Blocked due to JIRA-4321'});
testrail.failCase(4683, 866870, {comment: 'Failed. JIRA-5678 logged.', version: 'Build 10.0.0.1234'});
}