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

66 天前
 GallifreyCAR

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

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

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

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

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

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

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

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

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

13303 次点击
所在节点    职场话题
153 条回复
nickxudotme
66 天前
@GallifreyCAR #78 个人感觉 go-sqlmock 这种写法不太能接受,所以我没按照这种方式(
momo2789
66 天前
@baby0w0 覆盖率不是目的,它是客观指标!有这个覆盖率能保证下限。没有覆盖率的约束,程序员很容易在写测试时“顾头不顾尾”,导致关键路径没人测。
baby0w0
66 天前
@yibin001 你们的业务不经常变化吗? 如果变化了,那么单测的逻辑也要改,是可以接受的?
nickxudotme
66 天前
@GallifreyCAR #78 关键是直接起一个实例来读写很方便,用 go-sqlmock 的 ExpectExec 不如执行完 SELECT 一下看是否符合修改后的预期
morty0
66 天前
单元测试做单独的排期, 覆盖率列入绩效考核, 而不是说开发周期加上单元测试
baby0w0
66 天前
@momo2789 那我明确的告诉你,业务代码写的不好的人,他的单测也写的不好
qiyuey
66 天前
你们老板这是花了一碗粉的钱,想吃两碗粉
momo2789
66 天前
@baby0w0 那我只能说你踩的坑不够多,或者这么说吧,你还没入行。
kzfile
66 天前
单元测试工作量确实很大,但能直接关联代码覆盖率。
如果一段代码不方便做单元测试,大概率不是好代码,以应付单元测试和覆盖测试的心态写代码,能迫使开发人员写出方便复用的代码段
baby0w0
66 天前
@momo2789 我写的单测 比你吃的饭都多。
baby0w0
66 天前
@momo2789 我只写有效的单元测试,而不是为了覆盖率去写一堆无意义的代码
momo2789
66 天前
@baby0w0 我不信“写的单测 比你吃的饭都多”能说出“业务功能写单元测试没什么大的用处”这种话
baby0w0
66 天前
@momo2789 你不理解就算了,大部份公司所谓的业务,根本不需要单元测试。
maichael
66 天前
站在你的角度上的建议:
1. 通过增加单元测试覆盖率要求来减少测试人手这一大目标注定会失败。
2. 既然注定失败,那么你可执行的方案有两种:
2.1. 想通过写单元测试来提高代码质量,完全遵循 TDD (可选),并且编写有逻辑,有思考的“白盒测试”
2.2. 放弃通过写单元测试提高代码质量的想法,面向测试覆盖率编程,编写一大堆毫无逻辑,不用思考,全面覆盖的测试。
3. 可以通过 AI 去先提高代码的可测性/找到一种绕过当前测试困难的方法
4. 先有一个测试案例,然后告诉 AI 参考该案例来编写测试就行
jasondennis12139
66 天前
wiremock 不是可以 mock 接口吗,调用外部服务的话。
baby0w0
66 天前
@momo2789 大部分公司搞单测,就和一些公司面试官,开口就问高并发 分库分表,实际上用户数量 10000 都没有一样搞笑。
dajj
66 天前
不如让测试 + ai 学做 api 测试
momo2789
66 天前
@baby0w0 一样的,高并发 分库分表 测试覆盖率 不是证明你的能力而是证明你的 bar 有多高。问题是想做 8k 一个月还是 30k 的工程师。
baby0w0
66 天前
@momo2789 我的理解是 你的业务是不是有写单元测试的价值。 有价值才需要写。 像那种上线后 觉得效果不好,就下线的,写了也是浪费时间
momo2789
66 天前
@baby0w0 我的理解是这个是职业操守,我从来没有要求过 TDD ,这个不现实。但是我不能接受写一个接口,一个单元测试都没有就发出去的,哪怕是 80%呢?

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

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

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

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

© 2021 V2EX