jira

// 使用try-with-resources改进响应处理
public void updateTestExecutionWithEnhancedErrorHandling(String testExecutionId, String testKey, String result) throws Exception {
String apiUrl = JIRA_BASE_URL + "/rest/atm/1.0/testrun/" + testExecutionId + "/testcase";

    String jsonPayload = String.format(
        "{\"testCaseKey\":\"%s\",\"status\":\"%s\"}",
        testKey,
        convertResultToJiraStatus(result)
    );
    
    CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
    credentialsProvider.setCredentials(
        new AuthScope(null, -1),
        new UsernamePasswordCredentials(USERNAME, API_TOKEN.toCharArray())
    );
    
    try (CloseableHttpClient httpClient = HttpClients.custom()
            .setDefaultCredentialsProvider(credentialsProvider)
            .build()) {
        
        HttpPut httpPut = new HttpPut(URI.create(apiUrl));
        httpPut.setHeader("Content-Type", "application/json");
        httpPut.setHeader("Accept", "application/json");
        httpPut.setEntity(new StringEntity(jsonPayload));
        
        // 使用execute方法并传入响应处理器
        httpClient.execute(httpPut, response -> {
            int statusCode = response.getCode();
            
            try {
                String responseBody = EntityUtils.toString(response.getEntity());
                
                if (statusCode == 200) {
                    System.out.println("Test Execution updated successfully!");
                    System.out.println("Response: " + responseBody);
                    return null;
                } else {
                    System.err.println("Failed to update Test Execution. Status code: " + statusCode);
                    System.err.println("Error response: " + responseBody);
                    throw new RuntimeException("Jira API error: " + statusCode);
                }
            } finally {
                // 确保响应实体被完全消耗
                EntityUtils.consume(response.getEntity());
            }
        });
    }
}

public static void main(String[] args) {
    JiraTestExecutionUpdaterV5 updater = new JiraTestExecutionUpdaterV5();
    try {
        // 示例:更新Test Execution TEST-123,关联Test Key TEST-456,结果为success
        updater.updateTestExecution("TEST-123", "TEST-456", "success");
        
        // 或者使用增强错误处理版本
        // updater.updateTestExecutionWithEnhancedErrorHandling("TEST-123", "TEST-456", "success");
        
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}
HttpClient 5与HttpClient 4的主要区别:
包名变化:

org.apache.hc.client5 替代 org.apache.http
org.apache.hc.core5 替代 org.apache.http
API变化:

HttpResponse 变为 ClassicHttpResponse
getStatusLine().getStatusCode() 简化为 getCode()
凭证设置使用字符数组 toCharArray()
URI处理:

推荐使用 URI.create() 而不是直接字符串
响应处理:

提供了更简洁的 execute 方法,可以传入响应处理器
推荐使用 EntityUtils.consume() 确保资源释放
Maven依赖:

org.apache.httpcomponents.client5 httpclient5 5.2.1 改进建议: 添加配置类:将URL、凭据等移动到配置文件 添加日志记录:使用SLF4J代替System.out 添加重试机制:对于网络错误可以自动重试 支持多种结果状态:根据你的测试框架扩展状态映射 需要我进一步优化任何部分吗?

CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope(null, -1),
new UsernamePasswordCredentials(USERNAME, API_TOKEN.toCharArray())
);是不是应该改成BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(
new AuthScope(null, -1),
new UsernamePasswordCredentials(USERNAME, API_TOKEN.toCharArray())
);

AI-4o mini
从代码功能角度来看,这两段代码是完全等价的,都不需要修改。

让我详细解释一下:

代码分析
原始代码:
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
建议修改的代码:
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
关键区别
声明类型不同:

原始代码使用接口类型 CredentialsProvider 声明变量
建议代码使用具体实现类 BasicCredentialsProvider 声明变量
但这只是声明类型的区别,实际创建的实例都是 BasicCredentialsProvider 类型

为什么说它们是等价的?
功能相同:两种方式都会创建一个 BasicCredentialsProvider 实例
方法调用相同:无论哪种声明方式,都可以调用 setCredentials() 方法,因为该方法是从 CredentialsProvider 接口继承的
后续使用相同:在 credentialsProvider.setCredentials() 调用中,两种方式表现完全一致
哪种方式更好?
这其实是一个编程风格和设计原则的问题:

使用 CredentialsProvider(接口类型)的优点:
CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
更好的抽象:代码依赖接口而非具体实现
更容易切换实现:如果需要更换凭证提供者类型,只需修改实例化部分
符合面向接口编程原则
使用 BasicCredentialsProvider(具体类型)的优点:
BasicCredentialsProvider credentialsProvider = new BasicCredentialsProvider();
更明确的类型信息:直接表明使用的是基本凭证提供者
可以访问具体类特有的方法(如果有的话)
建议
保持原代码不变,原因:

当前代码遵循了良好的面向对象设计原则
没有功能上的问题需要修复
使用接口类型提供了更好的灵活性和可维护性
只有当您需要调用 BasicCredentialsProvider 特有的方法(查看源码确认是否有)时,才需要考虑更改为具体类型声明。否则,当前代码是最佳实

posted @ 2026-01-14 16:24  糖果粒  阅读(3)  评论(0)    收藏  举报