1.实现企微消息推送监听接口
package service.listener;
import com.alibaba.fastjson.JSONObject;
import io.restassured.RestAssured;
import io.restassured.response.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.testng.ITestContext;
import org.testng.ITestListener;
import org.testng.ITestResult;
import org.testng.annotations.BeforeClass;
import java.util.Map;
import static io.restassured.RestAssured.given;
import static io.restassured.config.HttpClientConfig.httpClientConfig;
public class QyWechatPushMessage implements ITestListener {
private static final Logger logger = LoggerFactory.getLogger(QyWechatPushMessage .class);
@BeforeClass
public void beforClass() {
RestAssured.config = RestAssured.config().httpClient(httpClientConfig().
setParam("http.connection.timeout", 90000).
setParam("http.connection.request.timeout", 90000).
setParam("http.socket.timeout", 90000).
setParam("http.connection-manager.timeout", 90000));
}
@Override
public void onFinish(ITestContext context) {
int maxFailedTests = 10;
int failedTestCount = 1;
int Passes = context.getPassedTests().size();
int Failures = context.getFailedTests().size();
int Skips = context.getSkippedTests().size();
int Total = Passes + Failures + Skips;
if(Failures!=0){
String failedTestMessage = "";
for (ITestResult failedTest : context.getFailedTests().getAllResults()) {
if (failedTestCount <= maxFailedTests) {
failedTestMessage += failedTest.getThrowable().getMessage()+"\n";
failedTestCount++;
}else {
break;
}
}
if (Failures > maxFailedTests) {
int remainingTests = Failures - maxFailedTests;
failedTestMessage += "更多"+remainingTests+"条失败信息请查看邮件\n";
}
String suiteName = context.getSuite().getName();
if(suiteName == null || suiteName.equals("")){
throw new RuntimeException("XML执行文件中未获取到Suite name的值!");
}
String webhook = context.getCurrentXmlTest().getParameter("webhook");
if(webhook == null || webhook.equals("")){
throw new RuntimeException("XML执行文件中未配置企微机器人webhook地址!");
}
String content = """
<font color="warning">suiteName告警</font>
>执行结果: 本次共执行 Total 个用例,成功<font color="info"> Passes </font>个,失败<font color="warning"> Failures </font>个,跳过<font color="comment"> Skips </font>个
>失败用例问题如下: \n<font color="comment">failedTestMessage</font>"""
.replace("suiteName",suiteName).replace("Total",String.valueOf(Total))
.replace("Passes",String.valueOf(Passes)).replace("Failures",String.valueOf(Failures))
.replace("Skips",String.valueOf(Skips)).replace("failedTestMessage",failedTestMessage);
JSONObject jsonObject1 = new JSONObject();
jsonObject1.put("content",content);
JSONObject jsonObject2 = new JSONObject();
jsonObject2.put("msgtype","markdown");
jsonObject2.put("markdown",jsonObject1);
System.out.println("告警信息:"+jsonObject2.toJSONString());
try {
Response response = given().
when().headers(Map.of("Content-Type", "application/json")).body(jsonObject2.toJSONString()).post(webhook).
then().extract().response();
if ((response.statusCode() == 200) || (response.statusCode() == 302)) {
logger.info("企微推送消息成功");
}else {
logger.error("企微推送消息失败,错误信息为:" + response.asString());
throw new RuntimeException("企微推送消息失败,错误信息为:" + response.asString());
}
}catch (Exception e){
logger.error("企微推送消息失败,错误信息为:" + e.getMessage());
throw new RuntimeException(e);
}
}else {
logger.info("全部测试用例 "+Total+" 条执行成功,无需企微推送告警消息!");
}
}
}
2.在testng xml执行文件中配置监听以及配置期为机器人的地址