单元测试:开发自测时写的代码
unittest基本原理:
♦整个平台的搭建使用的是python的unittest测试框架,这里简单介绍下unittest模块的简单应用。
♦unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。
几个概念:
TestCase 也就是测试用例
TestSuite 多个测试用例集合在一起
TestLoader是用来加载TestCase到TestSuite中的
TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信息
unitest的目录结构一般如下:重要
unittest 测试
def cal(a,b): return a+b # # res = cal(1,9) # if res == 3: # print('成功') # else: # raise Exception('测试失败') # unittest python中的单元测试框架 import unittest class MyTest(unittest.TestCase): #继承TestCase def test_a(self): #函数的名字必须以test开头 res = cal(1,2) self.assertEqual(3,res,msg='预期结果和实际结果不一致') def test_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中
import unittest import HTMLTestRunner import BeautifulReport class MyTest(unittest.TestCase): def test_reg(self): '''注册''' #加这一行会在报告中显示用例描述 print('reg') self.assertEqual(1,1) def test_log(self): '''登录''' print('log') self.assertEqual(1,1) def test_buy(self): self.assertEqual(1,2,msg='购买失败') def test_z(self): self.assertIn(1,[1,2,3]) def test_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文件,然后找到里面的测试用例,逐个执行,代码如下:
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) #运行测试
参数化
安装nose-parameterized模块
import unittest from parameterized import parameterized def login(username,password): print(username,password) print('=============') return 1 class MyTest(unittest.TestCase): @parameterized.expand( [ ['xiaodong','123','success'], ['yangfan','456','fail'], ['hailong','1273','success'], ['liurongxin','1273','success'], ] ) def test_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装饰器,所有用例执行后运行一次
import unittest class MyTest(unittest.TestCase): def setUp(self):#每条用例执行之前会执行setup print('这是setup') def tearDown(self):#每条用例执行之后都会执行teardown print('这是teardown') @classmethod def setUpClass(cls):#这个类里面的所有用例执行之前,最先执行它,最前面 print('这是setupclass') @classmethod def tearDownClass(cls):#这个类里面所有的用例执行完之后执行它,最后面 print('tearDownClass') def test_reg(self): print('============我是用例1================') def test_login(self): print('============我是用例2================') if __name__ == '__main__': unittest.main()
运行结果:
.. ---------------------------------------------------------------------- Ran 2 tests in 0.000s OK 这是setupclass 这是setup ============我是用例1================ 这是teardown 这是setup ============我是用例2================ 这是teardown tearDownClass