Python 进阶之DDT 数据驱动 第15节课(数据驱动)

数据驱动----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

猜你喜欢

转载自www.cnblogs.com/ananmy/p/12975407.html