• ddt数据驱动常见的用法【多测师_王sir】


    一、背景
    一般进行接口测试时,每个接口的传参都不止一种情况,一般会考虑正向、逆向等多种组合,所以在测试一个接口时,通
    常会编写多条case,而这些除了传参不同外,并没有什么区别。这个时候就可以利用ddt来管理测试数据,提高代码复用率。 二、ddt安装 ddt是python的第三方库,安装非常简单:(基于Python3.7版本) pip3 install ddt ddt官方文档地址:https:
    //pypi.org/project/ddt/ 三、ddt模块组成 1、ddt模块包含类的装饰器ddt和两个方法装饰器data ddt.ddt:装饰类,也就是继承TestCase的类。 ddt.data:装饰测试方法,参数是一系列的值。 ddt.file_data:装饰测试方法,参数是文件名。文件可以是json或者yaml类型。 注意,如果文件是以“.yml”或者".yaml"结尾,ddt会作为yaml类型处理,其他文件都会作为json文件处理。 如果文件是列表,列表的值会作为测试用例参数,同时,会作为测试用例方法名后缀显示。 如果文件是字典,字典的key会作为测试用例方法的后缀显示,字典的value会作为测试用例参数。 ddt.unpack:传递的是复杂的数据结构时使用,比如使用列表或者元组,添加unpack后,ddt会自动把元组或者列表
    对应到多个参数上。
    2、测试用例方法名生成规则 使用ddt后,会产生一个新的测试用例方法名,即定义的测试用例方法名,比如:def test_one(),这里就是test_one。 data:如果传递过来的数据存在__ name__ 属性,则这里就是该数据的__ name__ 值。如果未定义__ name__ 属性,ddt
    会尽量将传递过来的值转化为python标识符,作为data显示。比如:(
    1,3)就转为1_3。需要注意的是,如果数据是字典,则这里就是字典的key。 四、示例 1、使用data传参数给测试用例
    import unittest
    from ddt import ddt,data,unpack
    
    @ddt
    class MyTestDdt(unittest.TestCase):
        def setUp(self):
            print('start')
    
        @data(66,88)#使用data传参数给测试用例
        def test_one(self,value):
            print(f'the @data number is :{value}')
    
        def tearDown(self):
            print('end')
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
    运行后结果为:
    C:Python37python3.exe C:/project/dcs6/decorator/装饰器.py
    test_one_1_66 (__main__.MyTestDdt) ... ok
    start
    test_one_2_88 (__main__.MyTestDdt) ... ok
    
    the @data number is :66
    ----------------------------------------------------------------------
    end
    Ran 2 tests in 0.000s
    start
    
    the @data number is :88
    OK
    end
      可以看出data分别传参数66和88给测试用例,然后测试用例执行了两遍。另外,注意此时打印出的测试用例名称已经不同,
      比如:test_one_1_66和test_one_2_88,最后的66和88,分别是传递进去的参数。

      2、使用unpack分解list或者tuple
    import unittest
    from ddt import ddt,data,unpack
    @ddt
    class MyTestDdt(unittest.TestCase):
    def setUp(self):
    print('start')

    @data((1,2),(4,5)) #元组
    @unpack #分解
    def test_one(self,value1,value2):
    print(f'the @data number is :{value1,value2}')

    def tearDown(self):
    print('end')

    if __name__ == '__main__':
    unittest.main(verbosity=2)

    运行结果如下:

      C:Python37python3.exe C:/project/dcs6/decorator/装饰器.py
      test_one_1__1__2_ (__main__.MyTestDdt) ... ok
      start
      test_one_2__4__5_ (__main__.MyTestDdt) ... ok
      the @data number is :(1, 2)

      end
      ----------------------------------------------------------------------
      start
      Ran 2 tests in 0.000s
      the @data number is :(4, 5)

      end
      OK

      可以看出data分别传元组参数(1,2)和(4,5)给测试用例,然后测试用例执行了两遍。另外,注意此时打印出的
      测试用例名称已经不同,比如:test_one_1__ 1__ 2_和test_one_2__ 4__5_ ,最后的1,2和4,5,分别是传递进去的参数。
    3、用unpack分解字典
    import unittest
    from ddt import ddt,data,unpack
    @ddt
    class MyTestDdt(unittest.TestCase):
        def setUp(self):
            print('start')
    
        @data({'value1':1,'value2':2},{'value1':3,'value2':4}) #字典
        @unpack
        def test_one(self,value1,value2):
            print(f'the @data number is :{value1,value2}')
    
        def tearDown(self):
            print('end')
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
    运行结果如下:
    C:Python37python3.exe C:/project/dcs6/decorator/装饰器.py
    start
    test_one_1 (__main__.MyTestDdt) ... ok
    the @data number is :(1, 2)
    end
    start
    test_one_2 (__main__.MyTestDdt) ... ok
    the @data number is :(3, 4)
    
    end
    ----------------------------------------------------------------------
    Ran 2 tests in 0.000s
    
    OK
    
    4、自动化测试实战
    这里以登录多测师cms后台管理系统,并利用数据驱动的方式带参进行测试
    #coding=utf-8
    """
    ===========================
    Author:多测师_王sir
    Time:2020-09-08 13:51
    Wechat:xiaoshubass
    website:www.duoceshi.cn
    ===========================
    """
    
    import unittest
    from ddt import ddt,data,unpack
    from selenium import webdriver
    
    def testdata():
        '''测试数据'''
        return [('admin', '123456'), ('duoceshi', '123456'),
                ('duoceshi1', '123456')]
    
    @ddt
    class Cms_Login(unittest.TestCase):
        def setUp(self):
            self.url = 'http://cms.duoceshi.cn/cms/manage/login.do'
            self.driver = webdriver.Chrome()
            self.driver.maximize_window()
            self.driver.get(self.url)
            self.driver.implicitly_wait(30)
    
        @data(*testdata()) #这里加*后会将返回数据分为一个个的元组
        @unpack
        def test_login(self,username,password):
            '''测试登录多测师cms后台管理系统'''
            self.driver.find_element_by_id('userAccount').send_keys(username)
            self.driver.find_element_by_id('loginPwd').send_keys(password)
            self.driver.find_element_by_id('loginBtn').click()
    
        def tearDown(self):
            self.driver.quit()
    
    if __name__ == '__main__':
        unittest.main(verbosity=2)
    
    运行结果如下:
    C:Python37python3.exe C:/project/dcs6/decorator/装饰器.py
    test_login_1___admin____123456__ (__main__.Cms_Login)
    测试登录多测师cms后台管理系统 ... ok
    test_login_2___duoceshi____123456__ (__main__.Cms_Login)
    测试登录多测师cms后台管理系统 ... ok
    test_login_3___duoceshi1____123456__ (__main__.Cms_Login)
    测试登录多测师cms后台管理系统 ... ok
    
    ----------------------------------------------------------------------
    Ran 3 tests in 32.658s
    
    OK
  • 相关阅读:
    re模块---正则表达式
    configparser 配置文件模块
    svn服务器配置
    python中的list的方法
    python正则表达式
    os模块
    高阶函数
    递归
    推导式
    [转]Java中的多线程你只要看这一篇就够了
  • 原文地址:https://www.cnblogs.com/xiaoshubass/p/13640180.html
Copyright © 2020-2023  润新知