数据驱动和分层

数据驱动

参数化, 数据驱动, DDT
数据驱动是思想, 参数化是实现数据驱动的手段形式。
DDT: data-driven testing 数据驱动测试

数据驱动: 如果有同一套代码,但是只有数据不一样。
就是当测试用例所有的逻辑都一样,只有数据不同的时候,我们可以把数据提取出来,
然后用数据去分别带入测试用例函数当中

数据驱动不是万能的,有些场景不适合用数据驱动。
数据驱动的好处:

  • 实现了数据和代码的分离,好维护
  • 简化代码,不需要写重复的函数名。

数据驱动的坏处:

  • 数据驱动不方便调试
  • 如果测试逻辑不通用,是不适合用数据驱动的。
import pytest


data = [
    (1, 1, 2),
    (3, 2, 4),
]


# @pytest.mark.parametrize('info', data)
# def test_add(info):
#     # (1, 1, 2),
#     param1, param2, expected = info
#     # assert info[0] + info[1] == info[2]
#     assert param1 + param2 == expected


@pytest.mark.parametrize('param1, param2, expected', data)
def test_add(param1, param2, expected):
    assert param1 + param2 == expected

=======================================================

案例1:

import time

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage


class TestLogin:

    @pytest.mark.parametrize("info",[("1356074449","666666666","十七"),
                                     ("19142706666", "666666666","十八")])
    def test_login_without_username_and_password(self,get_driver,info):
        """测试没有用户名和密码的情况。
                尽量通过测试用例的函数名称表示测试的测试点。
                梳理测试步骤:、
                1、打开浏览器
                2、访问测试页面
                3、点击提交
                4、断言
                """
        driver = get_driver
        login_page = Login(driver)
        home_page = HomePage(driver)
        login_page.loan()


        # 登录
        login_page.login(info[0],info[1])

        # 断言页面标题
        time.sleep(1)
        assert driver.current_url == home_page.url

        user_elem = home_page.get_username()
        assert user_elem == info[2]
        

===================================================================================

案例2:

赋值:username, password, expected = info

import time

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage


class TestLogin:

    @pytest.mark.parametrize("info",[("13560745555","666666666","十七"),
                                     ("19142706666", "666666666","十八")])
    def test_login_without_username_and_password(self,get_driver,info):
        """测试没有用户名和密码的情况。
                尽量通过测试用例的函数名称表示测试的测试点。
                梳理测试步骤:、
                1、打开浏览器
                2、访问测试页面
                3、点击提交
                4、断言
                """
        username,password,expected = info
        
        driver = get_driver
        login_page = Login(driver)
        home_page = HomePage(driver)
        login_page.loan()


        # 登录
        login_page.login(username,password)

        # 断言页面标题
        time.sleep(1)
        assert driver.current_url == home_page.url

        user_elem = home_page.get_username()
        assert user_elem == expected
        

==============================================================================

案例3:

data模块

success = [("13560748366","666666","十七"),
           ("19142706666", "666666","十八")
           ]

=============================================================

@pytest.mark.parametrize(“info”,data_login.success)

import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from pages.login import Login
from pages.home import HomePage
from data import data_login


class TestLogin:

    @pytest.mark.parametrize("info",data_login.success)
    def test_login_without_username_and_password(self,get_driver,info):
        """测试没有用户名和密码的情况。
                尽量通过测试用例的函数名称表示测试的测试点。
                梳理测试步骤:、
                1、打开浏览器
                2、访问测试页面
                3、点击提交
                4、断言
                """
        username,password,expected = info
        driver = get_driver
        login_page = Login(driver)
        home_page = HomePage(driver)
        login_page.loan()

        # 登录
        login_page.login(username,password)

        # 断言页面标题
        time.sleep(1)
        assert driver.current_url == home_page.url

        user_elem = home_page.get_username()
        assert user_elem == expected
        

=========================================================================

URL 配置

yaml 文件,冒号后一定要空格。
编写读取yaml文件的程序:通用的。

host: “https://v4.ketangpai.com”
user1:
username: “13560748369”
password: “wtg444444”

==================================================================================

安装:pip install pyyaml

import yaml
from config.path import config_yaml_path

def read_yaml(fpath):
    """fpath: yaml 文件的路径"""
    with open(fpath, encoding='utf-8') as f:
        # 读取yaml 当中的数据
        data = yaml.safe_load(f)
        return data


