聊聊我在家远程办公时折腾测试工具的那些事

何静△
2026-06-22 22:19
阅读 679

^ORD-\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])-[0-35-9]\d{7}$

我当时就惊了,这正则写得比我都严谨,还考虑了月份和日期的边界。 后来,我让智谱清言帮我分析JMeter的报错日志。有一次压测一直报java.net.SocketException: Connection reset,我查了半天没头绪。把日志和配置丢给智谱清言,它一针见血地指出:是因为JMeter的HTTP Request Defaults里没有设置Use KeepAlive,导致高并发下端口被耗尽。我改了一个配置,TPS直接翻了三倍。那一刻,我对AI的偏见稍微放下了一点点。

再说说“AI视频”。最近公司市场部搞事情,非要弄个AI生成的产品介绍视频,还要嵌到我们新搞的测试报告平台里,说是为了让老板看报告的时候“更有沉浸感”。我听完差点把刚喝的冰美式喷屏幕上。这帮搞运营的脑洞真是绝了。 但没办法,需求压下来了。我研究了一下市面上的AI视频工具,最后发现智谱清言的“清影”功能(文生视频/图生视频)效果还算凑合。我用Midjourney生成了几张我们系统架构的抽象概念图,然后丢给清影生成视频。虽然生成的视频里,那些代表微服务的方块偶尔会扭曲变形,甚至有个代表数据库的圆柱体长出了两条腿(当时看到差点笑死),但配上点高大上的BGM,忽悠一下不懂技术的老板还是足够了。这也算是在测试工具链之外,意外解锁的一项新技能吧。

  1. 代码与配置: 展示Playwright的异步测试代码。 展示JMeter Maven插件的配置。 展示用智谱清言辅助写的一段Java数据生成代码。

  2. 总结: 对测试工具的看法:不要为了用工具而用工具。Playwright虽好,但如果你的前端页面本身DOM结构就一塌糊涂,用什么工具都救不了。核心还是架构设计和代码质量。 对AI的看法:作为保守派,我依然坚持核心业务逻辑和架构设计必须自己手写,因为AI不懂我们的业务上下文,不懂那些隐藏在代码注释里的历史包袱。但是,对于正则、脚本、文档、甚至一些视频生成,AI绝对是神器。它不是来取代我们的,是来帮我们早点下班,多撸两把猫的。

字数扩充策略:

  • 在描述Bug和报错时,多写点心理活动和环境描写。
  • 在写代码时,加上详细的注释和配置说明,代码块本身也能占一定篇幅,但要保证代码质量。
  • 在吐槽产品经理和测试时,增加一些对话细节,让人物更丰满。
  • 在谈架构和代码质量时,多输出一些自己的技术理念,比如“代码是写给人看的,只是顺便让机器执行”。

检查约束条件:

  • 人设:坚持手写代码但尝试AI的保守派(满足)
  • 背景:Mac开发,Windows测试,远程办公,关注架构和质量(满足)
  • 主题:我对测试工具的看法(满足)
  • 风格:实战经验分享(满足)
  • 关键词:智谱清言,AI视频(满足)
  • 标题:多样性,不带冒号,长度有长有短。我选“聊聊我在家远程办公时折腾测试工具的那些事”(19字,经验分享型,无冒号)。(满足)
  • 长度:约3852字。需要尽量写长,细节拉满。(需要特别注意字数,尽量多写)
  • 无AI味道,不用首先其次最后。(满足,用口语化过渡)
  • 提到公司文化、deadline等。(满足)
  • 程序员梗、黑话。(满足,如“屎山”、“TPS”、“造轮子”、“背锅”等)
  • 正文不重复标题。(满足)
  • 纯Markdown,无图片。(满足)

开始撰写,随时关注字数。为了确保字数达到3800字以上,我会在每个段落中加入更多的技术细节、心理描写、场景刻画。

段落1:开篇(约500字) 描写居家办公环境,引入人设。MacBook Pro,IDEA,橘猫。交代自己保守派程序员的身份,对代码质量的洁癖,以及对Windows的嫌弃(只在测试时用)。

段落2:背景与痛点(约800字) 上个月底的“核心交易链路重构”项目。deadline压力。产品经理老李和测试小美。JMeter和Selenium的痛点。详细描写Selenium找元素的痛苦,NoSuchElementExceptionThread.sleep的滥用。JMeter跑压测时Mac风扇狂转的场景。远程办公导致沟通成本增加,向日葵远程的卡顿。

段落3:测试工具的反思与改造(约800字) 痛定思痛,改造工具链。引入Playwright替换Selenium。详细对比两者的优劣,强调自动等待机制和跨平台优势。JMeter的改造,引入Maven插件,脚本代码化。和老李的斗智斗勇,关于“动态生成压测数据”的奇葩需求。

