关键词:
为什么要有这篇文章呢?
个人在不断实践中越发觉得,单元测试对于代码质量的保障真的太有意义了,至少能体现在如下两个方面:
①让你写出更好的代码,可测试的代码一定是优雅的代码(为了可测试,你必须要解耦,必须要遵循较好的设计模式)
②让你重构之类的操作更加放心,因为测试会告诉你影响了哪些功能点
所以想简单写写关于单元测试的一些基础相关东西
单元测试是什么?
也不想上网找定义,就说说大概自己的几点理解:
单元测试是单元的,即只是对一个系统里某个特定模块(或者方法)有限条件下(比如某个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嘛,怎么就搞出那么多有的没的)
python基础篇:单元测试unittest(代码片段)
一:简介测试类必须继承unittest.TestCase,测试方法名必须以test开头才算测试方法)测试方法如果是以test开头后面跟数字,测试执行顺序就按照数字顺序来执行,否则按照方法的前后声明来执行一个测试方法叫一个Te... 查看详情
python基础篇:单元测试unittest(代码片段)
一:简介测试类必须继承unittest.TestCase,测试方法名必须以test开头才算测试方法)测试方法如果是以test开头后面跟数字,测试执行顺序就按照数字顺序来执行,否则按照方法的前后声明来执行一个测试方法叫一个Te... 查看详情
大数据必学java基础(八十三):junit单元测试(代码片段)
文章目录Junit单元测试一、引入1、软件测试的目的2、测试分类二、没有Junit的情况下如何测试三、Junit的使用四、@Before_@AfterJunit单元测试一、引入1、软件测试的目的软件测试的目的是在规定的条件下对程序进行操作,... 查看详情
浅谈单元测试(代码片段)
单元测试或是最好的项目文档。很早之前在学习使用Java做测试的时候,得到过一个神秘大佬的帮助,在一起聊过单元测试,基本结论就是:单元测试大概率没啥鸟用。众所周知,自动化测试相比手动测试一个比较明显的特点就... 查看详情
go语言学习笔记—基础—go工具(5.1):单元测试——测试和验证代码的框架(代码片段)
单元测试是指,是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,如C语言中指一个函数,Java中指一个类,图形化软件中指一个窗口或菜单等。总的来说,单元是认为规定的最小可... 查看详情
测试基础点(代码片段)
...试模型v/wv模型:需求分析-概要设计-详细设计-编码-单元测试-集成测试-系统测试-验收测试w模型:需求分析-概要设计-详细设计-编码-集成-实施-交付 需求分析测试-概要设计测试-详细设计测试-单元测试-集成测试-系统测... 查看详情
如何使用python进行单元测试建议收藏(代码片段)
...中,我将通过讨论以下主题来研究如何使用Python创建单元测试。单元测试基础可用的Python测试框架测试设计原则代码覆盖率单元测试基础我使用FizzBuzz编码方式创建了单元测试示例。编码类型是程序员的练习。在这个练习中... 查看详情
如何使用python进行单元测试建议收藏(代码片段)
...中,我将通过讨论以下主题来研究如何使用Python创建单元测试。单元测试基础可用的Python测试框架测试设计原则代码覆盖率单元测试基础我使用FizzBuzz编码方式创建了单元测试示例。编码类型是程序员的练习。在这个练习中... 查看详情
go基础之单元测试反射网络编程操作redis操作mysql(代码片段)
Go基础(四)之单元测试、反射、网络编程、操作Redis、操作MySQL一、单元测试二、反射2.1两个重要函数和类型2.2类型(Type)与种类(Kind)2.3通过反射获取值信息2.3.1从反射值对象获取值2.3.2通过反射访问结... 查看详情
go-单元测试详解与代码(代码片段)
目录概述Go的单元测试基础知识快速入门进阶单个文件的测试单个函数的测试单元测试覆盖率参考概述常言道,不会测试的程序猿不是好的产品经理!!!现在越来越多测试和运维的工作也需要研发来做了,本... 查看详情
pythonunittest详解一(基础入门)(代码片段)
unittest单元测试框架最初受JUnit启发,与其他语言的主要单元测试框架具有相似的风格。它支持测试自动化,支持开启或关闭某个测试,支持结合测试。另外它可以生成各个单元测试的报告。为了实现以上功能,unitTest提供了... 查看详情
[j2ee][单元测试](代码片段)
[J2EE][单元测试]标签(空格分隔):未分类JUnit单元测试基础要点1.JUnit是一种测试代码的框架,测试的目的是:保证代码没错,而不是保证代码正确。2.测试类一般不要和目标类放在一起,但编译成的cla... 查看详情
单元测试基础知识(代码片段)
...档http://junit.org/junit4/TestNg是一款基于junit框架上的加强版单元测试框架,具备更多更强大的功能,能够执行比较复杂的程序代码,具体用法这里也不介绍了,可以花十分钟看看官方文档http://testng.org/doc/documentation-main.htmlRunnerJUnit... 查看详情
python单元测试:unittest使用简介(代码片段)
一、概述 本文介绍python的单元测试框架unittest,这是Python自带的标准模块unittest。unittest是基于java中的流行单元测试框架junit设计的,其功能强大且灵活,对于熟悉junit的人来说掌握unittest很简单。 unittest涉及... 查看详情
pytest基础自学系列(代码片段)
...与大家分享,侵权即删,谢谢支持!一、pytest单元测试框架(1)什么是单元测试框架单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。(2)单... 查看详情
go基础之单元测试反射网络编程操作redis操作mysql(代码片段)
Go基础(四)之单元测试、反射、网络编程、操作Redis、操作MySQL一、单元测试二、反射2.1两个重要函数和类型2.2类型(Type)与种类(Kind)2.3通过反射获取值信息2.3.1从反射值对象获取值2.3.2通过反射访问结... 查看详情
从零开始写博客系统——测试我们的代码(单元测试)(代码片段)
...何测试我们的代码。测试的类别我们的后台代码可以使用单元测试和接口测试来覆盖。所谓单元测试,就是直接测试我们的代码逻辑,而不需要启动服务。而接口测试,则是把我们的服务启动后,调用接口检查接口的返回值是否... 查看详情
unittest测试框架_1_基础介绍(代码片段)
unittest,python自带的单元测试框架。该框架的结构如下:1、Testcase:一个Testcase就是一个测试用例,包括测试前环境的搭建(setUP)、实现测试过程的代码,以及测试后环境的还原(TearDown).2、TestSuite:一个功能的验证,需要个多个... 查看详情