数据驱动----data driven testing
上节课,将python操作excel封装成类,如何应用到实际的测试用例中去呢?
首先看下for循环的方法
import unittest # 被测登录功能(函数) def login(username=None, password= None): """ 登录""" if ( not username) or ( not password): # 用户名或者密码为空 return { " msg " : " empty " } if username == ' yuz ' and password == ' 123456 ' : # 正确的用户名和密码 return { " msg " : " success " } return { " msg " : " error " } cases = [ { ' username ' : ' yuz ' , ' password ' : ' 123456 ' , ' expected ' : ' success ' }, { ' username ' : ' yu ' , ' password ' : ' 1236 ' , ' expected ' : ' error ' } ] class TestLogin(unittest.TestCase): # 前置条件 def setUp(self): print ( ' 连接数据库' ) # 后置条件 def tearDown(self): print ( ' 断开数据库' ) def test_login(self): for case in cases: username = case[ ' username ' ] password = case[ ' password ' ] expected_response = case[ ' expected ' ] actual_response = login(username,password) self.assertTrue(expected_response == actual_response)
使用for循环的缺点:当一个用例出现断言error,后面的用例都无法再跑了。
因为:每个用例数据不是独立的,被当成一个用例在执行
当前面的用例报错,后面的用例就不会再执行
为了解决上面的问题,使用数据驱动的方法---ddt
数据组合起来,去驱动测试。
预先知识
#函数定义的时候传参:不定长参数 def add(* arg): print (arg) add(3,4,5 ) #函数调用的时候,实际参数前面加*号,解包 param = [3,4,5 ] add(* param) ''' (3, 4, 5) (3, 4, 5) '''
ddt数据驱动测试步骤:
1) 安装:pip install ddt
2) 导入:import ddt
3)用法固定:测试类上面加@ddt.ddt
在执行测试用例的方法(需要进行数据驱动的方法上),上面加@ddt.data(*测试数据)
在执行测试用例的方法用参数接收,def test_login(self,test_info) 用test_info这个参数去接收cases里的每个测试用例
下面例子用case_info参数接收,查看case_info的打印结果
import unittest import ddt # 被测登录功能(函数) def login(username=None, password= None): """ 登录""" if ( not username) or ( not password): # 用户名或者密码为空 return { " msg " : " empty " } if username == ' yuz ' and password == ' 123456 ' : # 正确的用户名和密码 return { " msg " : " success " } return { " msg " : " error " } cases = [ { ' username ' : ' yuz ' , ' password ' : ' 123456 ' , ' expected ' : ' success ' }, { ' username ' : ' yu ' , ' password ' : ' 1236 ' , ' expected ' : ' error ' } ] @ddt.ddt class TestLogin(unittest.TestCase): # 前置条件 def setUp(self): print ( ' 连接数据库' ) # 后置条件 def tearDown(self): print ( ' 断开数据库' ) @ddt.data( * cases ) def test_login(self, case_info ): print (case_info) # for case in cases: # username = case['username'] # password = case['password'] # expected_response = case[' expected'] # actual_response = login(username,password) # self.assertTrue(expected_response == actual_response) if __name__ == ' __main__ ' : demo1 = TestLogin() demo1.test_login
结果:case_info表示去接收每条case的数据
结合整个步骤,使用数据驱动方法,如下:
import unittest import ddt # 被测登录功能(函数) def login(username=None, password= None): """ 登录""" if ( not username) or ( not password): # 用户名或者密码为空 return { " msg " : " empty " } if username == ' yuz ' and password == ' 123456 ' : # 正确的用户名和密码 return { " msg " : " success " } return { " msg " : " error " } cases = [ { ' username ' : ' yuz ' , ' password ' : ' 123456 ' , ' expected ' :{ " msg " : " success " }}, { ' username ' : ' yu ' , ' password ' : ' 1236 ' , ' expected ' :{ " msg " : " error " }}, { ' username ' : '' , ' password ' : '' , ' expected ' :{ " msg " : " empty " }} ] @ddt.ddt class TestLogin(unittest.TestCase): # 前置条件 def setUp(self): print ( ' 连接数据库' ) # 后置条件 def tearDown(self): print ( ' 断开数据库' ) @ddt.data( * cases) def test_login(self,case_info): print (case_info) username = case_info[ ' username ' ] password = case_info[ ' password ' ] expected_response = case_info[ ' expected ' ] actual_response = login(username,password) self.assertTrue(expected_response == actual_response) if __name__ == ' __main__ ' : demo1 = TestLogin() demo1.test_login
结果:
连接数据库
{'username': 'yuz', 'password': '123456', 'expected': {'msg': 'success'}}
断开数据库
连接数据库
{'username': 'yu', 'password': '1236', 'expected': {'msg': 'error'}}
断开数据库
连接数据库
{'username': '', 'password': '', 'expected': {'msg': 'empty'}}
断开数据库
完成数据驱动以后,但使用的测试数据cases是写死的,下面 调用上节课封装的python 操作excel的类,来作为cases
excel表格数据如下:
代码(python操作excel封装的类,可查看上节课代码):
import unittest import ddt from lesson_15_python操作excel.demo3_python操作excel_封装成类 import ExcelHandler #被测登录功能(函数) def login(username=None, password=None): """登录""" if (not username) or (not password): # 用户名或者密码为空 return {"msg": "empty"} if username == 'yuz' and password == '123456': # 正确的用户名和密码 return {"msg": "success"} return {"msg": "error"} # cases = [ # {'username':'yuz','password':'123456','expected':{"msg": "success"}}, # {'username':'yu','password':'1236','expected':{"msg": "error"}}, # {'username':'','password':'','expected':{"msg": "empty"}} # ] cases = ExcelHandler('cases.xlsx').read_data('Sheet1') @ddt.ddt class TestLogin(unittest.TestCase): #前置条件 def setUp(self): print('连接数据库') #后置条件 def tearDown(self): print('断开数据库') @ddt.data(*cases) def test_login(self,case_info): data = eval(case_info['data'])#eval()执行一个字符串表达式,并返回表达式的值 eval('3*4')→12 username = data['username'] password = data['password'] expected_response = case_info['expected'] actual_response = login(username,password) self.assertTrue(expected_response == actual_response['msg']) if __name__ == '__main__': demo1 = TestLogin() demo1.test_login