UI自动化框架搭建以及面试题
- UI自动化面试题
- 框架面试题
- 那你讲下如何搭建现成的框架
- 公司里面的框架是你搭建的么
- 请结合你的项目讲解一下你的框架是如何搭建的
- PO模式
- 什么是 PO 模式
- PO 模式的封装原则有哪些
- DDT驱动模式
- 什么的项目适合ddt
- ddt四种模式
- ddt处理各种类型数据
- 自动化框架的登录页面的搭建
- 常量如何存储
- 登录页面定位
- 在case进行登录页面的调用
- 验证码识别
UI自动化面试题
框架面试题
那你讲下如何搭建现成的框架
追风考试系统
1、对项目去选择合适的Ul自动化框架(cypress,selenium),从unittest 和 pytest 中选择了 pytest。(框架选择)
2、确定框架中有哪些目录和功能,比如config,reports,page,case,screenshots,data,common目录,再加上pytest核心两个文件conftest和pytest.ini文件
3.再根据项目去补全对应的内容,结合po模型,结合conftest里面的装饰器和生成器还有元素定位的描述符,以及ddt数据驱动的生成器一行一行读取文件。
4.最后完善登录登出的常规操作就大功告成了。
公司里面的框架是你搭建的么
1、我们公司的项目是很多年不断迭代的,
框架已经有人搭建好了
,我没有在公司中搭建过框架,但是我有去看过框架中的结构和源码的设计思想。(不是我搭建的,但是我了解框架的搭建细节)
或者:
2、我们公司的项目都是最近才做的
,甲方那边需要我们搭建一个ui自动化框架来跑跑看一看,所以我花了几天搭建了一个框架完成了一些主干自动化用例。(是我独立从0到1搭建的框架)
请结合你的项目讲解一下你的框架是如何搭建的
1.我们的项目要求做ui自动化框架,我们先选型,选择pytest
2.我们设计结构的时候,想到了po模型
,所以划分了一些目录,我们项目中登录的时候有验证码的识别,我就写了一个验证码的工具识别,还有颜色识别,我就写了一个工具函数,还有文件上传功能,还有滑动操作,还有失败重跑,以及多现成这些功能都放在我的项目中了,我们项目中还有需要用到数据驱动的地方,比如登录页面多次尝试不同的账号密码进行登录,我就写了一个ddt的读取文件的函数,利用装饰去实现ddt。
PO模式
什么是 PO 模式
是指把一个具体的页面转化为编程语言当中的一个对象,页面特性转化成对象属性,页面操作转化为对象方法。
1)把每个页面当成一个对象,页面层写定位元素方法和页面操作方法
2)用例层从页面层调用操作方法,写成用例
3)可以做到定位元素与脚本的分离
4)主要用来实现对页面操作和测试逻辑的一个分离
PO 模式的封装原则有哪些
1)要封装页面中的功能或服务,比如点击页面元素,可以进入到新的页面,则可为这个服务封装方法"进入新页面"
2)封装细节,对外只提供方法名或者接口
,尽量不要暴露页面的内部
3)封装的操作细节中不要使用断言,把断言放到单独的模块
中,
4)点击一个按钮会开启新的页面,可以用return方法跳转,比如return MainPage()表示跳转到主页
5)整个 PO 你不需要封装整个页面的行为,用到什么逻辑就封装什么
6)一个动作可能产生不同结果,比如点击按钮后,可能成功,也可能失败,为两种结果封装两个方法:click_success和click_error
DDT驱动模式
什么的项目适合ddt
在进行登录测试用例设计时,我们通常会遇到以下情况:
- 登录功能的
前置条件是一致
的,即需要有一个登录页面和正确的登录接口。- 测试数据会有变化,主要是用户名和密码的组合,但是测试用例的
逻辑结构基本相同
。 针对这种情况,可以利用数据驱动测试(Data-Driven Testing,简称
DDT)来管理测试数据,提高代码复用率。DDT可以通过excel、csv等方式存储测试数据,并且利用循环结构来执行多组测试数据,从而覆盖不同的测试情景。
import unittest
from ddt import ddt, data
@ddt
class TestLogin(unittest.TestCase):
@data(("user1", "password1"), ("user2", "password2"), ("user3", "password3"))
def test_login_with_valid_credentials(self, login_data):
username, password = login_data
# 进行登录操作,并断言登录成功
@data(("user4", "wrong_password"), ("user5", ""), ("", "password6"))
def test_login_with_invalid_credentials(self, login_data):
username, password = login_data
# 进行登录操作,并断言登录失败
if __name__ == "__main__":
unittest.main()
在这个示例中,我们使用了 ddt 装饰器来标记测试类,并使用 @data 装饰器来标记测试方法。每个测试方法都接受一个参数 login_data,它代表一个用户名和密码的组合。通过在 @data 装饰器中提供不同的测试数据,我们可以在不同情景下执行登录测试,并验证登录功能的正确性。
ddt四种模式
ddt要与unittest单元测试框架一起结合使用
@ddt 引入ddt模块
@data 导入数据
@unpack 拆分数据
@file_data导入外部数据
ddt处理各种类型数据
需注意以下几点:
1.使用ddt模块要在测试类前用@ddt进行修饰
2.要导入测试数据需在测试用例(以test_开头的方法)前用@data修饰
3.若需对测试数据进行拆分需用@unpack修饰
4.若需导入外部数据需用@file_data修饰
自动化框架的登录页面的搭建
常量如何存储
- test_001_login.py
- conf.py(常量的统一封装)
登录页面定位
-
登录页面的元素定位
-
统一进行元素定位,进行封装操作
-
如果含有button的页面 要添加点击的操作
在case进行登录页面的调用
1.test_001_login.py
from pages.index_page.index import zhuifeng_index_page
2.调用
3.定义一个实体化对象
验证码识别
- 设置验证码的部分
1.封装
2.导包
from common.image_identify import image_identify
3.使用
# zhufeng.log_in_button.click()
zhufeng.image_code = image_identify(drivers, zhufeng.image, '简单验证码.png', 'crop_pic.png')