单元测试:开发自测时写的代码
unittest基本原理:
♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用。
♦unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。
几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
unitest的目录结构一般如下:重要
unittest 测试
defcal(a,b):return a+b#
#res = cal(1,9)#if res == 3:#print('成功')#else:#raise Exception('测试失败')
#unittest python中的单元测试框架
importunittestclass MyTest(unittest.TestCase): #继承TestCase
def test_a(self): #函数的名字必须以test开头
res = cal(1,2)
self.assertEqual(3,res,msg='预期结果和实际结果不一致')deftest_b(self):
res= cal(9,3)
self.assertEqual(3,res,msg='预期结果和实际结果不一致')
unittest.main()#运行测试用例
unittest常用的断言
断言语法 解释
assertEqual(a, b) 判断a==b
assertNotEqual(a, b) 判断a!=b
assertTrue(x) bool(x) is True
assertFalse(x) bool(x) is False
assertIs(a, b) a is b
assertIsNot(a, b) a is not b
assertIsNone(x) x is None
assertIsNotNone(x) x is not None
assertIn(a, b) a in b
assertNotIn(a, b) a not in b
assertIsInstance(a, b) isinstance(a, b)
assertNotIsInstance(a, b) not isinstance(a, b)
unittest 测试产生报告
两种生成测试报告的方式:
1、安装BeautifulReport模块
2、把HTMLTestRunner.py 放到pyCharm的External Libraries中
importunittestimportHTMLTestRunnerimportBeautifulReportclassMyTest(unittest.TestCase):deftest_reg(self):'''注册''' #加这一行会在报告中显示用例描述
print('reg')
self.assertEqual(1,1)deftest_log(self):'''登录'''
print('log')
self.assertEqual(1,1)deftest_buy(self):
self.assertEqual(1,2,msg='购买失败')deftest_z(self):
self.assertIn(1,[1,2,3])deftest_assert(self):
res=False
self.assertFalse(res,)#下面这一坨是用HTMLTestRunner,产生不好看的测试报告
f = open('report.html','wb')
runner= HTMLTestRunner.HTMLTestRunner(f,title='lhtest',description='XX接口测试') #实例化一个runner,帮你跑测试用例
suit = unittest.makeSuite(MyTest) #MyTest类变成测试集合
runner.run(suit)#下面这一坨是用BeautifulReport,产生不好看的测试报告
suite = unittest.makeSuite(MyTest) #变成测试集合
report =BeautifulReport.BeautifulReport(suite)
report.report(filename='bfreport.html',description='接口测试报告')#测试集合:testsuite 多个用例放在一起#unittest 1、函数名必须是test开头,unittest才会帮你执行#2、用例运行的顺序是按照函数的首字母排序的,a-z#testrunner 运行测试用例的#testloader 查找测试用例的
如果我们有很多个模块,每个模块下面都写了很多python文件,每个python文件里面都有测试用例,那怎么把这个目录下的用例都执行了呢,就要先找到这个目录下的所有python文件,然后找到里面的测试用例,逐个执行,代码如下:
importunittest,HTMLTestRunner
suite= unittest.TestSuite()#创建测试套件
all_cases = unittest.defaultTestLoader.discover('.','test_*.py')#找到某个目录下所有的以test开头的Python文件里面的测试用例
for case inall_cases:
suite.addTests(case)#把所有的测试用例添加进来
fp = open('res.html','wb')
runner= HTMLTestRunner.HTMLTestRunner(stream=fp,title='all_tests',description='所有测试情况')
runner.run(suite)#运行测试
参数化
安装nose-parameterized模块
importunittestfrom parameterized importparameterizeddeflogin(username,password):print(username,password)print('=============')return 1
classMyTest(unittest.TestCase):
@parameterized.expand(
[
['xiaodong','123','success'],
['yangfan','456','fail'],
['hailong','1273','success'],
['liurongxin','1273','success'],
]
)deftest_login(self,username,passwd,check):'正常登陆'res=login(username,passwd)
self.assertEqual(check,res)
unittest.main()
setUp、tearDown、setUpClass、tearDownClass
① setup():每个用例执行前运行
② teardown():每个用例执行后运行
③ setUpClass():必须使用@classmethod 装饰器,所有用例执行前运行一次
④ tearDownClass():必须使用@classmethod装饰器,所有用例执行后运行一次
importunittestclassMyTest(unittest.TestCase):def setUp(self):#每条用例执行之前会执行setup
print('这是setup')def tearDown(self):#每条用例执行之后都会执行teardown
print('这是teardown')
@classmethoddef setUpClass(cls):#这个类里面的所有用例执行之前,最先执行它,最前面
print('这是setupclass')
@classmethoddef tearDownClass(cls):#这个类里面所有的用例执行完之后执行它,最后面
print('tearDownClass')deftest_reg(self):print('============我是用例1================')deftest_login(self):print('============我是用例2================')if __name__ == '__main__':
unittest.main()
运行结果:
..----------------------------------------------------------------------Ran2 tests in0.000s
OK
这是setupclass
这是setup============我是用例1================这是teardown
这是setup============我是用例2================这是teardown
tearDownClass