栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

UI自动化测试-数据驱动(ddt)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

UI自动化测试-数据驱动(ddt)

在不使用ddt的情况下,我们是完全可以实现UI自动化测试用例的,如下,我编写了一条成功用例,一条失败用例

pages目录下新建home_page.py文件(这里面放的是登录后的页面操作),代码如下:

from selenium.webdriver.common.by import By

from setting import config
from selenium.webdriver import Chrome
from selenium.webdriver.support import expected_conditions as when
from selenium.webdriver.support.wait import WebDriverWait


class HomePage:
    url = config.host + 'Main/index.html'

    def __init__(self, browser: Chrome):
        self.browser = browser

    def load(self):
        """加载页面"""
        self.browser.get(self.url)

    def is_loaded(self, timeout=10):
        """页面已经被加载"""
        # 用显性等待等待url包含self.url
        return WebDriverWait(self.browser, timeout).until(when.url_contains(self.url))

    def get_username(self):
        """获取登录后的用户名称"""
        el = self.browser.find_element(By.CSS_SELECtOR, '.avatar')
        return el.get_attribute('title')

login_data.py代码修改如下:

login_fail = {'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'}
login_success = {'username': '18603291314', 'password': '123456', 'expected': '沫沫'}

 conftest.py代码修改如下:

import pytest
import os
from selenium import webdriver
from setting import config
from pages.login_page import LoginPage
from pages.home_page import HomePage

driver = os.path.join(config.driver_dir, 'chromedriver_96.exe')


# 打开浏览器
def get_browser():
    # 因为要在测试用例后执行闭关浏览器,因为不要使用with的打开方式
    browser = webdriver.Chrome(executable_path=driver)
    browser.implicitly_wait(5)
    browser.maximize_window()
    return browser


# 设置夹具
@pytest.fixture()
def browser():
    driver = get_browser()
    yield driver
    driver.quit()


# 依赖上一个夹具(上一个夹具是这个夹具的前置条件)
@pytest.fixture()
def login_page(browser):
    return LoginPage(browser)


@pytest.fixture()
def home_page(browser):
    return HomePage(browser)

自动化测试用例代码修改如下:

from data.login_data import login_fail, login_success


class TestSignIn:
    def test_sing_in_failed(self, login_page):
        """测试登录失败"""
        # 数据
        username = login_fail['username']
        password = login_fail['password']
        expected = login_fail['expected']
        # 获取实际结果
        login_page.load()
        login_page.login(username, password)
        actual = login_page.get_error_tips()
        # 断言
        assert expected == actual

    def test_sing_in_success(self, login_page, home_page):
        """测试登录成功"""
        # 数据
        username = login_success['username']
        password = login_success['password']
        expected = login_success['expected']
        # 获取实际结果
        login_page.load()
        login_page.login(username, password)
        # 断言
        # 断言登录后的url
        assert home_page.is_loaded()
        # 断言登录后的用户名称
        assert home_page.get_username() == expected

运行结果:

总结:

  1. 页面不同要编写不同的类,来进行存放,这样好维护代码
  2. 要新增一个home_page的夹具,因为返回的内容不同
  3. 登录后url的变更是需要设置时间等待,否则取到的url是登录前的

什么是ddt就不介绍了,在接口自动化测试中已经介绍过了,在UI自动化测试中使用ddt的成本是比接口要高的,因为接口自动化测试用例中,所有的测试步骤是一致的,只是测试数据不同,但在UI自动化测试用例中,测试步骤并没有完全一致,因此可以使用ddt,但编写过程相对接口复杂一些

下面来介绍一下具体的实现过程:

修改login_data.py代码如下:

# 单条登录失败数据
login_fail = {'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'}
# 单条登录成功数据
login_success = {'username': '18603291314', 'password': 'lijiao921010', 'expected': '沫沫'}
# 多条登录失败数据
login_fail_list = [
        {'username': 'aaa', 'password': '123', 'expected': '密码有效长度是6到30个字符'},
        {'username': 'aaa', 'password': '12345', 'expected': '密码有效长度是6到30个字符'}
        ]

修改自动化测试用例代码如下:

from data.login_data import login_success, login_fail_list
import pytest


class TestSignIn:
    @pytest.mark.parametrize('login_fail', login_fail_list)
    def test_sing_in_failed(self, login_fail, login_page):
        """测试登录失败"""
        # 数据
        username = login_fail['username']
        password = login_fail['password']
        expected = login_fail['expected']
        # 获取实际结果
        login_page.load()
        login_page.login(username, password)
        actual = login_page.get_error_tips()
        # 断言
        assert expected == actual

    def test_sing_in_success(self, login_page, home_page):
        """测试登录成功"""
        # 数据
        username = login_success['username']
        password = login_success['password']
        expected = login_success['expected']
        # 获取实际结果
        login_page.load()
        login_page.login(username, password)
        # 断言
        # 断言登录后的url
        assert home_page.is_loaded()
        # 断言登录后的用户名称
        assert home_page.get_username() == expected

运行结果:

总结:

  • UI/web自动化测试数据驱动:使用分组的方式(就是相同测试步骤的数据放到一个列表中)

        loging_fail = [ ]   驱动  test_sing_in_failed

        loging_success = [ ]  驱动  test_sing_in_success

  • 为什么UI自动化测试中,我们没有把数据放到excel表格中,因为使用表格,需要把多设置几个sheet页来存储测试用例,如:提示密码长度错误信息的放到sheet1中,提示密码错误信息的放到sheet2.....放到表格中,我们还是需要把表格中的数据读取出来,转换成列表嵌套字典的格式来操作,因此使用.py模块来进行存储比较易管理
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/649793.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号