咨询热线:18839586270 联系人:江海霞 地址:新疆维吾尔自治省乌鲁木齐市乌鲁木齐市西虹西路554号
单元测试基础
来源:金钻最新网址 发布时间:2019-11-21 点击量:60
为什么要有这篇文章呢?
个人在不断实践中越发觉得,单元测试对于代码质量的保障真的太有意义了,至少能体现在如下两个方面:
①让你写出更好的代码,可测试的代码一定是优雅的代码(为了可测试,你必须要解耦,必须要遵循较好的设计模式)
②让你重构之类的操作更加放心,因为测试会告诉你影响了哪些功能点
所以想简单写写关于单元测试的一些基础相关东西
单元测试是什么?
也不想上网找定义,就说说大概自己的几点理解:
单元测试是单元的,即只是对一个系统里某个特定模块(或者方法)有限条件下(比如某个if分支)的测试
单元测试不应该依赖任何外部系统(如网络/数据库甚至是时间)所有依赖都应该通过依赖注入的形式获取
单元测试是可以重放的,一次成功后任意情况重试应该也总是成功的
举个栗子
为了说明白单元测试,下面写一个简单的代码
首先他的功能很简单,返回当天是什么时刻(上午/下午之类的),具体需求就是
0到6点返回“晚上” 6到12点返回“上午” 12到18点返回”下午” 18点到24点显示”傍晚”(别纠结谁家傍晚还能到24点这种细节了)
此时我们可能会写出如下代码:
1 public string 当天时刻() 2 { 3 DateTime time = DateTime.Now; 4 if(time.Hour >= 0 && time.Hour < 6) 5 { 6 return "晚上"; 7 } 8 if(time.Hour >= 6 && time.Hour < 12) 9 { 10 return "上午"; 11 } 12 if(time.Hour >= 12 && time.Hour < 18) 13 { 14 return "下午" 15 } 16 return "傍晚"; 17 }
上面这段代码,从功能角度来说,是完美的,他完美的实现了需求。
但是从测试的角度来说,他是灾难性的,因为这个代码不可测试。
为什么这么说呢?
现在电脑时间是上午9点,我运行这个程序,我预期他返回是“上午”。
好了,测试通过,然后另一个小伙伴可能他电脑时钟设置有问题也同一时刻运行却返回了“傍晚”
或者说我在下午的时候运行他返回了给我“下午”
在这里,这个程序执行的结果不确定,他会受到电脑时钟的影响。
为什么这个代码不可以测试呢?
我们来分析下这个代码,最重要的一点就是
DateTime time = DateTime.Now;
这句话是获取电脑当前的时间。
我们需要的功能是,告诉我现在是什么时刻,然后这段代码里杂合了获取时间的这么一个非需求内的功能(违反了单一职责)
另外”获取时间”因为是受到外部条件控制(电脑时钟),而这里明确的直接使用了DateTime.Now,所以也可能违反了依赖倒置原则
如何解决呢?
其实并不复杂,我们只要将方法内获取时间改为通过参数的形式传递进来好了
1 public string 当天时刻(DateTime time) 2 { 3 if(time.Hour >= 0 && time.Hour < 6) 4 { 5 return "晚上"; 6 } 7 if(time.Hour >= 6 && time.Hour < 12) 8 { 9 return "上午"; 10 } 11 if(time.Hour >= 12 && time.Hour < 18) 12 { 13 return "下午" 14 } 15 return "傍晚"; 16 } 17
这样做意味着什么呢?
意味着将时间的获取交给外部去处理,而方法内将只专注于处理“获取当天时刻”相关的主线逻辑,遵循单一职责
此时如果我要对这个方法进行测试的话就可以写出如下单元测试用例,且下述用例永远不会受到外部条件影响,只要”当天时刻”这个方法不出bug他永远该是对的就是对的
1 //简化代码,假设当天时刻是当前类里的静态方法,假设使用了Shouldly类库来做Assert 2 [Fact] 3 public void 上午九点_应该为上午() 4 { 5 当天时刻(new DateTime(2018,1,1,9,0,0)).ShouldBe("上午") 6 } 7 8 [Fact] 9 public void 下午三点_应该为下午() 10 { 11 当天时刻(new DateTime(2018,1,1,15,0,0)).ShouldBe("下午") 12 }
有了这个单元测试后,日后是不是想重构“当天时刻”这个方法也多了个保障,因为一旦你改错了,单元测试会诚实告诉你改出问题了
而且通过将代码改为“可测试”的,也将代码的优雅程度提高,使其遵循了单一职责,并且避免了违反依赖倒置原则
另外这个故事告诉我们,小手一抖,就能违反n个原则。。。(隔壁家:不就改了个DateTime.Now嘛,怎么就搞出那么多有的没的)
相关产品
-
我们很高兴又为诺唯真游轮交付了一艘游轮,过去15年来,我们一直与诺唯真游轮保持着紧密的合作伙伴关系,对此我们荣幸至极。我们相信这艘专为阿拉斯加游轮体验量身定制的游轮定会超出客人的期待。
-
一次难得的赴台交换学习经历,一段有趣的文化交汇碰撞过程……广东大学生庄晓武把自己赴台学习一个多月以来的所见所闻、所思所想,提笔写成信,寄给了台湾当局领导人马英九。没想到才几天的功夫,马英九嘱托助手给晓武回了封信。信中,马英九特别感谢阿武的热情支持,并祝愿阿武“学业精进、健康快乐”,还附上两张自己的亲笔签名照,敦请晓武查收存念。
-
“保持中法关系健康稳定发展,不仅有利于两国和两国人民,也有利于世界的和平、稳定、繁荣。中方愿同法方携手努力,推动紧密持久的中法全面战略伙伴关系不断迈向更高水平。”
-
很多时候,汽车与腕表设计有着很大的相通性,经典造型虽然人见人爱,但固守不变的结果往往意味着失败。另一方面,随着知名度的不断增长,不同消费者的口味、需求不尽相同。这就要求开发部门产出同时满足个性需求,又能适应普罗大众想法,既经典,又时尚的作品。听起来是不是鱼和熊掌都要兼得?
-
照片用了大量青灰色,但是没有掩盖整体青春洋溢的感觉,模特手中的鲜花和服饰造型依旧散发出年轻热烈的气息,表达出的是青春的烂漫和无忧,故名《花样年华》
-
今年6月,宁先生带队前往美国考察后,相中一款波音737—300的机型,和美国的一家公司取得了联系。就这样,宁先生专门组建一个谈判小组开始启动购买退役波音飞机一事。
-
国民党内的“总统”人选令国民党员焦虑不已,而上周发生的“核污染食品”事件则让岛内民众人心惶惶,骂声一片。据报道,日本受核辐射污染的福岛等地生产的泡面、酱油、饮料等食品,日前涉嫌以更换产地标签的形式输入台湾,数量逾百吨,涉及违规进口商13家。由于问题食品的真实产地只有5%为日文标示,其余均以代码形式呈现。台卫生部门若要查找还得费一番周折,而之前未被拦下者则早已进入市场。如果民众长期食用含高剂量放射性物质的食物,会增加患癌症的风险。
-
然而,让何某想不到的是,从当年5月份一直到年底,何某一直在等待中度过,而每每他致电给南部老板的时候,该老板却表示称“现在送居留都是这样的,批的很慢,你别急,慢慢等”。而在同年12月份,何某则接到其老乡电话,何某告诉记者:“这两个老乡比我顺利得多,其中一个也是因为等不了那么久,所以到其他地方去送了,而另一个是跟我一样等消息的。但是他们送的都比我早,所以2011年年底的时候,两个老乡都批准了,电话也都打过来了。”
热点资讯
- 联想Z5升级ZUI4.0!ZUKEdge、Z2Pro等已在路上2019-11-05
- 欧盟委员会主席胡乱摆动妇女头发的行为被讽刺为“欧盟白痴”|欧盟委员会|容克|中世纪。2019-11-08
- 印度控制生育靠女性结扎,大多数没用过避孕套2019-11-16
- ?黑龙江省正式加入国家融资担保体系2019-10-31
- [午间辣白菜]手机修理工具17件套19.2元、伸缩衣杆5.2元2019-07-01
- 吉林将迎来大风和雨雪降温出行、旅游需做好应对准备2019-07-01
- 《醉驾模拟器》登陆Steam售价仅11元,深刻感悟醉驾带来的危害2019-07-01
- 女主播起诉火山小视频索赔近14万:无法正常提现2019-11-16