公司要推行单元测试,但是执行太过于困难,大部分同事不支持怎么办?

66 天前
 GallifreyCAR

公司想定了新的开发规则(为了收归测试人手,减少测试人力的投入,降本增效),推行单元测试(根据不同项目等级,覆盖率到 50-70%)

但是目前我们使用了 go 全局变量的框架,没有使用依赖注入,没有使用接口和抽象,导致非常难写单测

做了一下同事间的调研,大部分同事都不愿意写单测,理由大概是

领导让我看一下这个事情怎么做,我尝试了一下,得出了三种方案。

  1. 使用 sqlmock/连接内灰数据库来适配当前框架,可以做到没有外部调用系统的服务 mock 测试,但是遇到要调用外部服务的情况,无法 mock ,只能临时注释掉(因为没有使用依赖注入)。但是连接数据库不能算 mock ,用 sqlmock 要写的测试代码又太多,反对者比较多

  2. 改造当前框架,拆分抽象层和实现层,使用依赖注入。这样单测想怎么写就怎么写就好了,但是增加大家平时要写更多代码,也有不少反对者

  3. 听从同事建议,反馈领导,不推行单测,自行自测。(全靠自觉性,感觉领导层都不会同意

对此大家有什么比较好的建议吗?

另外最近在学英语,有什么英语读物推荐也可以分享一下(摸鱼/晨间日常)

13301 次点击
所在节点    职场话题
153 条回复
ellipsis
66 天前
我组内单测覆盖率 90%上下,抱怨单测写不了的都是战五渣程序员和自己写的屎山代码。
wxw752
66 天前
我看你们第二种方案,怎么感觉要把 go 改成 spring 的形状了😂
Tuee
66 天前
裁测试,下一步就是裁开发,业务收缩,公司倒闭。。。
Vegetable
66 天前
一个项目一开始没有考虑写测试,后边再硬写就会这样的。
建议写集成测试,这样会容易一点。单测也确实是一种陷阱,单元测试在业务为主的开发里边作用没那么大,集成测试能覆盖很大一部分。
carpeDiemJll
66 天前
不增加人力的前提下,让写用例,都是耍流氓; 写用例的时间要远远大于开发时间
snowlyg
66 天前
@ipwx 是的,我把 gorm 相关测试的功能集成到 httptest 了,每个测试都用 uuid 开一个新库,测试结束销毁。还要走 迁移和 seed 。 就是公司电脑性能太垃圾了,每次测试都要跑半天,开发的时间都在等测试。
snowlyg
66 天前
@ipwx 哈哈,其实就是搞了 laravel 测试的那套东西,自己还写了迁移工具。小项目开发完全够用。
vipfts
66 天前
@follower 中肯的, 不拥护领导的主张, 说明能力不行, 搞两面派, 你不干有的是人干
COW
66 天前
早点准备跑路吧
nickxudotme
66 天前
全局变量也是可以的,虽然麻烦些

先说关于依赖的处理,如果数据库是 MySQL 的话比较方便,可以使用 github.com/dolthub/go-mysql-server 在本地内存起一个,然后改配置文件,连接这个内存实例,这个库可以当做是 Go 实现的 MySQL

可以配套运行一些脚本建表与造一些数据,这样测起来方便

但是这个库运行某些 SQL 会有问题(绝大部分时候正常),这时候就上 https://github.com/testcontainers/testcontainers-go 用容器起数据库,包括 PostgreSQL 也只能这样

Redis 可以用 https://github.com/alicebob/miniredis

其他依赖直接 gomonkey 打桩

具体来说,可以先实现一个通用的造环境函数准备好数据库之类,每个测试开始调用一下(或者 test Main ,这个方法很多)

之后造 HTTP 请求调 handler ,之后用 testify 检查返回与数据库更改是否符合要求(比方说更新后再查一下是否已更新)
baby0w0
66 天前
@GallifreyCAR 业务功能写单元测试没什么大的用处,我一直觉得除非你研发的是底层框架类库才有必要写单元测试
momo2789
66 天前
加钱+不写绩效不及格 or 延长一倍开发时间+不写绩效不及格
erenming
66 天前
一般就核心模块要求单测覆盖率呗,整个项目单测成本太高了
momo2789
66 天前
另外不写测试或者 Statements 测试没有 95%的,在我这里只值 8000RMB/月
cherishd
66 天前
@Erroad #15 哈哈 外企还真是,覆盖率必须 80%以上,除 shi 山项目外的新项目,覆盖率不够是没法 merge PR 的
layxy
66 天前
之前我们也推单元测试代码覆盖率,然后一个功能 3 天,写单元测试再要 3 天工时,后面就基本不咋让写单元测试了,尤其是有很多 rpc 调用场景,需要 mock 一堆服务,然后改了一点业务代码,可能需要几十倍的工作量改测试代码
baby0w0
66 天前
@momo2789 为了覆盖率写测试 本末倒置。
GallifreyCAR
66 天前
@NX2023 数据库我是用这个库实现的 github.com/DATA-DOG/go-sqlmock ,外部调用服务的情况,我目前还没想到同步好的方式,但是 gomonkey 是个很好思考方向。
everhythm
66 天前
@GallifreyCAR #4 业务交叉情况,得让测试先准备完备的测试数据,才能自动/手动跑覆盖,达到测试目的。按方案 1 改改,外部服务数据都是可以 mock 的呀。

然后单测和方案 1 的全流程测试是两回事,单测也考虑依赖完备的测试数据,不然光写“单测”意义不大。

举个例子,假设原有项目是商城上下架商品,现在增加 1 个商品优惠券功能。那测试得先准备 1 个商品测试数据,再基于此做优惠券测试。
yibin001
66 天前
https://github.com/bytedance/mockey/tree/main

我司要求覆盖率是 80% ,持久层可以商量忽略单元测试覆盖,业务层还是有必要的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1153924

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX