认识python+unittest单元测试框架

认识python+unittest单元测试框架

1 准备工作

       因为我之前一直是做系统测试的,所以单元测试接触的比较少,python+unittest这套框架之前也没用过,这次在了解RPC测试框架过程中正好学习一下,这里把学习和实践过程记录一下,希望能给像我一样对这套框架不了解的同学提供一些参考。

1)windows上安装python(我用的是2.7版本):安装完成之后配置环境变量,之后可以通过pip安装需要的第三方库。

       3)windows上安装PyCharm(或者其他IDE)。

2 单元测试框架实践

2.1 unittest简介

       本节内容摘自网络。

python+unittest+HTMLTestRunner写的,这套框架主要是针对单元测试的。其中HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展,它可以生成 html的测试报告,而unittest作为标准python中的一个模块,是其它框架和工具的基础,所以了解unittest的原理对理解这套框架非常重要。下面图1简单描述了unittest的工作流程:

图1 unittest工作流程图

l 一个TestCase的实例就是一个测试用例。什么是测试用例呢?就是一个完整的测试流程,包括测试前准备环境的搭建(setUp),执行测试代码(run),以及测试后环境的还原(tearDown)。元测试(unit test)的本质也就在这里,一个测试用例是一个完整的测试单元,通过运行这个测试单元,可以对某一个问题进行验证。

l 而多个测试用例集合在一起,就是TestSuite,而且TestSuite也可以嵌套TestSuite。

l TestLoader是用来加载TestCase到TestSuite中的,其中有几个loadTestsFrom__()方法,就是从各个地方寻找TestCase,创建它们的实例,然后add到TestSuite中,再返回一个TestSuite实例。

l TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。

l 测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

这样整个流程就是首先是要写好TestCase,然后由TestLoader加载TestCase到TestSuite,然后由TextTestRunner来运行TestSuite,运行的结果保存在TextTestResult中,整个过程集成在unittest.main模块中。

2.2 最基础的执行

       了解了unittest的基本概念和工作流程之后,就可以根据网上的资料自己写一个最简单的工程实践一下,加深理解以下是我的实践步骤:

       1) 创建工程,创建.py文件(我工程里面叫Main.py)。

       2) 写一个待测试的类,我这里写个最简单的加法测试,类里面两个测试用例(别忘了import unittest):

       3)写主函数,并在主函数中执行unittest.main()(一会儿再解释)

       4)执行主文件:我是在pycharm的终端里执行的,结果如下图:

       5)把testB方法中expected=1改成expected=0,再执行:

       从上面的执行结果可以看出,SumTest方法继承unittest.TestCase,程序自动执行了SumTest类里的两个用例,并给出了正确的执行结果。现在来看看unittest.main()到底干了什么,能让程序自动去执行用例。

       右键main,go to declaration,一步步查看这个方法最终执行的是什么:

       查到最后发现执行的是TestProgram方法:

       接下来看看这个方法的构造函数,其中最重要的是最后两句:

                    self.parseArgs(argv)#查找当前moduleTestsuite

            self.runTests()#执行测试

       其实这个方法的主要两步为:1)找要测试的testcase并加入到Testsuite;2)执行Testsuite并返回结果给TestResult。这里要注意的是,默认情况下,用例必须以test开头才能被识别,这是由Python27\Lib\unittest\loader.py文件中决定的,所以如果不是以test开头的,默认是不识别的。如果非要用,可以换一种写法。

       不是以test开头的用例执行方法:

       通过以上简单的例子,基本可以理解unittest的基础了,但是其实里面还有很多需要注意的地方,这里先介绍到这里。接下来说说Testcase或者TestSuite最基础的操作:

       Testcase比较好理解,跟普通的类方法相似。

       TestSuite我理解是对Testcase的一个集中管理,Python27\Lib\unittest\loader.py模块的TestLoader类提供了多种不同情境find testcase方法:

1)loadTestsFromTestCase利用给出的TestCase类名称返回找到所有的suite。

2)loadTestsFromMoudle利用给出的Moudle返回找到所有的suite。

3)loadTestsFromName利用给出的Moudle名称返回找到所有的suite。

4)discover返回给定目录下符合pattern类型(默认test*.py)所有的suite。

       可以分别试试这些方法。

2.3 HTMLTestRunner使用

       需要使用HTMLTestRunner生成测试报告,首先得在工程中添加HTMLTeestRunner.py文件:可以在网上下载http://tungwaiyip.info/software/HTMLTestRunner.html,然后再自己个根据实际环境进行修改。使用步骤如下:

       1)创建HTMLTeestRunner.py文件:可选各种方式,只要能用就行,由于我对前端不熟悉,文件具体内容这里不做讲解。

       2)在主文件中修改代码,当然别忘了import HTMLTestRunner:

       重新执行该文件,就会在项目根目录下生成result.html文件

       原理简单点讲就是:unittest中通过任何方式调用run函数执行的结果都会传一个result,这个result就是TestResult对象或者是其子类的对象,我们每次执行的结果都会调用其addFailure,addSuccess,addSkip....等方法将执行结果保存到TestResult实例属性中。而HTMLTestRunner模块也是在继承在TestResult类的基础上的,所以可以通过HTMLTestRunner将结果进行展示即可,至于展示的效果,其实就可以在HTMLTeestRunner.py中自定义了。

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值