android 端真的需要写单测吗 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复粘贴 AI 生成的内容
masterAtyan
V2EX    程序员

android 端真的需要写单测吗

  •  
  •   masterAtyan 2018-01-25 14:25:20 +08:00 4853 次点击
    这是一个创建于 2821 天前的主题,其中的信息可能已经有所发展或是发生改变。

    android 端一般业务逻辑少,比较多的是 UI 和线程切换以及网络请求, 我更推崇自动化测试,在真机上自动化运行 apk,这样才能暴露更多的问题

    34 条回复    2018-01-28 11:40:40 +08:00
    lihongjie0209
        1
    lihongjie0209  
       2018-01-25 14:37:09 +08:00   1
    单元测试是测试方法级别的逻辑.
    真机运行起码是集成测试以上了, 两个概念
    masterAtyan
        2
    masterAtyan  
    OP
       2018-01-25 15:31:23 +08:00
    我认为单元测试能暴露的问题太少了,接口返回值,真实 UI 展示都被单元测试框架模拟了,这样的测试到底有何意义,在我所经历的项目里,如果剔除网络获取和 UI,真正的逻辑层代码有多少,这部分代码真的有必要写单测吗,android 端不应该更注重 UI 的稳定性
    panpanpan
        3
    panpanpan  
       2018-01-25 15:35:17 +08:00
    我觉得单元测试更大的作用是如果覆盖得好的话,改了代码逻辑之后跑一下就能之后该出 bug 没有
    DeweyReed
        4
    DeweyReed  
       2018-01-25 15:39:06 +08:00
    unit 很碎片。记得官方建议是 7 成 unit,2 成 instrumentation,1 成手动。复杂程度递增,各自负责不同的部分。如果测试都得都得跑在手机里,说明项目有问题(怕不是用了 MVC?
    changkong
        5
    changkong  
       2018-01-25 15:40:22 +08:00
    我认错,我从来不写单测
    scriptB0y
        6
    scriptB0y  
       2018-01-25 15:41:13 +08:00
    我觉得不用写。单元测试就像 F1 赛车道两旁的轮胎,不是路两边一直有轮胎,而是在在可能爆炸的地方放几个。
    nullcc
        7
    nullcc  
       2018-01-25 15:59:17 +08:00
    看功能复杂程度吧,非常简单的功能不用写了,复杂点的可以考虑写,之后重构什么的也比较省事
    rockyou12
        8
    rockyou12  
       2018-01-25 16:05:21 +08:00
    增删改查业务确实没必要写,写了也测不出问题
    likuku
        9
    likuku  
       2018-01-25 16:09:41 +08:00
    养成 TDD 的习惯了,代码堆上去之后,越往后,真的会越来越省事...
    sammo
        10
    sammo  
       2018-01-25 16:11:34 +08:00
    写测试和 TDD 是好习惯
    masterAtyan
        11
    masterAtyan  
    OP
       2018-01-25 16:23:15 +08:00
    但 android 为了实行 TTD,冗杂了很多库,有时候为了解决多线程的单元测试,屏蔽 UI 展示,耗费大量的时间,我觉得这是无意义的消耗。
    单元测试不应该简单易懂,一条单元测试条目,不应该简介明了吗?
    像是 android 里 Rxjava 线程切换,就需要考虑怎么屏蔽掉切换 android mainthread 的问题,这反而是单元测试本身越来越复杂,这样写出来的测试,不仅维护成本高,易读性还差,这是我遇到的问题
    lihongjie0209
        12
    lihongjie0209  
       2018-01-25 16:33:09 +08:00
    @masterAtyan #11 多线程的问题可以用单元测试测试出来?
    masterAtyan
        13
    masterAtyan  
    OP
       2018-01-25 18:21:08 +08:00
    现在的解决方案是跑单测的时候将 rxjava 的 android mainthread 替换成 io thread (这样无形中增加了开发量,必须定义一个 interface 接口),反正单测跑在电脑上,根本没有 mainthread 的说法,至于有没有其他更好的方案就不得而知了。
    DeweyReed
        14
    DeweyReed  
       2018-01-25 18:57:47 +08:00
    @masterAtyan Rxjava 的单元测试线程问题可以用一行 Rule 解决
    https://stackoverflow.com/a/43356315/5507158
    masterAtyan
        15
    masterAtyan  
    OP
       2018-01-25 20:00:46 +08:00
    有空看一下
    blless
        16
    blless  
       2018-01-25 20:12:34 +08:00 via iPhone
    有单元测试写了重构方便
    masterAtyan
        17
    masterAtyan  
    OP
       2018-01-25 20:28:20 +08:00
    重构会涉及到函数名,参数,UI 样式,架构( mvp,mvvm )等,这样大部分单元测试都跑不通,无端增加了开发单元测试的成本
    WispZhan
        18
    WispZhan  
       2018-01-25 20:30:30 +08:00 via Android
    看了楼上的回答发现,大多数人估计根本不考虑重构和代码维护了吧?!
    就像
    @nullcc
    @likuku
    @blless
    说的。
    单元测试对可维护的代码才是最大价值。重构的时候省事太多。
    blless
        19
    blless  
       2018-01-25 22:09:39 +08:00
    @masterAtyan 我不怎么写安卓 不过理论上可验证逻辑都可以写单元测试 ,讲真跟代码习惯有关吧。很多人的一个函数写得又臭又长,真的是难写。把函数拆分成单个可验证逻辑,单元测试只测试一小段代码就好写多了。
    ShareDuck
        20
    ShareDuck  
       2018-01-26 00:11:18 +08:00 via Android
    不写单元测试怎能放心改代码?
    ai277014717
        21
    ai277014717  
       2018-01-26 10:33:48 +08:00
    写单元测试能提高产品质量,主要看公司主管有没有想法有没有预算。自己的话就不要折腾了。拿那么点工资没必要因为写个单测费神费力。
    masterAtyan
        22
    masterAtyan  
    OP
       2018-01-26 11:37:20 +08:00
    @blless 理论上确实什么代码都可以写单测
    GoodRainChen
        23
    GoodRainChen  
       2018-01-26 11:39:55 +08:00
    GoodRainChen
        24
    GoodRainChen  
       2018-01-26 11:42:11 +08:00
    @blless 不小心提前发出去了,客户端目前写单元测试最大的难点在于确定输入输出。输入是用户的操作,输出是界面的展示,以目前常见的框架来说,想要仿造用户输入还算简单,但是检验界面展示就非常困难。至于逻辑很少很少,几乎没有单元测试的价值
    masterAtyan
        25
    masterAtyan  
    OP
       2018-01-26 11:44:39 +08:00
    @ShareDuck 主要讨论的是 android 端单测,后端由于业务逻辑繁杂,确实有必要用单测保证自己改完单测逻辑的正确性,但 android 端说到底逻辑层面上确实复杂性不高
    vjnjc
        26
    vjnjc  
       2018-01-26 12:01:49 +08:00
    首先你要让你的代码 testable,意思就是说代码要写的好,不要有全局变量或者 android 包的关联。这样的代码才适合单元测试。

    然后某些逻辑有一定复杂性,比如我客户端有个加密逻辑,这个实现单元测试挺好的。像界面跳转,http 请求都不适合。
    masterAtyan
        27
    masterAtyan  
    OP
       2018-01-26 12:23:28 +08:00
    @vjnjc 我比较赞同,android 平台无关的可以写单测,android 端单测给我最大的收益是注意区分平台相关性代码,将平台相关性代码解耦,只是解耦平台相关性代码并非需要单测才能保证
    yuriko
        28
    yuriko  
       2018-01-26 12:55:39 +08:00
    虽然理论上都能写,而且 android 相关的代码谷歌也有给对应的打桩工具
    但真的写起来太蛋疼,尤其客户端业务逻辑变化太快了,单测很多最后都是变成给自己平白无故增加劳动量
    我更倾向于单纯整理测试用例然后人工测试
    hantsy
        29
    hantsy  
       2018-01-26 21:58:36 +08:00
    @DeweyReed 国内要求写测试的公司估计不到 1%吧,个人多年前在公司上班的时候推广过 Junit,遭到一致反对。

    Java 测试工具架构真的太成熟了。一般 Java EE 和 Spring 程序 Backend 都很好写测试。但个人也不喜欢写 Web UI 的测试,HTML WebDriver 之类,但这类传统的 MVC 项目现在基本遇不到了,基本都是用 REST API+ 前端 SPA 程序,REST 测试工具框架太多了。

    至于 Android 这种 UI 为主写测试真不容易,国内写的人更少了。代码必须低耦合,每个类功能要足够简单清晰。说白了,要做软件设计的最基本的 SOLID。
    hantsy
        30
    hantsy  
       2018-01-26 22:00:59 +08:00
    @vjnjc 跳转,HTTP 这些都可以 Mock 和 Spy,应该检测输入和输出是否正确。
    hantsy
        31
    hantsy  
       2018-01-26 22:19:26 +08:00   1
    @likuku
    @WispZhan 是的,比如 6 个月的项目,短期两三周可能看不到什么效果。但如果一开始就严格写测试(和写一些脚本,不断调整,实现项目 CI、CD 自动化),后来的开发才能越来越容易。

    国内大多数团队都急于在一两个星期做界面(不好听的话,就一张皮)出来给领导看,后面代码量一上去,整个项目代码就成滥泥一样,天天加班就是拆东墙补西墙,哪有什么代码质量,Maintainable,Testable 可言。

    至于说写测试是浪费时间的说法,以我的个人经验(你不必认同)可以说,不写测试,从一个项目整体生命周期计算,你 70%的时间都在浪费时间,而且代码根本没质量而言。
    20015jjw
        32
    20015jjw  
       2018-01-27 04:46:55 +08:00 via Android
    写 为什么不写 我知道的硅谷大公司都写
    masterAtyan
        33
    masterAtyan  
    OP
       2018-01-27 21:46:40 +08:00
    @hantsy 不反对测试对工程质量的保证,但一个人的软件水平是逐步提升的,一开始架构可能设计的不够好,最简单的来说看了 阿里程序员手册,发现方法名,类权限,方法的权限( private,public )以前写的不够好,如果我们想换单测必须写的跟在换。

    不可否认 Testable 的代码确实很优雅,但优雅的代码不一定非要通过写单侧实现,尤其是 android 端的单测难写又复杂,写起来可不不是 JUnit 这些成熟的框架可比。

    写单测只是说能让你发现代码设计的不合理的地方,但怎么修改还是需要去阅读大量的开源项目(优雅的代码)才能知道怎么去修改。

    只是说 android 端单测耗费时间长罢了,有这些时间我们不如多读一本书,多看写源码来的实在,单测在大公司其实是一种 KPI 导向的推动,我们写出优雅的代码,大部分是模仿优秀的项目,而不是写单测
    hantsy
        34
    hantsy  
       2018-01-28 11:40:40 +08:00
    @20015jjw 应该是大小公司都会要求测试吧。。。但不尽一样,大公司,如 IBM 这种,除了基本程序员自己应该写测试外,一般项目都有要求用户界面层面的功能测试,基本上都是先由一些业务专家写的测试规范,然后有一些测试人员专门进行(大公司也有很多专业工具辅助的,比如 HP 的测试工具)功能测试 。

    小公司 /Startup,更倾向 Geek 文化和 Engineering 文化,XP,TDD, 不断 Refactoring 等,工具优先,整个软件开发生命周期都是力求没人工干预,自动化。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 06:32 PVG 14:32 LAX 23:32 JFK 02:32
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86