段落4:AI辅助的尝试:智谱清言(约800字) 保守派对AI的抵触到接受。公司推行AI赋能。使用智谱清言的经历。正则表达式的生成(详细写出正则和解释)。JMeter报错日志的分析(Connection reset的排查过程)。AI在提效方面的实际感受。

段落5:AI视频的意外插曲(约500字) 市场部要求的AI视频需求。吐槽运营的脑洞。使用智谱清言的“清影”功能生成AI视频的过程。描述生成视频中的奇葩画面(六根手指、变形的微服务方块)。如何用这个视频忽悠老板。

段落6:代码与配置展示(约600字) 展示Playwright的Java异步测试代码。 展示JMeter Maven插件的pom配置。 展示用智谱清言辅助生成的复杂订单号生成Java代码。

段落7:总结与心得(约500字) 对测试工具的最终看法:工具只是手段,架构和代码质量才是核心。 对AI辅助的最终看法:核心逻辑手写,繁琐工作交给AI。AI是帮手不是杀手。 结尾,橘猫醒了,准备继续撸代码。

字数预估: 段1:500 段2:800 段3:800 段4:800 段5:500 段6:600 段7:500 总计:4500字左右。稍微控制一下,保持在3800-4000字之间。

细节打磨:

  • 口语化表达:“说实话”、“讲真”、“这帮搞运营的”、“差点没把我送走”。
  • 程序员梗:“面向StackOverflow编程”、“删库跑路”、“提桶跑路”、“祖传代码”。
  • 具体报错:org.openqa.selenium.NoSuchElementExceptionjava.net.SocketException: Connection reset
  • 代码注释要详细,体现“关注代码质量”的人设。

现在开始输出正文。

下午三点,阳光透过百叶窗正好洒在我的书桌上,我的橘猫“Bug”正四仰八叉地趴在键盘旁边打呼噜。我喝了一口已经不再冰凉的冰美式,揉了揉发酸的眼睛,继续盯着MacBook Pro上IDEA里密密麻麻的代码。

熟悉我的朋友都知道,我是个十足的“保守派”老哥。写了十几年代码,我始终坚信“代码如诗,架构如画”,坚持核心逻辑必须手写,对代码质量有着近乎变态的洁癖。我的主力机永远是MacBook Pro,那台落灰的Windows笔记本只有在我需要测试某些诡异的Windows特有路径问题,或者排查该死的IE兼容性时,才会被我捏着鼻子开机。

最近大环境不太好,公司为了节省开支,推行了全面远程办公。作为一个习惯了在公司摸鱼(划掉)和同事当面交流的老油条,刚开始在家撸代码还真有点不适应。不过作为架构组的老兵,我平时最关注的就是架构设计和代码质量,只要代码在手,哪里都是工位。但最近这半个月,我硬生生被各种测试工具折磨得够呛,加上公司高层最近天天在群里喊“AI赋能”,我也半推半就地开始尝试AI辅助。今天刚好项目刚发版,有点空闲,就来跟大家聊聊我对测试工具的看法,以及这段时间折腾工具链和AI的一些踩坑记录。

那个差点让我砸电脑的月底

事情要从上个月底说起。当时我们组负责的那个“重构核心交易链路”的大项目要上一个大版本,deadline死死地卡在周五晚上12点。产品经理老李天天在钉钉群里发“家人们,进度怎么样了,客户那边催得紧”,而测试组的小美更是化身无情提Bug机器,一天能给我提十几个缺陷。

我们团队原本的测试工具链比较传统:用JMeter做接口和性能压测,用Selenium做UI自动化。讲真,这套组合拳在几年前确实能打,但放在现在这个前端框架日新月异、微服务满天飞的时代,简直就是在屎山上雕花。

先说Selenium。前端那边用了Vue3,为了搞什么动态路由,元素的ID和Class全是动态生成的。Selenium跑UI自动化的时候,动不动就给我报org.openqa.selenium.NoSuchElementException。有一次为了等一个弹窗里的确认按钮加载出来,我在代码里丧心病狂地加了十几个Thread.sleep(2000)。看着那坨丑得令人发指的代码,我当时真的想砸电脑。

再说JMeter。我们的压测脚本最初是测试妹子用GUI界面一点点画出来的,后来导出成jmx文件。好家伙,那XML文件里一堆乱七八糟的配置和硬编码,维护起来简直是灾难。更崩溃的是,上周五晚上加班跑并发压测时,我Mac的CPU直接飙到100%,风扇转得像直升机起飞,烫得都能煎鸡蛋了,而TPS(每秒事务数)却惨不忍睹。

远程办公更是放大了这些痛点。小美在Windows上跑UI自动化,我在Mac上写后端。她截图发我,我根本看不清那些动态ID。只能开向日葵远程连她的Windows,那网络延迟,卡得我鼠标指针都在屏幕上漂移。那一刻,我心态彻底崩了。

