# gemini在自动化测试中的潜力


昨天 google 发布了全新的 ai 模型 gemini，在视频里 google 演示了 gemini 近乎神奇的实时反馈能力，比如测试人员画一只鸭子，ai 可以立即识别，以及后面的一些互动小游戏中，gemini 展示出了出人意料的精准度和推理能力，这是令我印象最为深刻的多模态模型的实时演示了。

珠玉在前，gpt4 的文本类型的推理能力已经到达了一个相对可用的状态，基于该能力，我们也看到了一些比较有意思的自动化类型的项目，比如通过简化 html 输入大语言模型，让大语言模型去推断用户想要进行的操作，最终调用浏览器 api 进行自动化操作的项目，以及利用 llm 的解释器能力，一步一步推理并进行浏览器操作的项目，这些项目都非常有创意，也有一定的实用性，但是缺乏完善的多模态支持总让人觉得想象空间可能没有变得非常广阔。gemini 的出现，强大的推理能力，代码生成能力以及多模态能力的结合，也许会为自动化测试领域带来翻天覆地的变化。

### UI 自动化

这是难度最高的自动化测试类型，比如浏览器和 app 的自动化，尽管概念出现的非常早，而且也发展了相当长的一段时间，但是 ui 自动化的普及度却相对来说不算太高，在资源和时间有限的情况下，ui 自动化测试往往是被大家优先降本增效的不二选择。

类型 gemini 的大语言模型的出现，可能会给 ui 自动化带来革命性的变化。今后，我们可以直接向 ai 输入一些描述相对明确的测试用例，当然，是用自然语言编写的，ai 可以推断出我们的测试意图，还原测试步骤，最终将测试步骤转化成测试代码，自动运行，通过运行中提供的截图和代码报错信息自动分析结果，自动迭代和修正代码错误，直到输出最终代码，基本上 ui 自动化是可以完美闭环的。

也就是说也许不久之后我们只需要写好手工测试用例就可以完成相对完美的自动化测试工作了，以后的测试人员可能不再需要每个用例都去执行一遍，执行的工作应该可以被 ai 和机器替代绝大部分。

顺便再考虑一下测试用例，如果 ai 的推断能力足够强的话，ai 应该可以写出大部分的测试用例，这时候测试人员只需要补充一些极端场景的用例就可以了。

那测试用例是从哪里来呢？可能是从产品文档里分析出来的，同样，如果模型精通多模态和推断的话，那么产品文档和产品设计图也是可以用 ai 去生成一大部分的，人工只要负责查缺补漏和提出修改意见就好了。同理，代码的话 ai 也能写个大部分，也许今后我们的工作方式会发生巨大的转变，从单纯的跟人合作变成跟人和 ai 一起协作，通用知识和能力将变得廉价，垂类的信息和领域知识可能会越来越值钱。

### 接口自动化

接口自动化可能不太需要多模态，基于模型的推理和生成能力，如果模型支持海量的上下文输入的话，那么我们是完全可以为接口自动化的用例定义规则，并教会模型如何应用这些规则生成测试用例。

举个例子，如果我们 curd 的接口遵循 restful 规则的话，ai 是完全有能力生成 restful 接口的测试用例的，毕竟 restful 的规则比较清晰，而且对于具体资源来说接口和用例的数量都是可以枚举的。

因此对于一些相对简单的接口，用 ai 去编写用例从直觉上来说是可行的，不过对于复杂接口，比如一些接口有很繁杂的前置依赖和操作步骤，ai 自动根据接口文档的话可能不太好去推断各种具体场景，这种情况下我们可能需要一种接近自然语言的简化版中间语言，这种语言描述一些接口的输入输出以及构造复杂的接口测试场景，ai 根据这种 DSL 去生成代码的话可能效率和准确性都要更高一点。

因为这种简化语言的 dsl 也是有章法的，所有我们还可以用自然语言去描述接口测试的场景和出入参，让 ai 去帮助我们生成这种中间的 dsl，通过 llm 的调用链的方式完成整体的接口自动化工作。

### 单元测试

与前面两种测试类型相比，单元测试应该是相对容易落地的。之前看过有人做 TDD,让 ai 去生成测试用例，然后根据用例去生成代码，这就是一种非常好的实践方式。从理论上和情感上说，我觉得以后的开发工作应该都是人与 ai 进行 TDD 的方式进行的。开发者拆分需求，设计数据结构，抽象表示形式，提取代码流程，然后要求 ai 生成单元测试用例，之后根据经验和场景，人工增加一些用例，让 ai 去实现可以通过测试的代码，然后重复上面的过程，直到代码最终完成，这时候我们可能得到结构良好和测试充分的代码了。

### 数据生成

测试数据的生成往往是难度高而且费时费力的事情，但很多时候我们需要在测试环境和预发布环境构造大量的看上去很真实的测试数据。因为我们可能大部分的数据都是存在数据库里，插入数据的过程往往也可以用 sql 来表示，所以理论上应该是可以用 ai 去生成大量的测试数据的，毕竟现在的大语言模型在文本生成和代码生成上能力都相对可用。我想了一下，下面的两种方式应该是可行的。

- 导出线上数据并进行脱敏。先导出一份数据，然后告诉 ai 脱敏规则，比如姓名，邮箱等，让 ai 自己推断如何进行敏感信息的替换，甚至可以让 ai 去判断哪些字段是敏感的，并且让 ai 去代码搜索数据的约束条件，比如银行卡的余额必须为正之类的信息，后面的脱敏工作让 ai 自己完成，反复进行多次之后应该可以得到一份相对可用的测试数据；
- 从零开始生成，让 ai 自己判断每个字段的意图，然后让 ai 去搜索代码里的约束规则，先让 ai 生成一份每个字段的生成规则，比如 email 字段就要生成符合条件的邮箱，然后人工抽查一下规则的可用性，如果没问题了就进行多轮生成，最后应该可以选择出几份可用的数据集。

### 总结

应该可以预见，在不久的将来，在算力和资源允许的情况下，自动化测试这个领域将迎来颠覆式的创新。不过作为普通测试人员也不用过度担心，首先我们大部分人可能也不会做自动化测试，那时候 ai 对我们来说可能是补充，而不是平替；其次如果 ai 的运行成本和运行效率比人类要高的话，大面积的替换也不会马上发生。

不过 ai 还是未来了，在今后的某一天，ai 很可能比绝大多数人都要稳定和便宜，到时候我们将何去何从？我还没想好，也许整个社会都还没有准备好吧。

因为资本和人才的涌入，我猜，这一天也许会很快到来。

