单元测试是伟大的发明,也是他妈的发明。小队只要碰上它,想要毫发无伤地脱身,几乎是难上加难。如果是我们自己写的代码,那写单元测试也无妨。但是我们中的绝大多数人是在别人之后清理屎,或者给别人留下一堆屎。这时候写单元测试,就有一种勉强的味道。没错,就是不想写!为了应对所谓的指标,我们不得不给那些遗留代码,那些会发臭的代码,开一剂良药:那就是自动化。如果把这些烂代码大部分交给机器来写,我想很多人都会很高兴。squaretest有很多这样的工具,比如IDEA自带的。但是它只能生成一些表面的东西,也就是生成骨架。老实说,鸟也没什么用。丝毫没有减少我的工作量,不该覆盖的代码还是没有覆盖。这时候,我们就需要一个更高级的工具。经过测试,现在针对squaretest。在IDEA的插件安装界面,找到squaretest并安装,就会有这个功能。重启IDEA后,从你的狗屎山中找到最臭的一块,然后在菜单中找到这个工具生成代码。中间可能会要求你选择语言,选择模板等,这对于软件开发人员来说并不难,这里就不赘述了。好家伙,给我生成了几万行测试代码。这时候不管是交给QA还是分析工具来玩,都能蒙他们的眼睛。呵呵呵呵呵呵....漂亮!报错很多,还得微调参数。但是大部分代码已经生成了,省了很多功夫。其他工具这似乎不是一个好的轨道。因为很多工具维护得不好,或者不太好用。用爱发电越来越不可行。例如,JUnitGenerator2.0甚至不支持JUnit5;AgitarOne,虽然只有30天的试用期,但是首页和上古怪物一样;Randoop的使用根本不是为人类设计的;Analytix被谷歌收购后,几乎进入了坟墓。squaretest可以说是非常好用了。你需要单元测试吗?很多人没有选择,因为它是一个硬性指标。如果你的工作流程出现问题,单元测试不仅不会增色,反而会成为一种负担。大多数情况下,单元测试不会减少bug,它们会根据bug进行调整以适应正常的代码;此外,如果您的代码是一些简单的CRUD,那么编写单元测试将看不到任何好处。对于这种情况,我们还是要找到根源。中国式需求变化极快,临时需求多,需要快速交货。这些功能往往复杂度比较低,写出来的代码也不会产生太多的bug;由于变化太快,单元测试没有泛化的可能;一次性代码在编写后可能永远不会被修改,被扔在一个被遗忘的角落。要编写单元测试,您需要确保您的单元测试可以使用很多年。与其等到项目结束,不如专注于补充单元测试以达到目标。单元测试要发挥其价值,需要从一开始就创建相关的代码。扪心自问,很多球队做不到这一点。如果你做不到,就不要假装。单元测试并不容易。有意思的是,即使环境满足要求,所有的接口都是预先设计好的,改动很少,我们还是无法进行单元测试。单元测试从来不是因为写单元测试有多难,而是大部分代码写不出好的单元测试。在TDD(Test-DrivenDevelopment,测试驱动开发)模式下,测试的动作先于开发,属于预先设计接口定义的范畴。如果后期对界面做更多改动,这种方式也会让开发者苦不堪言。单元测试需要结合极限编程,经常重构代码。这是设计损坏的补救措施。但很多时候,大家都害怕,拒绝修改旧代码。持续时间和稳定性是常见的借口。这些借口看起来比可扩展性和可测试性更正常,对高层决策更有说服力。很少有技术决策者能够在销售、产品、老板的压力下保持初心,做出如此长远的规划。所以单元测试肯定有用,但是缺乏实施的土壤。按时上线,提前上线,BUG数量。这些通用指标只反映结果。如果那些改善这些结果的措施短期效果不明显,很容易流产。单元测试也阻碍了开发人员进行重构的动力。因为重构意味着要搬很多测试代码,很多人往往偷偷评估后就放弃了。坚持正确的事情,选择优秀的团队是非常重要的。每个人都很专业,不会把你认为是正确的。专业的人才会像流浪汉队伍中的小丑一样束手无策,大部分想当然的经验几乎不可能付诸实施。令人欣慰的是,仍然有追求原则的团队。正确的方式可以避开很多弯路,丢掉技术债带来的负面影响。很高兴能够加入这些团队。作为程序员,应该始终保持这个好习惯,不要因为工作仓促而忽略了代码重构和测试。这些都是一个专业的技术人员应该具备的素质,在公司一般的环境下是没有的。这些好习惯就像人的气质一样迷人,最终会让你超脱于人。作为技术经理,你要正确评估你的公司环境是否有单元测试的生长土壤。即使您了解单元测试是有益的,您也必须做出一些权衡。尤其是你判断这个项目只是你的敲门砖,3年后肯定不会到你手里,任其自生自灭。遇到这样的情况,谁都心知肚明,谁也不会对你说三道四。作为一个非技术的管理者,当有人向你提出这样费时费力、长期有益的建议时,不要急于否定。看看其他也从这些短期停滞中受益的优秀公司。无知并不可怕,可怕的是不相信专业。有把握就支持,不要半途而废。有趣的是,半途而废最终并不会被废除,还会堕落为形式主义,把一件美好的事情变成一个指标。结束单元测试代码枯燥乏味,尤其是对别人写的代码进行单元测试的补充。一般情况下,如果不出现BUG,那一堆屎谁也不会随便动,除非是牛犊不怕虎。这时候,一个得心应手的工具,自动帮你完成这些操蛋的活儿,让你的单元测试代码拥有和石山一样的生命周期,不得不说是一件幸福的事情。作者简介:品味小姐姐(xjjdog),一个不允许程序员走弯路的公众号。专注于基础架构和Linux。十年架构,每天百亿流量,与你探讨高并发世界,给你不一样的滋味。我的个人微信xjjdog0,欢迎加好友进一步交流。