痛定思痛:给测试工具链做个“微创手术”

痛定思痛,我决定对现有的测试工具链开刀。作为架构师,我不能眼睁睁看着团队在低效的工具里内耗。

首先开刀的是UI自动化。我力排众议(其实就是在架构评审会上拍了桌子,并保证出了问题我背锅),把Selenium换成了Playwright。为什么选它?因为Playwright原生支持异步,它的自动等待机制简直是神仙!再也不用写那些反人类的Thread.sleep()了,它会自动等待元素可见、可点击。而且它跨平台支持极好,我在Mac上写好的脚本,直接推给小美在Windows上跑,丝滑得让人想哭。

其次是JMeter的改造。JMeter我还是保留了,毕竟团队习惯了Java生态,完全换工具学习成本太高。但我引入了JMeter的Maven插件,把压测脚本代码化、版本化。配合Jenkins做CI/CD,现在每次代码提交,都会自动跑一波基准测试,再也不用手动去点那个绿色的启动按钮了。

这里不得不吐槽一下产品经理老李。在评审压测方案时,他非要加一个“根据用户历史行为动态生成压测数据”的需求。我心想你咋不上天呢?但为了代码的扩展性,我还是捏着鼻子答应了,并决定用数据驱动的方式来搞定这个奇葩需求。

保守派的妥协:当AI开始帮我写正则

说到动态生成压测数据,这就不得不提我最近被迫尝试的AI辅助了。

我这人比较保守,觉得AI写的代码没有灵魂,缺乏对业务架构的深度思考,更不懂我们那些隐藏在代码注释里的历史包袱。但大环境这样,领导天天喊“AI提效”,我不学点新东西,迟早要被那些刚毕业的“AI原生代”卷死。

我开始试用各种AI工具,最后发现“智谱清言”在代码辅助和逻辑分析方面确实有点东西。一开始,我只是让它帮我写写正则表达式。比如老李那个奇葩需求,要匹配一种特殊的订单号格式:ORD-年份(4位)-月份(2位)-日期(2位)-随机数(8位,不能包含4)。我自己写得头晕眼花,丢给智谱清言,它秒回:

^ORD-\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])-[0-35-9]\d{7}$

我当时就惊了,这正则写得比我都严谨,不仅考虑了月份和日期的边界,还用非捕获分组优化了性能。省了我至少半小时掉头发时间。

后来,我尝试让智谱清言帮我分析JMeter的报错日志。有一次压测一直报java.net.SocketException: Connection reset,我查了半天没头绪,怀疑是网络问题。把日志和JMeter配置丢给智谱清言,它一针见血地指出:是因为JMeter的HTTP Request Defaults里没有设置Use KeepAlive,导致高并发下短连接过多,端口被迅速耗尽。我改了一个配置,TPS直接翻了三倍。那一刻,我对AI的偏见稍微放下了一点点,这玩意儿在排查底层网络问题和写套路化代码时,确实是个好帮手。

意外解锁的新技能:用AI视频忽悠老板

再说说“AI视频”。最近短视频和AI生成内容很火,公司市场部搞事情,非要弄个AI生成的产品介绍视频,还要嵌到我们新搞的测试报告平台里,说是为了让老板看报告的时候“更有沉浸感”。我听完差点把刚喝的冰美式喷屏幕上。这帮搞运营的脑洞真是绝了,测试报告平台你搞个视频进去,是想让老板一边看TPS曲线一边看AI跳舞吗?

但没办法,需求压下来了,而且给足了排期。我研究了一下市面上的AI视频工具,最后发现智谱清言的“清影”功能(文生视频/图生视频)效果还算凑合,而且对中文语义的理解非常到位。

我用Midjourney生成了几张我们系统架构的抽象概念图,然后丢给清影生成视频。虽然生成的视频里,那些代表微服务的方块偶尔会扭曲变形,甚至有个代表数据库的圆柱体长出了两条腿(当时看到差点笑死),但配上点高大上的赛博朋克风BGM,忽悠一下不懂技术的老板还是足够了。这也算是在测试工具链之外,意外解锁的一项新技能吧。至少现在市场部那帮人不再天天缠着我给他们做PPT动画了。

核心代码与配置分享

光说不练假把式,下面分享几段我改造后的核心代码和配置,给各位老哥参考参考。

1. Playwright 异步测试代码示例

抛弃了Selenium后,Playwright的代码简直清爽得让人感动。下面是我用Java写的一个登录并校验订单列表的异步测试用例:

import com.microsoft.playwright.*;
import org.testng.annotations.Test;
import static org.testng.Assert.assertTrue;

public class OrderListTest {

