'''
unittest 单元测试的一个框架
框架:一堆工具的集合
在说unittest之前,先说几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
'''
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport
def calc(x,y):
return x/y
class TestCalc(unittest.TestCase):
def test_pass_case(self): # 函数不是test开头的, unittest.main() 不认为这是一个用例,则不会执行
'''这是一条通过的测试用例'''
print('这是通过用例')
res=calc(1,2)
self.assertEqual(0.5,res)
def setUp(self):
print('我是setUp') # 每条用例执行之前 都会执行setUp,可以作为前置条件
def tearDown(self):
print('我是tearDown') # 每条用例执行之后,都会执行tearDown
@classmethod
def setUpClass(cls):
print('我是setUpClass') # 所有用例执行之前,执行一次
@classmethod
def tearDownClass(cls):
print('我是tearDownClass') # 所有用例执行之后,执行一次
def test_case_a(self):
'''这就是一条瞎写的测试用例'''
print('test case is low')
def test_case_b(self):
'''这是一条普通的用例'''
res=(1,5)
self.assertEqual(0.2,res)
def test_fail_case(self):
'''这是一条失败的测试用例'''
print('这是失败用例')
res=calc(9,0)
self.assertEqual(ZeroDivisionError,res)
if __name__ == '__main__':
unittest.main() # 运行当前的python文件里所有的测试用例,执行用例顺序按照函数名字的顺序执行,光标放在哪里,执行哪条用例
# suite = unittest.TestSuite() # 测试用例集合
# suite.addTest(TestCalc('test_pass_case')) # 一个个添加用例
# suite.addTest(TestCalc('test_case_a'))
# suite.addTest(TestCalc('test_fail_case'))
# suite.addTests(unittest.makeSuite(TestCalc))# 添加所有用例
# f = open('report.html','wb') # 测试报告
# runner = HTMLTestRunner.HTMLTestRunner(stream=f,title='测试用例结果',description='这是一条通过的案例') # 测试报告
# runner.run(suite)
# result = BeautifulReport(suite)
# result.report(filename='我的测试报告',description='这是我的测试报告',log_path='')
Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作。
在说unittest之前,先说几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
下面写一个简单的单元测试用例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
import unittest
class MyTest(unittest.TestCase):#继承unittest.TestCase
def tearDown(self):
#每个测试用例执行之后做操作
print('111')
def setUp(self):
#每个测试用例执行之前做操作
print(22222)
def test_run(self):
self.assertEqual(1,1)
#测试用例
if __name__ == '__main__':
unittest.main()#运行所有的测试用例
|
下面是一些常用的断言,也就是校验结果
1
2
3
4
5
6
7
8
|
assertEqual(a, b) a == b
assertNotEqual(a, b) a != b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
|
那如何生成一个测试报告呢,需要加入另外一个模块了,HTMLTestRunner,这个模块需要自己安装,使用执行测试用例就会生成一个html的测试报告,里面会有每个测试用例的执行结果,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
import HTMLTestRunner
import unittest
class MyTest(unittest.TestCase):#继承unittest.TestCase
def tearDown(self):
#每个测试用例执行之后做操作
print('111')
def setUp(self):
#每个测试用例执行之前做操作
print(22222)
def test_run(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run2(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run3(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
def test_run1(self):
# self.assertEqual(1,1)
self.assertIs(1,1)
#测试用例
if __name__ == '__main__':
test_suite = unittest.TestSuite()#创建一个测试集合
test_suite.addTest(MyTest('test_run1'))#测试套件中添加测试用例
#test_suite.addTest(unittest.makeSuite(MyTest))#使用makeSuite方法添加所有的测试方法
fp = open('res.html','wb')#打开一个保存结果的html文件
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='api测试报告',description='测试情况')
#生成执行用例的对象
runner.run(test_suite)
#执行测试套件
|
如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:
1
2
3
4
5
6
7
8
9
10
|
import unittest,HTMLTestRunner
suite = unittest.TestSuite()#创建测试套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')
#找到某个目录下所有的以test开头的Python文件里面的测试用例
for case in all_cases:
suite.addTests(case)#把所有的测试用例添加进来
fp = open('res.html','wb')
runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')
runner.run(suite)
#运行测试
|
我们在后续进行持续集成的时候,要让代码自动运行,就会用到Jenkins了,但是上面产生的测试报告都是html格式的,Jenkins不认识,就在Jenkins里面显示不出来。那咱们就要产生一些Jenkins认识的测试报告,Jenkins认识xml格式的报告,那咱们就产生xml格式的呗,就需要用一个新的模块,xmlrunner,安装直接 pip install xmlrunner即可,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
import unittest
import xmlrunner
#导入这个模块
class My(unittest.TestCase):
def test1(self,a,b,c):
self.assertEqual(a+b,c)
if __name__=='__main__':
test_suite = unittest.TestSuite()
test_suite.addTest(unittest.makeSuite(My))
runner = xmlrunner.XMLTestRunner(output='report')#指定报告放的目录
runner.run(test_suite)
|
然后咱们运行,可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了