# 获取yaml配置项
yaml_config = read_yaml(config_yaml_path)

================================================

管理项目下的路径

## 管理项目下的路径
import os

# 获取当前文件的路径
config_path = os.path.abspath(__file__)
print(config_path)

# config 目录
config_dir = os.path.dirname(config_path)
print(config_dir)

# lesson9 项目路径
root_dir = os.path.dirname(config_dir)
print(root_dir)

# 获取 data 目录路径
data_dir = os.path.join(root_dir, 'data')
print(data_dir)

if not os.path.exists(data_dir):
    os.mkdir(data_dir)

# yaml 配置文件的路径
config_yaml_path = os.path.join(config_dir, 'config.yaml')

========================================================

拼接

host = yaml_config["host"]
url = host + "/User/login.html"
print(url)

==========================================================================

分层元素定位

# 存放元素定位
from selenium.webdriver.common.by import By

user_name_zl = (By.XPATH, '//input[@placeholder="邮箱/账号/手机号"]')
"""账号元素定位"""

password_ma = (By.XPATH, '//input[@placeholder="密码"]')
""""密码元素定位"""

login_dl = (By.XPATH, '//div[@class="padding-cont pt-login"]//a[@class="btn-btn"]')
"""登录按钮元素定位"""

elem_msg_locator = (By.XPATH, '//div[@class="atsx-form-explain"]')
"""元素: 账号不能为空,密码不能为空"""

======================================================

案例1:

import time
from common.yaml_handler import yaml_config
from locator import login_locator

host = yaml_config["host"]


class Login:

    url = host + "/User/login.html"


    def __init__(self,driver):
        self.driver = driver

    def login(self, username, password):
        # 登录过程
        self.driver.find_element(*login_locator.user_name_zl).send_keys(username)
        self.driver.find_element(*login_locator.password_ma).send_keys(password)

        # 定位登录按钮
        yx_login = self.driver.find_element(*login_locator.login_dl)
        yx_login.click()
        time.sleep(1)
        return self

    # 封装URL
    def loan(self):
        """访问页面"""
        self.driver.get(self.url)
        return self

    def clear(self):
        """清空用户名和密码"""
        self.driver.find_element(*login_locator.user_name_zl).clear()
        self.driver.find_element(*login_locator.password_ma).clear()

    def get_elem(self):
        """断言"""
        elem = self.driver.find_elements(*login_locator.elem_msg_locator)
        text = [el.text for el in elem]
        return text
        

====================================================

案例2:

在类属性当中,直接赋值,元素定位

import time
from common.yaml_handler import yaml_config
from selenium.webdriver.common.by import By

host = yaml_config["host"]

class Login:

    url = host + "/User/login.html"

    # 存放元素定位
    user_name_zl = (By.XPATH, '//input[@placeholder="邮箱/账号/手机号"]')
    """账号元素定位"""

    password_ma = (By.XPATH, '//input[@placeholder="密码"]')
    """"密码元素定位"""

    login_dl = (By.XPATH, '//div[@class="padding-cont pt-login"]//a[@class="btn-btn"]')
    """登录按钮元素定位"""
    
    elem_msg_locator = (By.XPATH, '//div[@class="atsx-form-explain"]')
    """元素: 账号不能为空,密码不能为空"""
    
    def __init__(self,driver):
        self.driver = driver

    def login(self, username, password):
        # 登录过程
        self.driver.find_element(*self.user_name_zl).send_keys(username)
        self.driver.find_element(*self.password_ma).send_keys(password)

        # 定位登录按钮
        yx_login = self.driver.find_element(*self.login_dl)
        yx_login.click()
        time.sleep(1)
        return self

    # 封装URL
    def loan(self):
        """访问页面"""
        self.driver.get(self.url)
        return self

    def clear(self):
        """清空用户名和密码"""
        self.driver.find_element(*self.user_name_zl).clear()
        self.driver.find_element(*self.password_ma).clear()

    def get_elem(self):
        """断言"""
        # actual = self.driver.find_elements(*self.elem_msg_locator)
        # actual_value = []
        # for el in actual:
        #     text = actual_value.append(el.text)
        #     return text

        elem = self.driver.find_elements(*self.elem_msg_locator)
        text = [el.text for el in elem]
        return text
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值