第31节:unittest基本介绍

来源:互联网 发布:碣石鱼刺车行淘宝 编辑:程序博客网 时间:2024/05/04 13:32

部分内容参照:http://blog.csdn.net/huilan_same/article/details/52944782

unittest是xUnit系列框架中的一员。

unittest核心工作原理

unittest中最核心的四个概念是:test case, test suite,test runner, test fixture

下面我们分别来解释这四个概念的意思,先来看一张unittest的静态类图(下面的类图以及解释均来源于网络,原文链接):

unittest类图

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

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

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

  • TextTestRunner是来执行测试用例的,其中的run(test)会执行TestSuite/TestCase中的run(result)方法。 
    测试的结果会保存到TextTestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息。

  • 而对一个测试用例环境的搭建和销毁,是一个fixture


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


测试类:



执行说明:

1. 在第一行会给出了每一个用例执行的结果的标识,成功是 .,失败是 F,出错是 E,跳过是 S

2. 测试的执行跟方法的顺序没有关系

3. 每个测试方法均以 test 开头,否则是不被unittest识别的

4. 通过右键"Python Run"执行结果:有执行结果标识,即成功为 .

通过右键“python unit-test"执行结果:没有执行结果标识

前置和后置

1.setUp:在写测试用例的时候,每次操作其实都是基于打开浏览器输入对应网址这些操作,这个就是执行用例的前置条件。

2.tearDown:执行完用例后,为了不影响下一次用例的执行,一般有个数据还原的过程,这就是执行用例的后置条件。


unittest的执行顺序

1. 我们添加到TestSuite中的case是会按照添加的顺序执行的

例:

2. unittest.main() 是按用例名称排序执行的

例:


如何测试多个测试文件

1. 可通过suites.addTests(tests),执行多个测试文件中的测试用例

说明:该方法通过右键python run 和 python unit-test均可执行。

图一为:python run执行截图


图二为:python unit-test执行结果


说明:通过python unit-test执行的结果有误。只有两个测试方法,unit-test执行结果中却显示为 3 tests,先记录再找原因。

2.可用addTests()+unittest.TestLoader()执行多个测试文件中的测试用例

经实验:通过右键python run执行并存有结果,实例如下:

A:suites.addTests(unittest.TestLoader().loadTestsFromTestCase(mycount)) #mycount为类名

脚本:需导入引用类,否则报错


执行结果:



B:suites.addTests(unittest.TestLoader().loadTestsFromModule(test_mathfunc)) # test_mathfunc为文件名

脚本:说明:需导入引用的文件名



执行结果:


说明:即使在脚本中指定了要执行的测试方法,还是会执行该模块下的所有测试方法。

suites.addTests(unittest.TestLoader().loadTestsFromModule(test_mathfunc.TestMathFunc.test_sub))


C:suites.addTests(unittest.TestLoader().loadTestsFromName("test_mathfunc.TestMathFunc")) #test_mathfunc为文件名,TestMathFunc为类名,执行该类下所有测试方法

脚本:说明:在同一包下,可不用导入该方法及该方法所在的文件及类


test_mathfunc.TestMathFunc文件截图


执行结果:


suites.addTests(unittest.TestLoader().loadTestsFromName("test_mathfunc.TestMathFunc.test_sub"))#test_mathfunc为文件名,TestMathFunc为类名,test_sub为方法名,执行指定测试方法

脚本:说明:在同一包下,可不用导入该方法及该方法所在的文件及类


执行结果:



D:suites.addTests(unittest.TestLoader().loadTestsFromNames(["test_mathfunc.TestMathFunc.test_sub"])) #可把要执行的测试名称放入列表[]中。

脚本:



 

结果:


说明:

若要执行多个测试方法时,语句如下:

suites.addTests(unittest.TestLoader().loadTestsFromNames(["test_mathfunc.TestMathFunc.test_sub","test_mathfunc.TestMathFunc.test_add"]))


unittest批量执行

可通过unittet里面的discover方法来加载用例。加载用例后,用unittest里面的TextTestRunner的run方法去一次执行多个脚本的用例

1.discover方法里面有三个参数:

-case_dir:这个是待执行用例的目录。

-pattern:这个是匹配脚本名称的规则,test*.py意思是匹配test开头的所有脚本。

-top_level_dir:这个是顶层目录的名称,一般默认等于None就行了。

2.discover加载到的用例是一个list集合,需要重新写入到一个list对象testcase里,这样就可以用unittest里面的TextTestRunner这里类的run方法去执行。


脚本目录结构:


testcases--test_add.py


testcases---test_sub.py


util---count.py


all_testcase.py


批量执行结果:


将执行结果保存到log.txt中。

首先,在项目目录下新建一个report目录

其次:启动CMD,在CMD中,进入项目目录,例:本例:E:\wangxh_workspace\test_unittest_python\src\discoverdemo

再次:执行命令:Python all_testcase.py >> report/log.txt 2>&1

最后:到report目录下查看,会看到log.txt,且在该文件中存有执行记录


说明:若在项目路径下未建report止录,会报找不到指定路径的错误

Python all_testcase.py >> report/log.txt 2>&1命令解析:

Python all_testcase.py:通过python执行all_testcase.py文件

>>report/log.txt 将测试输出写入到 report 目录下的 log.txt 文件中
report/log.txt  2>&1 标准输出被重定向到文件report/log.txt,然后错误输出也重定向到和标准输出一样,所以错误输出也写入文件report/log.txt