目录
引言
准备
项目
总结
引言
我想现在应该很少有公司一直在主推TDD了,因为这无形之中增加了工作量,在追求极致开发的时候,一般都是能先上就先上,把主体的功能不管三七二十一怼出来再说,出了问题就直接改,也不管你的代码和之前兼容不兼容,一个大的工程,测试是绝对少不了的,覆盖率更是必须达到一定的程度,这既保证了当前的开发的新的feature 与整体能兼容,也能保证工程的整体稳定性,在构思新的功能之前,我们应该从整体规划我们新的功能应该表现出来的输出结果和异常,这并不是说测试是万能的,有了测试是万无一失的,因为总有一些地主是测试没有覆盖的地方,我们需要在现有,人为,可控的情况下将错误降低,而不是让我们的代码腐烂和难以维护。
准备
pythont版本: 2.7
使用pip 安装以下库
项目
简单测试
一般来说,当我们要写一个测试py文件时候,名字都要以test为前缀,或者用test结尾,我们先来创建一个简单的测试除法的python文件,名为,直接上代码
细看代码,你就知道咱们的测试的function同样需要使用test开头(这是默认的约束),我们使用assert断言语法,关于断言的使用,你可以自己先上网找找,OK,测试的文件,测试的方法咱们已经写好了,我们要开始跑测试了,切换到这个测试文件所在的目录,然后在shell下执行命令
接着,我们就可以看到我们第一个测试跑出的结果了
咱们这个function有一个地方肯定报错,就是当我们输入0的时候,所以当我们遇到这些function会特定的抛出一些”可控范围”内的错误时,我们也要在测试中反应出来
这个时候咱们跑一下测试,结果如下:
报错的地方咱们没有捕获到,出现了除0的错误 ,这个时候咱们就要回头修改咱们的function,使得他能正常的处理一些这些特别输入的地方:
这次咱们再跑一下测试,就可以通过了,关于输入字符串等其它非正常的输入,我就不一一讲解了,我们来讲下一个pytest的特性Fixtures
使用Pytest的 Fixtures
在接下来的章节中,我们将探索使用pytest的一些高级特性,我们先准备一个小型的项目,接下来,我们将写一个的应用,这个应用允许用户增加或者消费钱。他主要有两个方法:以及。我们来编写一个 的文件
首先我们在测试用例中,导入 class 这个异常,当我们使用的钱超出钱包所持有的钱的时候,我们就会抛出这个异常出来. 你可以明显的看到,当我们要测试这个的方方面面的行为的时候.在我们使用花钱或者增加钱的时候,我们这个类可以准确的反应出我们的当前持有的金额,并且,当我们超额透支的时候,也会直接抛出 的error 来,OK,我们根据我们的测试反过来编写我们的功能类
Ok,根据测试编写的功能类写完之后,我们跑一下测试
改进我们的测试
你可以明显的看到,当我们要测试wallet 的方方面面的时候,我们都首先要实例化这样一个类,然后再进行下一步的操作,这就是 为什么这么方便好用了. 他可以帮我们省不少code 的编写,不多说了,直接上代码吧.
我们通过使用装饰器 ,将我们以及参数化我们的测试用例的每个方法里面,这样不仅节省了非常多的代码量,而且我们的测试更直观了。
参数化测试方法
现在我们已经独立的测试了这个class 里面的各个方法,接下来我们要测试各种组合形式的方法了。我们假定这样的测试”钱包里面有30,我们先支出20,然后增加100,再然后又消费了50,这个时候余额是多少”。这个时候一想,这不是在每一个操作之后都要写大量的assert 了吗。这个时候,咱们就需要使用这个方案了: 参数化测试方法,为了应对以上的种种情况,我们编写如下的代码
我们可以看到,我们的参数 earned , spend ,expected 参数 在第一次测试的时候取值为
在第二次测试的时候取值为
这样就方便你理解了。
总结
这次我们引出为什么要使用测试,并使用TDD反过来编写我们的功能类,并且针对我们测试的情况的逐步改进,引入了pytest的一些高级特性的使用
领取专属 10元无门槛券
私享最新 技术干货