unittest 官方文档:https://docs.python.org/zh-cn/3/library/unittest.html
#一、初识unittest
1、测试类必须继承unittest.TestCase
2、setUp、tearDown方法每个用例执行完都会执行
3、使用类方法装饰器@classmethod,setUpClass、tearDownClass方法只执行一次
4、实例
#test unittest
import unittest
class TestClass(unittest.TestCase):
@classmethod
#类方法,每个类只执行一次
def setUpClass(cls):
print 'setUpClass***************************************'
def setUp(self):
print 'setUp *******************'
def test_case1(self):
print 'case1=============='
def test_case2(self):
print 'case2============'
def tearDown(self):
print 'tearDown****************'
@classmethod
# 类方法,每个类只执行一次
def tearDownClass(cls):
print 'tearDownClass****************************************'
if __name__ =='__main__':
#执行用例
unittest.main()
运行结果:
5、用例方法名必须符合unittest的规则test_开头,用例方法的执行顺序是按照test_后的字母顺序执行的,如果需要依赖应该尽量按照字母顺序,先使用的放在前面。
6、用例方法之间尽量独立,如果实在需要使用共同的内容,可用全局变量。
7、断言:使用unittest自带的assert,具体断言类型参考官方文档。
8、全局变量实例
#coding:utf-8
import unittest
from myTest.utils.DealRequest import *
class TestDemo(unittest.TestCase):
def setUp(self):
res = None
print'start++++++++++++++++++++++++++++++'
def test_case1(self):
url = 'http://mapi.itougu.jrj.com.cn/wireless/search/'
data = {
'type': 'view',
'keyword': '测试',
'from': 0,
'size': 10,
}
res = DealRequest(url,'GET',data)
print res.res
#定义全局变量
globals()['common'] ='1234567890'
retCode = res.res['retCode']
#断言
self.assertEqual(retCode,0,'success')
def test_case2(self):
url = 'http://mapi.itougu.jrj.com.cn/wireless/search/'
data = {
'type': 'view',
'keyword': '测试',
'from': 0,
'size': 10,
}
res = DealRequest(url, 'POST', data)
print type(res.res)
#调用全局变量
print common
retCode = res.res['retCode']
#断言
self.assertEqual(retCode, 0, 'success')
if __name__=='__main__':
unittest.main()
文件结构:
#二、组织用例
##1、使用TestSuite()测试套件组织用例
主要使用方法:
addTest()添加单个用例
addTests()添加用例列表
TestSuite源码:
class TestSuite(Testable):
def __init__(self, tests: Iterable[Testable] = ...) -> None: ...
def addTest(self, test: Testable) -> None: ...
def addTests(self, tests: Iterable[Testable]) -> None: ...
def run(self, result: TestResult) -> None: ...
def debug(self) -> None: ...
def countTestCases(self) -> int: ...
def __iter__(self) -> Iterator[Testable]: ...
调用TestSuite实例使用TextTestRunner类的run方法
结构如下:
本实例是使用TestSuite执行testDemo2里面的一个用例case
- testDemo2.py 源码
#coding:utf-8
import unittest
class testDemo2(unittest.TestCase):
def test_demo2(self):
print'test_demo2================='
def test_demo22(self):
print 'test_demo22=============='
def suite():
suite = unittest.TestSuite()
suite.addTest(testDemo2('test_demo22'))
return suite
- test_multiDemos.py 源码
#coding:utf-8
import unittest
from myTest.case import testDemo2
if __name__=='__main__':
runner = unittest.TextTestRunner()
runner.run(testDemo2.suite())
##2、使用discover组织用例
当用例数特别多时,一个一个添加到用例套件中就会比较麻烦,我们可以使用discover自动检测到用例文件,然后统一添加到用例套件中,这里的用例文件必须以指定的pattern命名才能被发现。
看源码。
结构:
执行文件:
#coding:utf-8
import unittest
from myTest.case import *
#指定扫描的用例路径
case_path = '../case'
def get_allcase():
#扫描该路径下的所有用例文件
discover = unittest.defaultTestLoader.discover(case_path,pattern='test*.py')
suite = unittest.TestSuite()
#将用例添加到套件中
suite.addTest(discover)
return suite
if __name__=='__main__':
#执行用例
runner = unittest.TextTestRunner()
runner.run(get_allcase())
test_demo1.py
#coding:utf-8
import unittest
class testDemo1(unittest.TestCase):
def test_demo1(self):
print"test_demo1======================="
def test_demo11(self):
print 'test_demo11====================='
testDemo2.py
#coding:utf-8
import unittest
class testDemo2(unittest.TestCase):
def test_demo2(self):
print'test_demo2================='
def test_demo22(self):
print 'test_demo22=============='
def suite():
suite = unittest.TestSuite()
suite.addTest(testDemo2('test_demo22'))
return suite
执行结果:
##3、跳过某个用例 使用skip装饰器
将testDemo2中的test_demo22跳过
运行结果如下:
还可以设置跳过条件,更多跳过用例语法参见官方文档。
#三、使用HTMLTestRunner生成报告
1、源码
#coding:utf-8
import unittest
from HTMLTestRunner import HTMLTestRunner
from myTest.case.test_demo1 import TestDemo
from myTest.case import *
#指定扫描的用例路径
case_path = '../case'
#扫描制定的用例
def get_allcase():
discover = unittest.defaultTestLoader.discover(case_path,pattern='test_*.py')
suite = unittest.TestSuite()
suite.addTest(discover)
return suite
if __name__=='__main__':
#1、打开文件,如果没有创建文件,可读写方式,重写
fp = file('my_report.html', 'wb')
#2、实例化HTMLTestRunner
runner = HTMLTestRunner(
stream=fp,
title='My unit test',
description='This demonstrates the report output by HTMLTestRunner.'
)
#3、组织测试用例
suite = unittest.TestSuite()
suite.addTest(get_allcase())
#4、执行用例并生成测试报告
runner.run(suite)
#5、关闭文件
fp.close()
执行结果:
2、这里遇到一个问题,用例文件中如果有打印语句时会报错,但是未解决。