96SEO 2026-06-15 07:13 14
今天我想跟大家聊聊测试的事情。就是写代码嘛,肯定要写测试。如果不写测试,那心里不踏实对吧?但是写测试真的很慢。一个一个跑,跑完这一个跑下一个。如果你有几百个测试用例,那得等到什么时候去? 意味着.… 头发都要掉光了。所以我们要用JUnit5的并行配置。听说能快很多。我试了一下好像是真的。下面我就把我的心得,或者说我的“踩坑”经验,全都写出来。希望能帮到大家,虽然可能帮不到。

现在的软件越来越大了。以前一个项目也就几个类,现在动不动就是几千个类。测试的时候,如果还是像以前那样,一个接一个地跑,那效率太低了。简直就是浪费时间。而且现在大家都在讲“快”,开发要快,测试也要快。所以并行测试就很有必要了。就像以前大家排队买东西,现在搞了个VIP通道,大家一边进去了不就快了吗?JUnit5从5.3版本开始就支持这个功能了。虽然官方文档说能提升3倍,但我感觉也没那么夸张,但至少比以前快一点吧。主要是能早点下班,白嫖。。
有些资料说这是为了适应现代软件开发。我也觉得是。如果不搞并行,测试团队就要累死了。而且有些测试之间没有依赖关系,非要串行跑干嘛?比如测试“登录”和测试“注册”,它们之间没什么关系,完全可以一边跑。这样就省时间了。但是有些测试是有依赖的,这个后面再说。反正,能并行的尽量并行,这是趋势。
要开启并行测试, 第一步不是写代码,也不是写测试方法,而是要找一个文件。这个文件在项目里。具体在哪呢?在resources目录下。对,就是那个resources文件夹。 别纠结... 如果你找不到,去项目结构里看看,或者搜一下junit-platform.properties。这个名字好像不能改,官方规定的。一旦你找到这个文件,恭喜你,成功了一半。
在这个文件里我们要加一些内容。这些内容就是告诉JUnit5:“嘿,别一个一个跑了快点一起跑吧!” 具体加什么呢?我们一步一步来。先别急,胡诌。。
好了现在我们已经打开了那个`junit-platform.properties`文件。 我爱我家。 现在我要把代码贴进去了。大家仔细看哦,下面的代码很重要。
# 是否允许并行施行true/false
junit.jupiter.execution.parallel.enabled=true
看到没?就这么一行。把那个`true`改成`true`。如果你写成`false`,那还是老样子,串行跑。写了`true`,JUnit5就会自动去读其他的配置。这里有个小坑,就是注释符号。有些人喜欢用`//`,但这个文件好像是标准的Java Properties文件格式,所以要用`#`。别搞错了搞错了就报错。报错了别怪我没告诉你。
配置了这个之后你会发现测试运行的速度好像快了一点点。但是可能还不够快。为什么?主要原因是你没有告诉它用多少个线程跑, 我心态崩了。 也没有告诉它怎么分配任务。就像一个工厂,你开了机器,但是没有分配工人,工人就在那闲着。所以还要继续往下配。
接下来我们要配置线程池。这个线程池是干嘛的呢?就是用来装那些跑测试的线程的。 请大家务必... 总不能让线程到处乱跑,乱跑就乱套了。我们得有个池子。
深得我心。 官方文档里提到了几个参数。我们得选一个策略。什么策略呢?有一个叫`FIXED`的,还有一个叫`SAME_THREAD`的。我一般都用`FIXED`。就是固定数量的线程。比如我想开5个线程一边跑。那就这么写:
junit.jupiter.execution.parallel.config.strategy = fixed
junit.jupiter.execution.parallel.config.fixed.parallelism = 5
这里的`5`,你可以改成你自己电脑的CPU核心数。比如你有8核,你就写8。写多了也没用,主要原因是线程切换也要消耗资源。写少了并行效果就不明显了。大概就是这么个意思。
还有一种策略叫`CUSTOM`。这个比较高级,需要自己写一个类去实现某个接口。那个接口叫什么来着?好像是`ParallelExecutionConfigurationStrategy`。这个太复杂了咱们这种写烂文的就不写了。能用`FIXED`就行。反正我试过`FIXED`,挺好用的。
还有一点要注意,就是方法级别的并行。有些人想方法级别并行,有些人想类级别并行。这个在配置文件里也能控制。有个参数叫`junit.jupiter.execution.parallel.config.dynamic.adjust-scheduled`。这个参数好像是为了的。如果你不想管那么多,就用默认的就行。反正能用。
除了在配置文件里配置,JUnit5还提供了一个注解。这个注解就是`@Execution`。它就像一个标签, 话说回来.…. 贴在测试方法或者测试类上,告诉JUnit5:“嘿,这个测试,你特殊一点,你要用并发模式跑!”
小丑竟是我自己。 这个注解有几个值可以选。其中一个叫`ExecutionMode.CONCURRENT`。看到没,就是并发模式。如果你把这个注解贴在一个测试方法上,那这个方法就会在单独的线程里跑。其他的测试方法照样跑。这相当于给某个特定的测试用例开了“VIP通道”。
何苦呢? 但是要注意了。如果你在配置文件里设置了全局并行,那再贴这个注解,可能就没用了或者说会有冲突。这个得自己测试。有些人在StackOverflow上问过这个问题。那个回答说如果在配置文件里设置了注解可能会被覆盖。具体怎么覆盖,我也不太清楚。反正就是要注意优先级的问题。反正我觉得,能用配置文件解决的就别用注解,配置文件比较全局,注解比较局部。
牛逼。 还有一个注解叫`@Order`。这个是用来控制顺序的。如果你既想并行,又想控制顺序,那这个注解就有用了。比如你想让Test A先跑,Test B后跑,即使它们是并行的。那就在上面加`@Order`和`@Order`。这个顺序是按数字大小排的。这个跟并发没关系,但是经常一起用。
刚才提到了顺序。有时候我们非常需要顺序。比如你要先登录,才能查余额。你不能先查余额, 又爱又恨。 再登录。那肯定会报错。这种情况下你不能并行跑。你必须串行跑。
怎么串行跑呢?有两种方法。一种是在测试类上加注解`@TestMethodOrder`。这个注解的意思是按照方法名的字母顺序跑。A在前面B在后面。如果你方法名叫`testA`和`testB`,那A就先跑。如果你叫`testB`和`testA`,那B就先跑。这个方法比较懒,不用自己写数字,不如...。
要我说... 另一种方法更灵活。在测试方法娱乐别加`@TestMethodOrder`和`@Order`。`@TestMethodOrder`指定算法,`@Order`指定数字。比如`@Order`和`@Order`。这个就完全由你自己定了。你想让谁先跑就让谁先跑。这个比字母排序好用。
最后强调一点。 但是如果你用了这两个注解,那并行测试可能就跑不起来了。或者说不推荐并行。主要原因是并行就意味着打乱顺序。如果你强制指定了顺序,那并行就失去了意义。所以要顺序还是要速度,这是个问题。有时候我们为了快,就不管顺序了。有时候为了准,就不管速度了。这就是IT界的悲哀吧。
我在看资料的时候,看到有个词叫`Vintage Engine`。这个是JUnit5里的一个东西。它主要是为了兼容旧版本的JUnit。比如JUnit 4。如果你还在用JUnit 4的代码,想迁移到JUnit 5,那你可能需要用到Vintage引擎,我倾向于...。
这个Vintage引擎也支持并行测试吗?好像也支持。但是配置方式可能不太一样。那个配置文件的名字也不一样。不过现在大家都用JUnit 5了谁还用JUnit 4啊。所以这个Vintage引擎我就不细说了。反正知道有这么个东西就行了。别把它跟Jupiter引擎搞混了。Jupiter是JUnit 5的主力。我们今天讲的都是Jupiter的并行配置,我破防了。。
并行测试还有一个坑,就是ThreadLocal。如果你在测试代码里用了ThreadLocal,而且没有清理干净,那可能会出问题。主要原因是并行测试用的是不同的线程。线程A设置的值,线程B可能读不到。或者线程A的值污染了线程B的值,求锤得锤。。
所以写测试代码的时候,一定要小心ThreadLocal。用完一定要remove。如果你不用ThreadLocal,那就没事。如果你用了那就要多加小心了。 我天... 有些资料说JUnit5会自动清理ThreadLocal。但我没试过。我觉得还是自己清理比较稳妥。毕竟平安第一。
栓Q! 说了这么多, 其实就是想告诉大家,JUnit5并行配置其实不难。只要你会改配置文件,就会用。但是要注意细节。比如文件名不能错,路径不能错,参数名不能错。错一个字母,就跑不起来。
我也试过把配置文件放在别的目录下。后来啊就找不到了。再说说还是乖乖放在resources目录下。那个目录好像是Test Resources Root。反正就是测试资源目录。别放错地方了。
出岔子。 有时候配置好了跑起来并没有想象中那么快。这可能是主要原因是测试本身就很慢,或者你的电脑性能不好。或者是测试之间有隐形的依赖。比如数据库连接没释放,导致后面的测试都挂了。这种情况下并行测试就会报错。所以并行测试不代表一定能快。它只是给你一个机会,让你能一边跑多个测试。至于能不能快,还要看你代码写得怎么样。
还有,有些人喜欢用IDE直接运行测试。这样也可以但是配置文件要生效,有时候需要重新编译一下。或者重启一下IDE。有时候改了配置,没生效,可能是IDE缓存的问题。记得点一下那个“Reload”按钮,起初我以为...。
好啦, 我说了这么多废话,一下就是:
希望我的这些碎碎念能帮到你。如果你还是不会,那可能真的不是我的问题,是你的问题。毕竟我只是个写烂文的。 简单来说... 如果你觉得有用,就点个赞吧。如果你觉得没用,就当没看见。反正我也不会改。就这样吧,我要去写代码了。
为了凑字数,我再写点术语。
纯属忽悠。 ExecutionMode: 施行模式。就是告诉JUnit5,这个测试是并发跑还是串行跑。有CONCURRENT和SEQUENTIAL两种。
Parallelism: 并行度。就是一边跑多少个线程。就像车流,有3车道还是5车道,说白了就是...。
ForkJoinPool: 一个线程池框架。JUnit5默认用这个来跑测试。如果你配置了自定义的线程池,就要用到这个框架。
Resource Root: 资源根目录。就是存放配置文件的地方。通常指resources目录,纯正。。
Test Resources: 测试资源。就是专门给测试用的文件。比如配置文件,比如图片,比如数据,牛逼。。
JUnit Jupiter: JUnit 5的正式名字。以前叫JUnit 5,现在官方叫Jupiter。听起来比较高级。
复盘一下。 Execution Strategy: 施行策略。就是怎么分配任务给线程的策略。有FIXED,有CUSTOM,还有默认的。
踩雷了。 好了术语解释完了。真的完了。我不写了。大家快去写代码吧。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback