部分内容参照:http://blog.youkuaiyun.com/huilan_same/article/details/52944782
unittest是xUnit系列框架中的一员。
unittest核心工作原理
unittest中最核心的四个概念是: test case, test suite,test runner, test fixture 。
下面我们分别来解释这四个概念的意思,先来看一张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