po,page object,页面对象,代码结构设计的一种方法,通过类来实现对象分层。
PO设计模式是selenium自动化测试中最佳的设计模式之一,主要体现在对界面交互细节的封装,也就是在实际测试中只关注业务流程就OK了
本次分享会讲解po概念,分析2个实例。
po即page object页面对象,以面向对象为基本思想,将代码封装到类中,用类的继承来分层。
po设计模式主要用在UI自动化测试中,常用框架为unittest、pytest,通过类来分层,一般为2到4层。 这样让不同的层处理单独的逻辑,结构比较清晰,复用性好且易维护。
测试自动化的最大优势就是可以快速而且反复的进行测试。 关于自动化测试有一个金字塔理论,把测试从上到下分为 UI(用户界面测试)/Service(服务测试) /Unit(单元测试 )。如图所示,越往金字塔底层,测试的效率越高,测试的成本越低。但是对使用者提出了更高的素质要求。Po设计模式通过对代码进行封装,可以做到让部分使用者只接触业务层的参数,使用难度较低。
Unittest是Python标准库中自带的单元测试框架, Pytest是Python的另一个第三方单元测试库。
做一个OA页面登录的例子,业务逻辑上分三大步 1、打开浏览器并打开页面 2、找到登录的账号密码输入框并输入,点击登录 3、在页面跳转后,查看是否成功登录,并返回结果。
这是最简单的一个自动化测试例子,本次讲解中,后续所有的例子功能都是这样。
总共代码包括注释的话,就是20来行,麻雀虽小,该有的都有。而加入po设计模式后,代码扩增到了80行。
数据层是和人员交互的参数,在传入量大时,可用yaml或json传入。
逻辑层使用unittest.TestCase的子类来实现,加入了简单的fixture夹具(虽然目前看来没什么卵用)。
对象层分为Basepage和其子类LoginPage,父类只做了初始化和析构,主要动作放在子类中。
1、在修改页面元素时,只需修改初始化函数中的元素;
2、修改业务逻辑时,需修改逻辑层代码顺序;
3、修改主业务时,无论po设计模式或普通模式,都需要重构代码。
from selenium import webdriver
import time
if __name__ == '__main__':
base_url = r"http://www.python.org"
username = "username"
password = "password"
driver = webdriver.Chrome()
driver.get(base_url)
time.sleep(3)
# OA登录——输入账密
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("loginbtn").click()
time.sleep(2)
if driver.find_element_by_id("flashbox"):
print("login successful")
else:
print("login failed")
driver.close()
→
from selenium import webdriver
import time
import pytest
# form unittest import TestCase
import unittest
# 数据层
base_url = r"http://python.html"
username = "username "
password = "password"
# 对象层
class BasePage(object):
def __init__(self):
self.name = username
self.passwd = password
self.id_name = "username"
self.id_passwd = "password"
self.id_login_btn = "loginbtn"
self.id_find = "flashbox"
self.url = base_url
self.driver = webdriver.Chrome()
def __del__(self):
# self.driver.close()
pass
# 子对象层
class LoginPage(BasePage):
def _open(self):
self.driver.get(self.url)
def test_open(self):
self._open()
time.sleep(3)
def test_input_username(self):
self.driver.find_element_by_id(self.id_name).send_keys(username)
def test_input_passwd(self):
self.driver.find_element_by_id(self.id_passwd).send_keys(password)
def test_click_login(self):
self.driver.find_element_by_id(self.id_login_btn).click()
time.sleep(2)
def test_verification(self):
if self.driver.find_element_by_id(self.id_find):
print("login successful")
else:
print("login failed")
# 实例类
class CaseRun(unittest.TestCase):
def setUp(self):
self.mf = LoginPage()
self.mf.test_open()
# 逻辑层
def test_login(self):
self.mf.test_input_username()
self.mf.test_input_passwd()
self.mf.test_click_login()
self.mf.test_verification()
def tearDown(self):
self.mf.driver.quit()
# pass
# 业务层
if __name__ == '__main__':
unittest.main()
# pytest.main()
最后:下面是配套学习资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux
6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 ,10、开放性测试题,11、安全测试,12、计算机基础