游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

前端测试的反模式IDCF

  一、过于关注实现细节的测试
  在为前端项目编写测试用例的时候,你也许和我一样,曾遇到过以下困扰:明明进行了功能正确的改动,测试却挂了。修复测试有时候得认真阅读各种mock的细节,或者去了解很多本没有必要知道的代码逻辑。最后修测试花的时间比进行业务改动花的时间还要长(甚至长很多)。对代码进行提取抽象之后,为各个组件或函数添加测试,实际上是用测试工具的API去重复业务代码的内部实现逻辑(有时候还很麻烦!)。任何正常的重构都会导致测试失败,你本来希望测试能告诉你什么样的修改是对的,结果现在测试只能告诉你代码确实有被修改。测试写好,覆盖率提高,本应信心十足地认为代码变得健壮了,可是扪心自问,你知道自己写的这个测试弱点在什么地方,或者说还有多少细节没有涵盖。你精心模拟了一个条件,去触发逻辑流程,并且测试通过,可是在真实的浏览器交互中用户也许并不能触发这个条件。因此,同样的道理,你在自己的代码通过了他人写的测试之后,也不能确定真实场景下没有问题,只好把后续的重任交给QA。
  造成上面三个问题的原因不止一个,但测试过于关注实现细节在我看来是最主要的。第一个问题,明明是正确的改动,可是测试不止是验证业务功能,还对实现细节提出了不该提出的要求,比如要求你的函数接受跟以前一样的参数,返回值必须是字符串而不能是数组等等。可是这个函数只是实现流程中一个小小的环节,也许在下次重构时就会不复存在。第二个问题很类似,如果测试代码去重复实现细节,不管进行正确还是错误的重构,你都得把测试改一遍,那原先的测试又能提供什么价值呢?第三个问题有时发生在,测试的实现细节,不能覆盖整个真实交互流程的时候。用户点击的是屏幕上的button按钮,而测试的起点是onClick事件被触发。后面的逻辑被验证成功,可问题偏偏发生在点击环节,真实的点击也许因为按钮状态而无法触发onClick事件。
  因此,才会有人提出前端的测试应尽量去模拟真实的用户行为,TestingLibrary就在其官网的指导原则章节,鼓励使用者尽量仿照应用真实的使用方式去编写测试,并明确提出,你的测试越接近用户的真实使用方式,它就能给你越多的信心。换句话说,你的测试应该尽量少用函数去手动触发,而要尽量多地利用测试框架给你的API,去模拟Input框的输入,按钮的点击,表单的提交等等。
  如此一来,有的函数,你也无需写测试证明它的返回值如你所愿,需要写的,是页面显示了期待的文字,发生了预期的变化,进行了对应的跳转。你会发现,这时的测试就像写在卡里的AC一样。只要测试是通过的,你就有理由相信主体功能没有破坏,而不只是函数工作正常。二、没有独立业务含义的测试单元
  看到上面的方案,你可能会立马会想到一些问题。
  首先就是测试流程可能会很长,从用户填完表单,点击提交,到期待的变化出现,当中可能经历了好几个函数的执行,连带着一系列的副作用。模拟这一系列行为,似乎是集成测试与E2E测试该干的事情。如果项目中大部分逻辑都是由这种测试去覆盖,看起来与测试金字塔所说的由单元测试作为地基是矛盾的。
  我认为,当真实遇到的问题碰到了某种教条规范时,后者该适当地让步。
  鼓励多写单元测试的原因在于它们成本低,有针对性。可是在前端项目里面,很多形式上的单元并没有独立的业务含义。
  拿React项目举例,好多函数只是因为它们在形式上可以被抽取出来,就被拎到一个单独的文件里,从而降低主函数的复杂度。如果给它写单元测试,你就不得不手动触发它的参数变化,或者检测它的参数函数是否有被调用。
  我们写的Reacthook尤其如此。很多时候抽取自定义的hook是出于逻辑上的原因,把相关的逻辑和数据聚合到一起,减轻UI组件的负担,但这些hook往往没有一个可以轻易解释清楚的业务含义,而且它们也不会被其它地方使用。
  所以这类单元只是长得像单元而已,它们其实只是一个实现环节。这里完整的UI操作流程,才更像一个有价值的单元,尽管它们在形式上可能超越了单个函数的范畴。
  但我不想矫枉过正,确实有不少情况下,一个util函数,一个hook,一个很小的公共组件,都是有独立存在的价值的,因此,它们也应当被视为真正的单元,确实有资格拥有自己的专属测试。
  testinglibrary下面有一个单独的库,叫reacthookstestinglibrary,让你无需通过UI行为层面,而是直接以hook的方式去测试它们。它的GitHub页面上,明确提出了使用以及不使用它的场景:当你的hook不与组件强相关,拥有独立含义时可以使用;当你的hook只被一个组件使用,且和它的定义强相关时,则不建议使用。
  插入一段:尽管存在reacthookstestinglibrary这样的工具,但像SWR这样优秀的三方库,在用testinglibrary为自己的hookAPI做测试的时候,依然选择在UI层面进行。方法是,把自己的hook置于一个临时的p标签里进行render,把数据的变化映射成html文字的变化,最后对文字内容做断言。其实对于独立性强的函数,个人觉得放置在UI里面做测试倒没有太大区别,但SWR的例子体现了对仿照真实使用场景去测试这一原则的尊重。
  将上面的规律套用到Angular项目中,也是类似的。对于独立性和通用性不强的pipe,directive,reducer,effect,service,都可以认为它们是实现流程的一部分,从UI行为层面写好测试即可。
  总之,在构思前端测试的时候,与其死守单元测试的字面含义,不如结合实际场景,重新思考什么才是真正有价值的单元,因地制宜地去写。换种角度表述,与其在意我们写的测试是不是单元测试,不如追求更核心的东西我们的测试有没有以合适的方式去校验逻辑。
  另外,当我们的单元过大,一些逻辑可能就会覆盖不上。像sonar这类工具,不仅会检查你的行数覆盖率,还会检查你的各项条件语句是否有被测试执行。当一套测试的行为流程囊括了多个函数,而且每个函数都有好几个ifelse语句时,想要在UI操作与mock数据上把所有情况都覆盖到,成本就会变得非常高昂。
  对于此,我们得承认,无论用什么方式组织测试,覆盖所有的条件分支都是不太现实的,而且价值也不大。对于满足条件A就执行XXX之类的语句,条件为非A时没有业务上的规定,如果为了刻意覆盖函数的所有条件,就强行测它在非A的情况下返回一个undefined,则没有太多价值。对这类情况,用UI行为测试主要条件即可,如果你实在觉得有重要的逻辑没有被覆盖,不妨回过头来想想,是不是漏掉了某种输入条件,例如特定的用户键入或者特殊的APImock返回值。但是,当有过多的条件分支很难用业务场景去表述和模拟的时候,我们可能需要重新思考代码的实现逻辑是否合理了。
  当然,即使按上面这样做,有时候还是会发现要覆盖的条件组合太多,从行为流程上写测试太复杂,这时就不得不做一定的妥协,为那些没有独立性的部分去单独写测试。如果这类测试不太好写,可以参照刚才提到的SWR官方测试用到的技巧,把要测的函数或者是对象放置在一个临时的UI组件下,以最小的成本做UI行为测试。最后
  总结一下上面谈到的几个原则:从真实用户的行为流程去测试,往往比测函数本身,能给你带来更多的信心。对于没有独立性和通用性的函数或对象,把它们视作实现的一部分,一般没有必要为它们去写单独的测试。不要拘泥于对单元测试的字面理解,不要被形式上的规律所束缚。不要把测试覆盖率视为太过重要的指标,它的目的还是帮助提升代码的稳定。有的代码没有覆盖也没关系,有的代码值得你覆盖好多遍。毕竟,我们不是为了写测试而写测试。
  来源:Thoughtworks洞见
  作者:钟立