    @Test
    public void testOrderListDisplay() {
        // 使用 try-with-resources 自动管理浏览器资源,不用手动 close,防止内存泄漏
        try (Playwright playwright = Playwright.create()) {
            // 使用 Chromium 无头模式,CI/CD 环境下跑得更稳
            Browser browser = playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(true));
            Page page = browser.newPage();

            // 导航到登录页,Playwright 会自动等待页面加载完成
            page.navigate("http://localhost:8080/login");
            
            // 填写表单,再也不用找什么 XPath 了,直接通过 data-testid 定位,前端改样式也不怕
            page.fill("[data-testid='username-input']", "admin");
            page.fill("[data-testid='password-input']", "password123");
            page.click("[data-testid='login-btn']");

            // 自动等待机制:等待订单列表的容器出现,彻底告别 Thread.sleep
            page.waitForSelector("[data-testid='order-list-container']");
            
            // 断言列表至少有一条数据
            int orderCount = page.locator("[data-testid='order-item']").count();
            assertTrue(orderCount > 0, "订单列表不能为空");
            
            System.out.println("测试通过,当前订单数量: " + orderCount);
        }
    }
}

2. JMeter Maven 插件配置

把压测脚本代码化后,我们的 pom.xml 里加了这么一段配置,配合 Jenkins 简直是绝配:

<plugin>
    <groupId>com.lazerycode.jmeter</groupId>
    <artifactId>jmeter-maven-plugin</artifactId>
    <version>3.6.0</version>
    <executions>
        <execution>
            <id>configuration</id>
            <goals>
                <goal>configure</goal>
            </goals>
        </execution>
        <execution>
            <id>performance-tests</id>
            <goals>
                <goal>jmeter</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <!-- 指定 jmx 脚本路径 -->
        <testFilesDirectory>${project.basedir}/src/test/jmeter</testFilesDirectory>
        <!-- 开启结果日志,方便后续用 Allure 生成漂亮报告 -->
        <generateReports>true</generateReports>
        <!-- 覆盖 JMeter 属性,动态调整并发数 -->
        <propertiesUser>
            <threads>50</threads>
            <rampup>10</rampup>
        </propertiesUser>
    </configuration>
</plugin>

3. 智谱清言辅助生成的动态数据构造器

老李要的“根据历史行为动态生成数据”,我用智谱清言辅助写了一个数据工厂类。AI帮我把那些繁琐的随机数生成和边界条件处理得明明白白:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Random;

public class OrderDataFactory {

    private static final Random random = new Random();
    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");

    /**
     * 生成符合老李奇葩要求的订单号
     * 格式:ORD-年份(4位)-月份(2位)-日期(2位)-随机数(8位,不能包含4)
     */
    public static String generateSpecialOrderId() {
        LocalDate today = LocalDate.now();
        String datePart = today.format(formatter);
        
        // 生成8位不包含4的随机数
        StringBuilder randomPart = new StringBuilder();
        for (int i = 0; i < 8; i++) {
            int num;
            do {
                num = random.nextInt(10);
            } while (num == 4); // 坚决不要4,老李说他不吉利
            randomPart.append(num);
        }
        
        return String.format("ORD-%s-%s", datePart, randomPart.toString());
    }
}

总结与心得:工具只是手段,质量才是王道

折腾了这大半个月,项目终于平稳上线了。看着监控大盘上平稳的TPS曲线和极低的错误率,我长长地舒了一口气,顺手给旁边的“Bug”开了个罐头。

经过这次折腾,我对测试工具的看法也更加清晰了。很多团队容易陷入一个误区,就是盲目追求最新、最炫酷的测试工具,觉得用了Playwright、Cypress就能解决所有质量问题。但讲真,工具只是手段,如果你的前端页面本身DOM结构就一塌糊涂,如果你的后端接口设计得毫无幂等性可言,用什么神仙工具都救不了你。核心永远是架构设计和代码质量。代码是写给人看的,只是顺便让机器执行,测试工具也是为了让人更好地验证代码,而不是为了增加维护负担。

至于AI辅助,作为一个坚守手写代码的保守派,我现在的态度是:核心业务逻辑和架构设计必须自己手写,因为AI不懂我们的业务上下文,不懂那些为了兼容老系统而留下的“祖传逻辑”。但是,对于正则表达式、测试脚本、数据构造、甚至像生成汇报视频这种繁琐的、重复的、套路化的工作,交给AI绝对是明智之举。

AI不是来抢我们饭碗的,它是来帮我们早点下班的。自从用了智谱清言和Playwright,我现在的下班时间硬生生提前了一个小时。多出来的时间,我可以在家多撸两把猫,或者研究一下新的架构模式,这不比在屎山里找Bug香吗?

好了,不说了,“Bug”把罐头吃完了,正用爪子扒拉我的鼠标垫呢。我得继续去重构那个该死的支付回调接口了。各位老哥,咱们代码里见!

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