Web自动化测试2——设计模式+生成测试报告+断言

本文介绍了Python自动化测试中的Page Object Model(POM)模式,展示了如何通过POM模式实现代码封装,提高测试的可维护性和复用性。同时,文章详细讲解了如何使用unittest和HTMLTestRunner生成测试报告,以及如何运用断言进行结果验证。此外,还提及了测试用例的组织结构和关键函数的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里对之前的代码进行封装https://blog.youkuaiyun.com/weixin_45730790/article/details/121889321
视频传送门https://www.bilibili.com/video/BV1Ey4y1L7xU?p=7&spm_id_from=pageDriver

一、设计模式

Pom模式+关键字驱动模式

pom模式:page object model 页面对象模式。
好处:
1.解决:线性脚本的问题
2.解决:代码不能重复利用的问题
3.解决:后期的维护问题。

pom模式,简单来说就是分类
分三层:
1.基础层:base层 主要放selenium原生的方法。
2.页面对象层:po层 主要用于放页面的元素和页面的动作。
3.测试用例层:testcase 存放测试用例以及测试数据。

页面对象层调用基础层的方法,测试用例层调用页面对象层的方法。

unittest的前后置处理(夹具)
setup在测试用例之前的准备工作
teardown在测试用例之后的扫尾工作

分层之后的结构如下:
在这里插入图片描述
base_page代码如下:

from selenium.webdriver.support.select import Select


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

    def locator_element(self, loc):  # loc参数是一个元组
        """定位元素的关键字"""
        return self.driver.find_element(*loc)  # 加*解包,去掉一层()

    def set_keys(self, loc, value):
        """设置值的关键字"""
        self.locator_element(loc).send_keys(value)

    def click(self, loc):
        """单击的关键字"""
        self.locator_element(loc).click()

    def goto_frame(self, frame_name):
        """进入框架的关键字"""
        self.driver.switch_to.frame(frame_name)

    def quit_frame(self):
        """出框架的关键字"""
        self.driver.switch_to.default_content()

    def choice_select(self, loc, value):
        """  封装选中下拉框关键字"""
        sel = Select(self.locator_element(loc))
        sel.select_by_value(value)

    def get_value(self, loc):
        """获取文本的值"""
        return self.locator_element(loc).text

base_util代码如下:

import time
import unittest

from selenium import webdriver


class BaseUtil(unittest.TestCase):
    # 重写了unittest里的setUp和tearDown
    def setUp(self) -> None:
        global driver
        # 打开浏览器
        self.driver = webdriver.Chrome()
        driver = self.driver
        # 加载网页
        self.driver.get("http://localhost/ecshop/admin/privilege.php?act=logout")

    def tearDown(self) -> None:
        time.sleep(3)
        self.driver.quit()

login_page代码如下:

from selenium.webdriver.common.by import By

from base.base_page import BasePage


class LoginPage(BasePage):
    """登录页面"""

    # 页面的元素
    username_loc = (By.NAME, "username")  # 用户名
    password_loc = (By.NAME, "password")  # 密码
    submit_loc = (By.XPATH, "//input[@value='进入管理中心']")  # 登录按钮

    # 页面的动作
    def login_ecshop(self, username, password):
        self.set_keys(LoginPage.username_loc, username)  # 输入用户名
        self.set_keys(LoginPage.password_loc, password)  # 输入密码
        self.click(LoginPage.submit_loc)  # 点击登录按钮

product_manage_page代码如下:

from selenium.webdriver.common.by import By

from base.base_page import BasePage
from pageobject.login_page import LoginPage


class ProductManagePage(BasePage):
    # 页面元素
    product_list_loc = (By.LINK_TEXT, "商品列表")
    cat_id_loc = (By.NAME, "cat_id")
    sousuo_loc = (By.XPATH, "//input[@value=' 搜索 ']")

    # 页面动作
    def select_product(self, value):
        # 登录
        lp = LoginPage(self.driver)
        lp.login_ecshop()
        # 查询
        self.goto_frame("menu-frame")
        self.click(ProductManagePage.product_list_loc)
        self.quit_frame()
        self.goto_frame("main-frame")
        self.choice_select(ProductManagePage.cat_id_loc, value)
        self.click(ProductManagePage.sousuo_loc)

test_login代码如下:

from base.base_util import BaseUtil
from pageobject.login_page import LoginPage


class TestCase(BaseUtil):

    def test_01_login(self):
        # 登录
        lp = LoginPage(self.driver)
        lp.login_ecshop("admin", "admin123")

test_product_manage代码如下:

from base.base_util import BaseUtil
from pageobject.login_page import LoginPage
from pageobject.product_manage_page import ProductManagePage


class TestProductManage(BaseUtil):

    def test_03_select_product(self):
        """
        查询商品
        """
        pm = ProductManagePage(self.driver)
        pm.select_product("4")

这里的关键字虽然封装好了,但是并没有用关键字驱动,所以实际上就是pom模式

二、生成测试报告

添加一个all.py和report目录
在这里插入图片描述
all.py代码如下:

import unittest
from HTMLTestRunner import HTMLTestRunner

import pytest

if __name__ == '__main__':
    # 执行需要的用例,并且生成HTML格式的自动化的测试报告
    # 使用unittest默认的测试用例的加载器去发现testcase目录下以py结尾的所有的测试用例
    suite = unittest.defaultTestLoader.discover("./testcase", "*.py")
    # 生成html报告文件
    report_file = open("./report/reports.html", "wb")
    # 生成一个HTMLTestRunenr运行器对象(必须下载一个文件HTMLTestRunner.py,放到python的lib目录,注意python2和python3是不一样的)
    runner = HTMLTestRunner(stream=report_file, title="ECSHOP自动化测试报告", description="报告详情如下:")
    # 通过运行器运行测试用例
    runner.run(suite)

三、断言

unittest断言用于判断预期结果和实际结果是否相符
在这里面有几十种断言,主要需要知道三种

self.assertEqual()            判断两个值是否相等
self.assertTrue()             判断一个值是否为True
self.asserIn()                判断一个值是否在另一个值里面

查询断言不太好做,一般是与新增连着一起,新增之后再查询刚刚新增的值

这里展示登录断言的例子
在login_page.py里面加上断言

from selenium.webdriver.common.by import By

from base.base_page import BasePage


class LoginPage(BasePage):
    """登录页面"""

    # 页面的元素
    username_loc = (By.NAME, "username")  # 用户名
    password_loc = (By.NAME, "password")  # 密码
    submit_loc = (By.XPATH, "//input[@value='进入管理中心']")  # 登录按钮
    tuichu_loc = (By.LINK_TEXT, '退出')

    # 页面的动作
    def login_ecshop(self, username, password):
        self.set_keys(LoginPage.username_loc, username)  # 输入用户名
        self.set_keys(LoginPage.password_loc, password)  # 输入密码
        self.click(LoginPage.submit_loc)  # 点击登录按钮

    # 断言
    def get_except_result(self):
        self.goto_frame("header-frame")
        return self.get_value(LoginPage.tuichu_loc)

在test_login.py里面加上断言

from base.base_util import BaseUtil
from pageobject.login_page import LoginPage


class TestCase(BaseUtil):

    def test_01_login(self):
        """ 登录 """
        lp = LoginPage(self.driver)
        lp.login_ecshop("admin", "admin123")
        # 断言  self.assertEqual(预期结果,"退出")
        self.assertEqual(lp.get_except_result(), "退出")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值