Page History
...
Info | ||
---|---|---|
| ||
The following scripts are provided as-is, no warranties attached. Use these scripts carefully. Please feel free to adapt them to your needs. Note: We don't provide support for ScriptRunner; if you have doubts concerning its usage, please contact ScriptRunner's support. |
Table of Contents |
---|
Create a Test Set or a Test Plan
Sometimes you may need to create a Test Set or a Test Plan programmatically.
The following example shows how to create a Test Plan or a Test Set based on setting the value for specific Xray custom fields.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.link.IssueLinkType
import com.atlassian.jira.issue.link.IssueLinkTypeManager
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.jql.builder.JqlQueryBuilder
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.user.util.UserManager;
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.web.bean.PagerFilter;
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.user.UserPropertyManager
import com.atlassian.jira.propertyset.JiraPropertySetFactory;
import com.google.common.collect.ImmutableMap;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.module.propertyset.PropertySetManager;
import com.atlassian.jira.util.BuildUtils
import com.atlassian.jira.util.BuildUtilsInfo
import com.atlassian.jira.util.BuildUtilsInfoImpl
import com.atlassian.plugin.PluginAccessor
import com.atlassian.plugin.PluginManager
import com.atlassian.jira.bc.license.JiraLicenseService
import com.atlassian.jira.bc.license.JiraLicenseServiceImpl
import org.apache.log4j.Level
import org.apache.log4j.Logger
import com.atlassian.jira.issue.IssueManager
import org.ofbiz.core.entity.GenericValue
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.event.type.EventDispatchOption
import groovy.json.JsonOutput
import groovy.transform.BaseScript
import groovy.json.JsonSlurper;
import groovy.json.StreamingJsonBuilder;
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.util.ImportUtils
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.bc.issue.IssueService.CreateValidationResult
import com.atlassian.jira.bc.issue.IssueService.IssueResult
import com.atlassian.jira.user.ApplicationUser
Logger.getLogger("com.onresolve").setLevel(Level.DEBUG)
// creates a Sub Test Execution from a requirement issue, with all linked Tests
projectManager = ComponentAccessor.getProjectManager()
componentManager = ComponentManager.getInstance()
issueManager = ComponentAccessor.getIssueManager()
def issueFactory = ComponentAccessor.getIssueFactory()
issueService = ComponentAccessor.issueService
searchService = ComponentAccessor.getComponent(SearchService.class);
serviceAccount = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
customFieldManager = ComponentAccessor.getCustomFieldManager()
def subTaskManager = ComponentAccessor.getSubTaskManager()
issueService = ComponentAccessor.getIssueService()
def user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser()
Object getIssues(jqlQuery){
// A list of GenericValues representing issues
List<Issue> searchResults = null;
SearchService.ParseResult parseResult = searchService.parseQuery(serviceAccount, jqlQuery);
if (parseResult.isValid()) {
// throws SearchException
SearchResults results = searchService.search(serviceAccount, parseResult.getQuery(), PagerFilter.getUnlimitedFilter());
searchResults = results.getIssues();
return searchResults;
}
return []
}
Object getFieldValueByName(issue,customField) {
def cField = customFieldManager.getCustomFieldObjectByName(customField)
def cFieldValue = issue.getCustomFieldValue(cField)
return cFieldValue
}
Object setFieldValueByName(issue,customField,value) {
def cField = customFieldManager.getCustomFieldObjectByName(customField)
issue.setCustomFieldValue(cField,*value)
}
Object setFieldValueByNameInParameters(inputParameters,customFieldName,value) {
def customField = customFieldManager.getCustomFieldObjectByName(customFieldName)
inputParameters.addCustomFieldValue(customField.id, value)
}
def project = projectManager.getProjectObjByKey("CALC")
def newIssueType = ComponentAccessor.issueTypeSchemeManager.getIssueTypesForProject(project).find { it.name == "Test Plan" }
def newIssue
def issueInputParameters = issueService.newIssueInputParameters()
issueInputParameters.with {
projectId = project.id
summary = "Issue created from script"
issueTypeId = newIssueType.id
reporterId = user.name
}
def jql = "project = ${project.key} and issuetype = Test and component = UI"
def issues = getIssues(jql)
def arr = issues.collect{ it.key }
log.debug("testKeys: "+arr)
testKeys=arr.toArray(new String[arr.size()])
// Tests association with a Test Execution: setting it through the CF is currently not possible due to bug XRAY-2010
//setFieldValueByNameInParameters(issueInputParameters,"Tests association with a Test Set",testKeys)
setFieldValueByNameInParameters(issueInputParameters,"Tests associated with a Test Plan",testKeys)
appUser = user.getDirectoryUser()
CreateValidationResult createValidationResult = issueService.validateCreate(user, issueInputParameters)
if (!createValidationResult.isValid()) {
log.error "Error validating new issue"+createValidationResult.getErrorCollection()
} else {
IssueResult createResult = issueService.create(user, createValidationResult)
newIssue = createResult.issue
log.debug(newIssue.key)
} |
Create a Test Execution
Sometimes you may need to create a Test Execution programmatically.
Currently there is a limitation to associate the Tests by custom field. Thus, a possible workaround using Xray's REST API is shown in the following example.
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
import com.atlassian.jira.issue.Issue
import com.atlassian.jira.issue.link.IssueLinkManager
import com.atlassian.jira.issue.link.IssueLinkType
import com.atlassian.jira.issue.link.IssueLinkTypeManager
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.component.ComponentAccessor
import com.atlassian.jira.jql.builder.JqlQueryBuilder
import com.atlassian.jira.user.util.UserUtil
import com.atlassian.jira.user.util.UserManager;
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.bc.issue.search.SearchService
import com.atlassian.jira.issue.search.SearchProvider
import com.atlassian.jira.issue.search.SearchResults
import com.atlassian.jira.web.bean.PagerFilter;
import com.atlassian.jira.issue.MutableIssue
import com.atlassian.jira.user.UserPropertyManager
import com.atlassian.jira.propertyset.JiraPropertySetFactory;
import com.google.common.collect.ImmutableMap;
import com.opensymphony.module.propertyset.PropertySet;
import com.opensymphony.module.propertyset.PropertySetManager;
import com.atlassian.jira.util.BuildUtils
import com.atlassian.jira.util.BuildUtilsInfo
import com.atlassian.jira.util.BuildUtilsInfoImpl
import com.atlassian.plugin.PluginAccessor
import com.atlassian.plugin.PluginManager
import com.atlassian.jira.bc.license.JiraLicenseService
import com.atlassian.jira.bc.license.JiraLicenseServiceImpl
import org.apache.log4j.Level
import org.apache.log4j.Logger
import com.atlassian.jira.issue.IssueManager
import org.ofbiz.core.entity.GenericValue
import com.atlassian.jira.ComponentManager
import com.atlassian.jira.event.type.EventDispatchOption
import groovy.json.JsonOutput
import groovy.transform.BaseScript
import groovy.json.JsonSlurper;
import groovy.json.StreamingJsonBuilder;
import javax.ws.rs.core.MultivaluedMap
import javax.ws.rs.core.Response
import com.atlassian.jira.issue.index.IssueIndexingService
import com.atlassian.jira.util.ImportUtils
import com.atlassian.jira.bc.issue.IssueService
import com.atlassian.jira.bc.issue.IssueService.CreateValidationResult
import com.atlassian.jira.bc.issue.IssueService.IssueResult
import com.atlassian.jira.user.ApplicationUser
Logger.getLogger("com.onresolve").setLevel(Level.DEBUG)
projectManager = ComponentAccessor.getProjectManager()
componentManager = ComponentManager.getInstance()
issueManager = ComponentAccessor.getIssueManager()
def issueFactory = ComponentAccessor.getIssueFactory()
issueService = ComponentAccessor.issueService
searchService = ComponentAccessor.getComponent(SearchService.class);
serviceAccount = ComponentAccessor.getJiraAuthenticationContext().getLoggedInUser()
customFieldManager = ComponentAccessor.getCustomFieldManager()
def subTaskManager = ComponentAccessor.getSubTaskManager()
issueService = ComponentAccessor.getIssueService()
def user = ComponentAccessor.jiraAuthenticationContext.getLoggedInUser()
Object getIssues(jqlQuery){
// A list of GenericValues representing issues
List<Issue> searchResults = null;
SearchService.ParseResult parseResult = searchService.parseQuery(serviceAccount, jqlQuery);
if (parseResult.isValid()) {
// throws SearchException
SearchResults results = searchService.search(serviceAccount, parseResult.getQuery(), PagerFilter.getUnlimitedFilter());
searchResults = results.getIssues();
return searchResults;
}
return []
}
Object getFieldValueByName(issue,customField) {
def cField = customFieldManager.getCustomFieldObjectByName(customField)
def cFieldValue = issue.getCustomFieldValue(cField)
return cFieldValue
}
Object setFieldValueByName(issue,customField,value) {
def cField = customFieldManager.getCustomFieldObjectByName(customField)
issue.setCustomFieldValue(cField,*value)
}
Object setFieldValueByNameInParameters(inputParameters,customFieldName,value) {
def customField = customFieldManager.getCustomFieldObjectByName(customFieldName)
inputParameters.addCustomFieldValue(customField.id, value)
}
def project = projectManager.getProjectObjByKey("CALC")
def newIssueType = ComponentAccessor.issueTypeSchemeManager.getIssueTypesForProject(project).find { it.name == "Test Execution" }
def newIssue
def issueInputParameters = issueService.newIssueInputParameters()
issueInputParameters.with {
projectId = project.id
summary = "Issue created from script"
issueTypeId = newIssueType.id
reporterId = user.name
}
def jql = "project = ${project.key} and issuetype = Test and component = UI"
def issues = getIssues(jql)
def testKeys = issues.collect{ it.key }
appUser = user.getDirectoryUser()
CreateValidationResult createValidationResult = issueService.validateCreate(user, issueInputParameters)
if (!createValidationResult.isValid()) {
log.error "Error validating new issue"+createValidationResult.getErrorCollection()
} else {
IssueResult createResult = issueService.create(user, createValidationResult)
newIssue = createResult.issue
log.debug(newIssue.key)
associateTestsToTestExecution(newIssue.key, testKeys)
} |
Validate requirement upon making a transition
...