自动化之数据驱动实现方式(DDT 和 pytest.mark.parametrize())

注:这篇博客专门介绍自动化数据驱动的实现方式

一、unittest实现数据驱动(ddt)

1.1、什么是DDT?

data driver test数据驱动测试,可以完美的和unittest结合实现数据驱动

1.2、DDT中的装饰器

  1. @ddt:装饰类,作用是用于申明当前类使用ddt数据驱动
  2. @data: 装饰函数,作用是给函数传值
  3. @unpack:装饰函数,作用是数据解包
  4. @file_data:装饰函数,作用是直接读yaml、json文件

1.3、代码示例

示例一:
注意:传几个值,就会运行几次

import unittest
from ddt import ddt, data
from base.base_util import BasUtil



@ddt
class TestLogin(BasUtil):

    @data("值1","值2","值3")
    def test_01_login(self, args):
        print(args)



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

返回


test_login.py .1
.2
.3
                                                        [100%]

============================== 3 passed in 21.43s ==============================

示例二:如果我们要传入测试数据,可以写成列表的形式传入

import unittest
from ddt import ddt, data
from base.base_util import BasUtil


@ddt
class TestLogin(BasUtil):

    @data([1, "key1", "value1"], [2, "key2", "value2"])
    def test_01_login(self, args):
        print(args)


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

返回:

test_login.py .[1, 'key1', 'value1']
.[2, 'key2', 'value2']
                                                         [100%]

============================== 2 passed in 19.24s ==============================

示例三:通过excel读取数据来实现数据驱动
1.将数据写入excel
在这里插入图片描述
2.封装读取excel的方法

from pathlib import Path
import openpyxl


class ExcelUtil(object):
    def __init__(self):
        # 项目目录
        self.base_dir = Path(__file__).parent.parent

    # openpyxl(更多用这个)、xlrd
    def read_excel(self):
        # 第一步:加载文件
        wb = openpyxl.load_workbook('%s/data/testdata.xlsx' % self.base_dir)
        # 第二步:获得sheet对象
        sheet = wb['login']
        # 第三步:获得excel的行数和列数
        # print(sheet.max_row, sheet.max_column)
        all_list = []
        for rows in range(2, sheet.max_row+1):  # 第二行开始,去掉行标题
            temp_list = []
            for cols in range(1, sheet.max_column+1):
                # print(sheet.cell(rows, cols).value)
                temp_list.append(sheet.cell(rows, cols).value)

            all_list.append(temp_list)

        # print(all_list)
        return all_list


if __name__ == '__main__':
    ExcelUtil().read_excel()

返回(处理后的数据)

[[1, 'a', 'aaaaaa'], [2, 'aa', 'a'], [3, 'aa', 'aaaaaa']]

在用例中传入:

import unittest
from ddt import ddt, data
from base.base_util import BasUtil
from common.excel_util import ExcelUtil


@ddt
class TestLogin(BasUtil):

    @data(*ExcelUtil().read_excel())  # * 可以进行序列解包
    def test_01_login(self, args):
        print(args)


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

返回:

test_login.py .[1, 'a', 'aaaaaa']
.[2, 'aa', 'a']
.[3, 'aa', 'aaaaaa']
                                                        [100%]

============================== 3 passed in 20.77s ==============================

3.@unpack数据解包后
原因:因为读取excel处理数据后,args是列表,@unpack的作用就是数据解包吗,这时,接收参数需要用解包后参数个数相同的变量来接收
代码:

import unittest
from ddt import ddt, data, unpack
from base.base_util import BasUtil
from common.excel_util import ExcelUtil


@ddt
class TestLogin(BasUtil):

    @data(*ExcelUtil().read_excel())  # * 可以进行序列解包
    @unpack  # 作用:数据解包  (解包前args都是列表的形式)
    def test_01_login(self, index, username, password):  # 解包后需要与数据相同个数的参数来接收
        print(index, username, password)


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

返回:

test_login.py .1 a aaaaaa
.2 aa a
.3 aa aaaaaa
                                                        [100%]

============================== 3 passed in 21.66s ==============================

4.数据驱动测试登录

import unittest
from ddt import ddt, data, unpack
from base.base_util import BasUtil
from common.excel_util import ExcelUtil
from page_objects.login_page import LoginPage


@ddt
class TestLogin(BasUtil):

    @data(*ExcelUtil().read_excel())  # * 可以进行序列解包
    @unpack  # 作用:数据解包  (解包前args都是列表的形式)
    def test_01_login(self, index, username, password):  # 解包后需要与数据相同个数的参数来接收
        lp = LoginPage(self.driver)
        lp.login(username, password)

        if index == 1:
            self.assertEqual(lp.assert_login(), "退出登录")


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

返回

test_login.py ...                                                        [100%]

============================== 3 passed in 23.59s ==============================

二、pytest实现数据驱动(@pytest.mark.parametrize())

见:pytest之通过yaml实现数据驱动

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Python是一种高级编程语言,它具有简单易学、代码可读性强、功能强大等特点。YAML是一种轻量级的数据序列化格式,它可以用来表示复杂的数据结构,比如列表、字典等。PytestPython中的一个测试框架,它可以帮助我们编写简单、可读性强的测试用例。DDT(Data-Driven Testing)是一种测试方法,它可以帮助我们更加高效地编写测试用例,通过将测试数据和测试逻辑分离,从而减少了测试用例的编写量。 在Pytest中,我们可以使用DDT实现数据驱动测试。具体来说,我们可以将测试数据存储在YAML文件中,然后使用PyYAML库来读取这些数据。接着,我们可以使用@pytest.mark.parametrize装饰器来将测试数据传递给测试函数,从而实现数据驱动测试。 下面是一个使用PytestDDT进行数据驱动测试的示例代码: ```python import yaml import pytest def read_data(): with open('test_data.yaml', 'r') as f: data = yaml.safe_load(f) return data @pytest.mark.parametrize('test_input, expected_output', read_data()) def test_my_function(test_input, expected_output): assert my_function(test_input) == expected_output ``` 在上面的代码中,read_data函数用来读取YAML文件中的测试数据,然后将其返回。@pytest.mark.parametrize装饰器用来将测试数据传递给test_my_function函数,其中test_input和expected_output分别对应YAML文件中的输入数据和期望输出数据。最后,我们可以在test_my_function函数中编写测试逻辑,从而完成数据驱动测试。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值