
自动化测试,尤其是大规模的自动化测试当中,测试结果的分析是一个非常重要的点。在过往的实践中也是非常吃人力资源的场景,大量的假失败(false failure)会把团队的节奏带下来,甚至最终拖垮团队。笔者也写过《2025第一篇-精准测试等基建的十五种变现场景》等文章,介绍了利用数字化+智能化手段来实现自动化测试执行结果的自动化、智能化分析。
翻了一下今年5月份QECon的ppt,至少有2个案例讲到了这个场景。
案例1
案例2
测试用例的全链路日志收集
熟悉分布式系统的同学对于可观测平台使用traceID来获得全链路日志应该也是不陌生的。
https://microsoft.github.io/code-with-engineering-playbook/observability/microservices/
如上图所示,通过可观测平台,可以将某个Http请求的全链路调用过程还原出来。 以下是笔者找到的一个案例,
来自于 https://blog.csdn.net/jushisi/article/details/106234597
在测试用例执行结果分析的场景下,得到了某次请求的全链路调用日志是不完整的,还需要得到某个测试用例的完整执行日志,也就是需要将该用例的若干次HTTP请求的全链路日志全部都收集起来。
也就是将来自于同一个用例的若干个traceID整合起来作为一组,定义为某个用例的完整执行记录。
搞过精准测试等涉及到流量染色的读者可能已经想到了,一个比较直观的方案是将caseID作为可观测数据的一部分传递到服务端,如上图所示,可以在HTTP客户端指定TraceID格式为 CaseID+UUID。然后在可观测平台中,收集所有带有CaseID前缀的日志记录,作为该用例的服务端日志。
以 JUNIT5 为例,用测试用例的全限定类名#方法名#UUID批次号来作为CaseID,并通过HTTP请求的head透传到服务端。 塞入Head的部分就不介绍了,主要讲一下caseID生成的过程。
public class TestInfoExtension implements BeforeEachCallback,
AfterEachCallback, BeforeAllCallback, AfterAllCallback {
public static final ThreadLocalTEST_INFO_HOLDER = new ThreadLocal();
public static final ThreadLocal BATCH_ID_HOLDER = new ThreadLocal();
public TestInfoExtension() {
}
public void beforeAll(ExtensionContext context) throws Exception {
String batchId = UUID.randomUUID().toString();
BATCH_ID_HOLDER.set(batchId);
}
public void afterAll(ExtensionContext context) throws Exception {
BATCH_ID_HOLDER.remove();
}
public void afterEach(ExtensionContext extensionContext) throws Exception {
TEST_INFO_HOLDER.remove();
}
public void beforeEach(ExtensionContext extensionContext) throws Exception {
String testClassName = extensionContext.getRequiredTestClass().getName()
;
String testMethodName = extensionContext.getRequiredTestMethod().getName()
;
String fullTestName = testClassName +"#" + testMethodName;
TEST_INFO_HOLDER.set(fullTestName);
}
} 通常测试用例会有一个公共的基类,在这个基类里使用@ExtendWith来使用前面写的扩展功能就能实现上述目标了,这个过程对于已有的测试用例来讲是透明的,不需要任何的修改。
@ExtendWith (TestInfoExtension.class)
public class TestBase {
@BeforeEach
public void setup(){
operator = new Operator(baseURL,sysName,logonURL);
log.info( operator.logon(first,firstPW));
operator.setTraceID(TestInfoExtension.TEST_INFO_HOLDER.get()+"#"
+TestInfoExtension.BATCH_ID_HOLDER.get());
}接下来,就是根据traceID到可观测平台上去拉取日志,并提供给用户在测试平台上浏览或者是进一步结合其它数据交由LLM来实现测试结果的智能化分析。