通用技术 【测试左移】我在 Review 代码,我在 Review 什么?

罗汉 · 2022年07月09日 · 最后由 徐汪成 回复于 2022年07月20日 · 9481 次阅读

一、背景

现在很流行谈测试左移,按我个人浅显的理解,测试同学的工作越往开发同学靠,越能体现 “左” 的概念,这里强调的理念是测试与开发工作保持高度统一,他们不分你我,互相有足够的信任和共同的目标,并发挥他们各自的价值。
Code Review,是测试左移的手段之一,通过 Review 代码,提前发现软件的潜在风险。

二、Review 代码前的准备

Review 代码前做充分的准备,如何开展?(供参考)

1、角色定位

设置自己是开发团队的新人,找一个开发哥当自己的导师,新人就会看很多开发文档,包括新人指南、业务介绍、技术文章等。这个过程要求我们熟悉业务、熟悉开发工作模式和流程

2、搭建开发环境

不管是客户端,服务端还是其他,都有开发对应的语言和代码编辑环境,如 AndroidStudio、IntelliJ IDEA、GoLand

3、熟悉代码编辑工具

查看 Git Log、切换分支、模糊查找、查找方法,高阶一些是编译和调试

4、熟悉语言的基础语法

这里说的熟悉,倒不是说熟悉到会写,我个人认为语法是帮助我们理清代码逻辑,关注代码整体是要做什么,有哪些可能的输入和输出、方法内部有哪些判断条件。这些了解基础的语法就能胜任

5、熟悉编码/语言规范

通用的编码/语言规范,提高代码可读性、可理解性,同时,也能约束开发遵循规范

三、Review 代码,Review 什么?

前期的所有准备都是值得的,也许过了一周、二周,甚至一个月,就算过了几个月也没关系,测试同学在为业务赋能的道路上一天天在进步,下面我结合自身经验,通过一些实际碰到过的案例,跟大家一起 Review 代码,如下:

1、Go 语言结构体定义错误

type AppPublisher struct {
    Name    string `json:"name"`
    Pkgname string `json:"pkgname"`
    Version string `json:"pkgname"`
}

Go 语言定义的结构体,可能我们并不熟悉这里的语法,但即使这样,也不影响我们发现它的错误,即第四行应定义为 Version string json:"version",这么基础的定义为什么会犯错呢?这里可能跟开发编码的习惯有关,经常编码的人都知道,Command+D 复制当前行到下一行,所以这里猜测是复制了第三行代码到的第四行,导致忘记修改,其实这是开发经常出错的地方之一。

2、Java 随机函数取值范围

public void Solution(){
    int number = random.nextInt(0, 1)
    if(number == 1){
        ...处理业务逻辑...
    }
}

单看代码没看出什么问题,可能我们之前也不熟悉随机函数的用法,为此我们去度娘一把,nextInt(int k) 生成范围在 [0, k)(不包含 k)内的任意正整数,上面代码的 number 永远取不到 1,意味着下面的判断永远进不去,所以可以改为 random.nextInt(0, 2)。

3、初始化问题

public static String getOAID() {
    if(TextUtils.empty(Core.OAID)){
        String oaid = OaidManager.getOaid();
        if(!TextUtils.empty(oaid)){
            UniBundle.putOAID(oaid)
        } else {
            Core.OAID = UniBundle.getOAID();
        }
    }
    return Core.OAID;
}

看方法我们知道是要获取 oaid,但只要 OaidManager.getOaid() 有值,Core.OAID 永远都不会被赋值,正确的改法:

public static String getOAID() {
    if(TextUtils.empty(Core.OAID)){
        String oaid = OaidManager.getOaid();
        if(!TextUtils.empty(oaid)){
            UniBundle.putOAID(oaid)
        } 
        Core.OAID = UniBundle.getOAID();
    }
    return Core.OAID;
}

去掉 else,我们发现 Bug 往往在于多一行或少一行代码。

当然这样的案例有很多,以上是想告诉大家,Code Review 没有想象中这么困难,回到今日主题,
我在 Review 代码,我在 Review 什么?

