业务代码写单元测试的最佳姿势是什么?

2021-05-16 22:57:22 +08:00
 XiLemon

最近看了极客时间的 [ 10x 程序员工作法] 和 [设计模式专栏] ,里面有一些关于单元测试的内容, 看完之后,感觉好像懂了,但是回头一看自己写出的代码,却不知道如何下手。

想请教一下大家,日常工作中是如何写单元测试的,团队的规范是怎样的,怎么迈出单元测试的第一步!!!

10044 次点击
所在节点    Java
59 条回复
no1xsyzy
2021-05-17 13:53:49 +08:00
@XiLemon 我发现我笔误了,是会 fail 的测试而不是单测。不一定是单测,而且通常来说它的需求是解析某网址,显然不应该是单测。

不过我凭空推测,它估计不是因为 TDD,而是因为 Issues 被广告机爆了。
kaedea
2021-05-17 13:54:29 +08:00
用来调试 API
qiumaoyuan
2021-05-17 14:58:39 +08:00
补充一下 #40,其实还有很关键的一点:很多人业务代码没有能力写干净,写测试代码就一定会更加添乱,这种人写测试往往都会半途而废。
wangyzj
2021-05-17 15:04:51 +08:00
楼上老哥有几个写单元测试的?
业务的变动和要求,你根本没时间写
也就面试的时候会被问到
理想和现实的差距
gdtdpt
2021-05-17 15:18:26 +08:00
首先自身业务代码层次要清晰,各层级间耦合度要低,这样在 Mock 的时候工作量才会少,才能专注测试的内容,不然光写 Mock 就一堆代码。
在一个 Service 方法里调用另外 3 、4 个 Service,然后又调用几次 Dao 不同的方法这种流水帐一样的代码写 Mock 都要写死人,怎么让人写单元测试。
angmieee
2021-05-17 16:04:22 +08:00
业务代码不写单元测试。你是嫌加班不够多,还是工作不饱和?
passerbytiny
2021-05-17 16:12:50 +08:00
单元测试有两个大前提:

一、你不一定要 TDD (先写测试代码),但测试框架的设计一定要早于主代码框架的——单元测试是领导而不是擦屁股的。

二、不一定是大项目,但一定是长期或者计划长期维护的项目——非自动化需要大量执行成本 /自动化需要大量设计成本,你不该为了半年甚至一天后就抛弃的项目做单元测试。
ClericPy
2021-05-17 21:15:32 +08:00
@ClericPy 我这边业务不是太复杂, 有时候单元测试有时候简单的功能测试, 太细致的单元测试就连 TDD 那本书作者都不建议 ( https://stackoverflow.com/questions/153234/how-deep-are-your-unit-tests , 也就是著名的那句 "I get paid for code that works, not for tests")

有的同事天天加班到十一点, 进度天天催, 根本没时间写完整测试, 连文档都不愿意看, 最后布一套测试环境跑通核心功能验收就上线了. 毕竟对绝大多数公司来说, 开发人力根本严重不足, 方法论什么的行不通

总结起来就是, 上线前一定要有测试, 但是不要迷信 100% coverage.
searene
2021-05-17 22:35:58 +08:00
我一般只写集成测试,数据库也不 mock,直接去读,这种方法很少有人提倡,但是在实际的业务开发中是性价比最高的,既省时间又能保证程序的基本功能。传统测试理念要求一个功能写一个单元测试,甚至写功能之前就要写测试,比如 TDD,这样做得话听起来很不错,但是实际开发中根本跟不上需求的进度
bthulu
2021-05-18 08:36:24 +08:00
@lightjiao 有时一个类会依赖十几个对象, 那这个构造函数就够大的了, 你还能区分构造函数里哪个参数是哪个吗
witcherhope
2021-05-18 11:56:42 +08:00
单测非常有必要,单测也是某种意义上的代码文档,在接手别人代码和重构时候就会知道单测意义所在了
godall
2021-05-18 12:58:41 +08:00
@qwerthhusn 好奇问下,怎么方法能把测试覆盖率提高到将近 100%?
ljf
2021-05-18 13:52:45 +08:00
我司要求单侧覆盖超过 80%,代码才允许合并,所以慢慢变成为了写好单元测试而写代码,大部分时间都在写单元测试
lix7
2021-05-18 19:39:04 +08:00
小型工具方法写单测,业务逻辑写集成测试。
业务逻辑写集成测试,mock 掉外部依赖(外部接口一类的),数据库不 mock,可以看下 testcontainers 项目,在测试部分启 MySQL / Redis 等容器。
XiLemon
2021-05-18 22:17:27 +08:00
@witcherhope
@ljf 两位老哥、分享一波经验呀
@lix7 多谢
RandomJoke
2021-05-19 16:45:02 +08:00
从一些简单逻辑开始呗:
1. 比如 API 的输入 check
2. 比如相对简单但是共用的 util

一般来说,你觉得 test 不知道怎么写,要么是代码实在写的有问题,要么就是本身就不该写,不过大部分不知道怎么写都是代码的问题,可能层次划分的不对,逻辑拆分的不够细等等
MarioLuo
2022-03-19 11:47:57 +08:00
一年过去了,楼主单元测试有值得方向的经验吗
XiLemon
2022-05-28 12:28:56 +08:00
@MarioLuo #57 并没有,依然在裸奔
chaosz
2022-09-18 21:06:57 +08:00
@lix7 赞同

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

https://tanronggui.xyz/t/777305

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

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

© 2021 V2EX