mysql数据库写入数据提示1366代码错误解决方法mysql数据库写入数据提示1366代码错误解决方法错误代码:1366Incorrectstringvalue:。。。forcolumnstudent。studen……新版倚天屠龙记少年张无忌是谁演的扮演者芦展翔资料简介新版倚天屠龙记少年张无忌是谁演的:扮演者芦展翔资料简介新倚天屠龙记少年张无忌扮演者芦展翔个人资料作品介绍:新倚天屠龙记演员造型曝光后,细心的网友发现少年时候张无忌长得好帅……新版倚天屠龙记2018演员表新版倚天屠龙记主演都有谁新版倚天屠龙记2018演员表:新版倚天屠龙记主演都有谁新版倚天屠龙记演员阵容还是蛮期待的,那么新版倚天屠龙记主演都有谁?新版倚天屠龙记2018演员表。下面就一起来了解一下……玉骨遥什么时候开机,玉骨遥讲的什么网剧《玉骨遥》选择在2021年3月29日开机拍摄,而剧情把沧月写的小说进行改编,来把孤高清冷空桑世子的时影和热情仗义赤族郡主的朱颜相互结缘,并共同一起成长的故事带给观众。1玉骨……小敏家什么时候开播,小敏家演员表小敏家说出来很多人不清楚,可小敏家电视剧是什么时候开播,很多网友就想去了解一下有关的故事,看小敏家提前把相关的海报和预告片给公布,来让观众能大概知道演绎的剧情,但有的网友就不清……数据Q1全球手机出货3。4亿部,三星7700万登顶,华为跌出统计机构StrategyAnalytics公布了2021年第一季度的全球手机出货量报告。根据报告,2021年第一季度全球智能手机出货量为3。4亿部,同比增长24,是自20……烈火如歌暗夜罗是谁演的烈火如歌暗夜罗扮演者资料烈火如歌暗夜罗是谁演的:烈火如歌暗夜罗扮演者资料烈火如歌暗夜罗扮演者个人资料介绍。电视剧《烈火如歌》即将开播,剧中暗夜罗是一个大反派,十分残忍,暗夜罗是谁演的,暗夜罗扮演……爆料汇总苹果今晚春季发布会可能有哪些产品4月20日,距离苹果明天凌晨的发布会还有几个小时。至今我们除了iPadPro之外仍不知道苹果究竟会发布一些什么产品,按照历年来苹果的春季新品发布会,都是针对iPad的升级,以及……泡沫之夏大结局到底是什么,泡沫之夏大结局夏沫喜欢谁爱情剧《泡沫之夏》给观众带来自幼失去双亲的尹夏沫在自己的梦想中成长,却她签约演员公司变成练习生,后来她被某游戏公司创始人欧辰发现,所产生相遇后,逐渐产生美好的爱情,并发生有夏沫……工信部2021年新能源汽车产销量均超350万辆【大河财立方消息】1月20日,工业和信息化部举行新闻发布会,工业和信息化部总工程师、新闻发言人田玉龙介绍2021年工业和信息化发展情况。2021年,我国工业和信息化发展取得了历……新版电视剧泡沫之夏演员表泡沫之夏各角色演员及扮演者新版电视剧泡沫之夏演员表:泡沫之夏各角色演员及扮演者介绍由于中中执导的新版《泡沫之夏》已于5月8日登陆浙江卫视首播,播出首日,该剧就受到了观众的好评,那么泡沫之夏电视剧演……新版泡沫之夏欧辰结局是什么夏欧辰最后跟夏沫在一起了吗新版泡沫之夏欧辰结局是什么:夏欧辰最后跟夏沫在一起了吗新版泡沫之夏欧辰最后跟夏沫在一起了吗?电视剧《泡沫之夏》正在热播中,剧中男主角欧辰喜欢的人是谁,欧辰最后结局是什么?……
学生党笔记本怎么选?认准这3点,你就不会买错金九银十是笔记本销售旺季,很多学生党尤其是大学新生们,都会在这个时间段选择笔记本。还记得当年我上大一那会儿,自己对笔记本一窍不通,最后还是让懂行的人跟我一起去科技市场买的笔记本……初恋这首情歌发布口碑海报SingStreet乐队谱写无畏青春星关系7月31日讯由约翰卡尼自编自导,福迪亚瓦尔什匹罗、露西宝通、杰克莱诺、马克麦克肯纳、艾丹吉伦等主演的音乐爱情电影已定档8月7日与观众见面。今日,影片发布口碑海报,海报中S……电影拳皇觉醒高燃预告公开顶级制作重燃经典IP星关系7月30日讯热血格斗动画电影《拳皇觉醒》今日公开了一支两分五十秒的预告及数张高清剧照,这也是该片的首次官方曝光,作为经典游戏IP《拳皇》的最新影视化作品,引发了粉丝的强烈……碧桂园的业绩,提前剧透了行业新趋势关注冲抵疫情的影响,规模较大房企的增长面临的困难更大,碧桂园是如何做到高质量增长的?本文由无冕财经发布编辑:陈涧设计:布冬实习生:郭曼怡2020年最后……电影信念一生发布海报官宣定档中国医师节致敬中国医师,护佑人民健康。由老戏骨苏国涛、梁丽领衔主演,实力派演员刘亚津、罗京民、李桂莲等联合主演,水木年华担任主题曲演唱的医疗现实主义题材电影《信念一生》近日发布信念版海报……谢谢你给了我11年的生命第八章醒了晚上睡觉之前,女儿坐在床上,先和老伴儿在那聊起天来了。妈,我之前真的从来没有经历过这样的事情。虽然我不知道后面爸爸会不会醒过来,但晚上在那等待的时候,听到姨姥爷……电影初恋这首情歌定档8月7日成为影院复工首批上映影片星关系7月27日讯在电影重启之际,全国艺术电影放映联盟挑选的一系列精品艺术电影即将于全体院线分享放映,让更多的观众和影迷感受艺术电影的温暖,为电影市场增温,也为中国电影打Cal……电影我时间尽头等你成七夕首选李鸿其李一桐时尚大片合体撒糖星关系7月24日讯将于七夕情人节上映的电影《我在时间尽头等你》发布了一组时尚大片,主演李鸿其、李一桐合体撒糖,延续影片中动人的爱情故事,诠释爱情最好的模样。影片由姚婷婷执导,江……小米note又降价了,入不入?2015年1月小米发布第一款2000的手机小米note,有两个版本,小米Note标配版和小米Note顶配版,售价分别为2299元起和2999元。不过这款手机发布后,网友们都议论……李一桐跳无价之姐助力影院复工电影我在时间尽头等你七夕上映星关系7月22日讯在电影院陆续复工之际,电影《我在时间尽头等你》主演李一桐,抵达上海一家刚复工的影院开展直播活动,在影院员工的带领下参观影院,并号召大家在严格遵守国家安全观影的……绝命时钟222终极海报预告双发命运兜转爱人能否再续前缘由中国电影集团公司引进、中国电影股份有限公司发行,将于1月26日上映的电影《绝命时钟2:22》,今日曝光了干柴烈火版终极预告及终极海报。浓情蜜意碰撞宿世冤仇,撩人又抓心。电影男……红海行动大年初一燃情上映中国海军接你回家由林超贤导演,梁凤英监制,张译、黄景瑜、海清、杜江主演,张涵予特别出演的军事动作巨制《红海行动》即将于2月16日(大年初一)在全国上映。近日,影片重磅发布带你回家版预告片及城市……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网