一,单元测试
单元测试是用来对一个模块、一个函数或者一个类来进行正确性检验的测试工作。
单元测试的加载:通过unittest.main()来启动单元测试的测试模块;添加到testsuite集合中再加载所有的被测试对象,而testsuit里存放的就是单元测试的用例。
补充查看模块内容及使用方法 代码如下:
import unittest
import HTMLTestRunner
from BeautifulReport import BeautifulReport
memblist1 = dir(unittest) # 查看模块有哪些成员
for memb in memblist1 : #查看具体成员的用法
cur = getattr(unittest,memb)
print(help(cur))
memblist = dir(HTMLTestRunner) # 查看模块有哪些成员
for memb in memblist : #查看具体成员的用法
cur = getattr(HTMLTestRunner,memb)
print(help(cur))
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起,就是TestSuite
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
整个单元测试框架的逻辑分三步走:第一步testloader根据传入的参数获得相应的测试用例,即对应具体的测试方法,
然后makesuite在把所有的测试用例组装成testsuite,最后把testsiute传给testrunner进行执行。
而我们通常执行的unittest.main(),其实就是unittest.testprom方法,其执行的功能就是上面分析的三步,在第一步中其传入的参数是自身的模块__main__;
在第二步中把自身模块中的所有测试类中的测试方法提取出来,并生成测试套件;最后再把测试套件传递给testrunner进行具体的测试。
常用断言:
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
实例:
import unittest
def calc(x,y): #被测模块
return x+y
class TestCalc(unittest.TestCase):#单元测试模块
def test_pass_case(self):
‘‘‘这是通过的测试用例‘‘‘
print(‘这个通过用例‘)
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的结果不一样
def test_fail_case(self):
‘‘‘这是失败的测试用例‘‘‘
print(‘这个是失败的用例‘)
res = calc(1, 2)
self.assertEqual(5, res)
if __name__ ==‘__main__‘:
unittest.main() #他会帮你运行当前这个python里面所有的测试用例。
注:以test
开头的方法就是测试方法,不以test
开头的方法不被认为是测试方法,测试的时候不会被执行。用例执行的顺序是按照字母排列的顺序来的
输出结果::【F表示一个fail, F前的点表示一个通过,有E的话表示程序自身异常】
F.
======================================================================
FAIL: test_fail_case (__main__.TestCalc)
这是失败的测试用例
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:/Users/lidal/PycharmProjects/llq-code/day7/练习.py", line 16, in test_fail_case
self.assertEqual(5, res)
AssertionError: 5 != 3
----------------------------------------------------------------------
Ran 2 tests in 0.000s
FAILED (failures=1)
二,setUp 与 tearDown
setUp() 与 tearDown() 这两个方法会分别在每调用一个测试方法的前后分别被执行
setUp()
和tearDown()
方法有什么用呢?设想你的测试需要启动一个数据库,这时,就可以在setUp()
方法中连接数据库,在tearDown()
方法中关闭数据库,这样,不必在每个测试方法中重复相同的代码:
class TestCalc(unittest.TestCase):#单元测试模块
def test_pass_case(self):
‘‘‘这是通过的测试用例‘‘‘
print(‘这个通过用例‘)
res = calc(1,2)
self.assertEqual(3,res)
self.assertNotEqual(2,res)#返回的结果不一样
def test_fail_case(self):
‘‘‘这是失败的测试用例‘‘‘
print(‘这个是失败的用例‘)
res = calc(1, 2)
self.assertEqual(5, res)
def test_a(self):
print(‘hahahaha ‘)
def setUp(self):
print(‘setUp。。‘)
# 每个用例运行之前都会执行它
def tearDown(self):
# 每个用用例运行完之后都会执行它
print(‘tearDown。。‘)
三,setUpClass 与 tearDownClass
setUpClass() 与 tearDownClass()这两个方法会在所有的用例执行前后执行一次
使用方法如下:
@classmethod
def setUpClass(cls):
print(‘我是setupClass‘)
@classmethod
def tearDownClass(cls):
print(‘我是tearDownClass‘)
四,输出html 格式的测试报告
a,需安装 HTMLTestRunner 模块 (需自己手动导入至 )
import HTMLTestRunner
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
f = open(‘report.html‘,‘wb‘)#打开一个测试报告的文件
runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘test_report‘,
description=‘描述‘)
runner.run(suite) #运行
b,安装 BeautifulReport 模块 ,较HTMLTsetRunner 模块生成的测试报告更直观,漂亮(同样需要自己手动导入)
from BeautifulReport import BeautifulReport
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
# f = open(‘report.html‘,‘wb‘)#打开一个测试报告的文件
# runner = HTMLTestRunner.HTMLTestRunner(stream=f,title=‘test_report‘,
# description=‘描述‘)
# runner.run(suite) #运行
result = BeautifulReport(suite)
result.report(filename=‘testreport‘, description=‘描述‘, log_path=‘.‘)
五,输出xml 格式的测试报告,供后续jenkins 使用
pip install xmlrunner 命令安装 xmlrunner 模块
import xmlrunner
if __name__ ==‘__main__‘:
suite = unittest.TestSuite()#定义一个测试套件
# suite.addTest(TestCalc(‘test_pass_case‘))
# suite.addTest(TestCalc(‘test_a‘))
# suite.addTest(TestCalc(‘test_fail_case‘)) #单个添加用例的
suite.addTests(unittest.makeSuite(TestCalc)) #这个类里面的所有测试用例
runner = xmlrunner.XMLTestRunner(output=‘report‘) # 指定报告放的目录
runner.run(suite)
输出结果:可以看到在report目录下已经产生了xml格式的报告了,而且还自动把日期加上了