目录
一. 现状·问题
针对现如今高并发场景的业务系统,“并发问题” 终归是必不可少的一类(占比接近10%),每次出现问题和事故后,需要耗费大量人力成本排查分析并修复。那如果能在事前尽可能避免岂不是很香?

二. 分析原因
- 当前并发测试多数依赖测试人员进行脚本测试,同时还依赖了研发和产品识别出并发操作的场景用例。
- 对于并发测试,大概两条路子:
- 所有修改同样数据的命令式接口都测一遍?【耗费巨大测试成本】
- 保证黄金流程的接口,研发从头扒代码。【可能会遗漏,耗费一定研发成本】
🤔自我反思
- 作为研发,是不是在刚开发接口时候,识别到并发场景随着单元测试阶段同时进行并发测试,这样的成本是最小的,收益是最高效的!
三. 采取措施
并发测试前置
采用CI持续集成机制,依靠行云流水线,底层利用junit5单元测试框架并发parallel引擎,嵌入同步数据库的自定义unit test脚本,将每个并发case维护成单元测试,数据自我闭环,可重复执行!
将核心的并发场景进行及时的运行验证,最早洞察,最早验证,最小成本,最大保障!

四. 实践步骤
前提:配置junit-platform.properties
# src/test/resources/junit-platform.properties
junit.jupiter.execution.parallel.enabled=true
junit.jupiter.execution.parallel.config.strategy=fixed
junit.jupiter.execution.parallel.config.fixed.parallelism=20
单接口并发-@RepeatedTest
- ManualCheckAppConcurrentTest 出库复核并发测试「单接口并发」-> 手动复核 10个线程
👉 核心代码块
public class ManualCheckAppConcurrentTest extends ConcurrentTest {
@Resource
ManualCheckAppService manualCheckAppService;
//记录执行成功的线程数
static int successThreadCount = 0;
///////////////////////////////////////////////////////////////////////////
// 单接口并发
///////////////////////////////////////////////////////////////////////////
@DisplayName("(单接口并发)并发测试【手动确认复核】")
@Description("(10个线程)场景:复核1件,一共5件,应该有5个线程成功,5个线程失败:没有查询到容器明细记录" +
"使用友好式分布式锁防止并发,并发后等待重试,保证顺序执行无异常!")
@Execution(CONCURRENT)
@RepeatedTest(value = 10, name = "{displayName}:{totalRepetitions}-{currentRepetition}")
public void testConfirmChecked(TestInfo testInfo) {
manualCheckAppService.confirmChecked(mockConfirmCheckedDto());
successThreadCount++;
}
/**
* 断言最终结果:数据无问题,线程执行无问题
*/
@AfterAll
public static void assertResult() {
//线程执行成功数期望:一共5件,每个线程复核1件,共有5个线程成功
Assertions.assertEquals(5, successThreadCount);
//数据成功期望:没有待复核的容器明细了,因为都复核成功了,一共5件
ConfirmCheckedDto confirmCheckedDto = mockConfirmCheckedDto();
List<ContainerDetailPo> co

本文探讨了在高并发场景中,通过CI持续集成和单元测试(如junit5)实现并发测试前置,降低测试成本,提升需求交付效率。文章介绍了实践步骤,如配置并发测试用例和数据准备,以及并发测试带来的效能提升,包括测试周期缩短、人力成本降低和问题发生概率下降。
最低0.47元/天 解锁文章
858

被折叠的 条评论
为什么被折叠?