1、明确涉及的接口及内容

我们很多需求逻辑需依赖各种配置平台,客户端通过网络请求获取配置,我们在 Review 代码过程中明确涉及的接口和内容,便于自己在测试时可以 Mock 配置测试,这里的价值在于降低一定沟通成本。同时,也能指导产品做相应的配置

2、明确涉及的数据/埋点上报

任何形式的数据/埋点上报,最为关键的是上报时机,其次才是上报内容。明确时机,明确内容

3、明确代码影响范围

这是老生常谈的内容,不管是开发或测试都最为关注的,也是难点、重点。我们测试常常询问开发,做新功能测试或回归测试时希望开发能给出明确的影响范围。有时候复杂的业务逻辑模糊了我们的方向,导致评估不准,但这里强调的是,多一个从测试评估的视角,而不是任凭开发圈定,测试能从代码去关注影响的范围,指导我们测试设计或回归相应的用例去覆盖影响,又或者这是不该被影响的业务逻辑

4、编码规范

编码规范也有一些内容,可以看看相关的技术文章。如命名规范、日志、代码格式等

5、业务逻辑

业务逻辑是我们关注的重中之重,我们的业务都建立在产品需求上,理清业务逻辑,并考虑是否合理。理清业务逻辑目的是指导我们设计相应的测试用例,考虑是否合理目的是否符合需求设计、交互设计、用户体验等

6、技术架构

给我们提出更高的要求,了解一些技术原理是必要的,透过现象看本质,才能明白数据走向、代码流程、框架流程等

四、结束语

以上是我结合自身经历的总结,实际工作环境可能比我们想象的更加复杂,每一个公司都有一套工作体系,我们其实在过程中不断摸索和成长,任重而道远,探讨各种技术经验,摸索适合自己或公司的工作方式。
我发现在这个过程中学到了很多知识,增强了开发的信任,当你在业务上的经验越来越丰富,在需求评审或技术评审阶段,能提出一些产品建议或技术建议,我想这也是测试在业务赋能上做出一定的贡献吧。
欢迎大家一起分享和交流。

共收到 6 条回复 时间 点赞
罗汉 关闭了讨论 07月09日 12:05
罗汉 重新开启了讨论 07月09日 12:05

点个赞,发现真相(bug)的途径就是接近真相(code)。👍

我 tmd 醉了,假设有 10 个开发,每个开发每天写 10 个方法,共 100 个方法,每个方法有 20 行代码,共 2000 行代码
你 1 个测试 去 review 2000 行代码?

树叶 回复

非常好的问题。
估摸公司测试开发比差不多在 1:3,一个测试对差不多 3 个开发。每次任务测试是单线程,即每次只对一个开发,按测试排期留下来还是有不少时间支配的。你这说法好比,假设一天 10 个开发, 加起来一天有 10 个需求,一个测试,估计也测不过来?
实际情况很多,具体操作起来也应人而异,有一些经验我也分享分享。
1、不是每个方法都需 Review
2、不是每一行代码都要 Review
3、在支配时间时,不能一昧的 Code Review,效率和时间需做平衡。 如果一个架构需要花不少时间去弄清原理,有可能会耽误测试完成的时间,那果断就以测试用例和黑盒测试为主,或白盒和黑盒共同兼顾。
4、有一些关键的中间结果或判断,是理清脉络的重点,我们平常做单元测试也是这条准则吧。
5、若 Review 经验稍足后,会不由意识的关注容易出错的地方。
当然我们还有很多注意的地方,可以一起交流和讨论。

review 代码得看被测项目是哪种,如果是服务端项目肯定绕不过 review 代码,而且 review 代码后心里会大概知道开发都改了哪些内容,不致于被开发牵着鼻子走;如果是页面的功能比较多,也可以结合着来测,总之就是为了达到尽可能较早的发现 bug

去看别人代码的都好猛.....

树叶 回复

什么开发 一天就写 200 行代码?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册