自动化测试:PO模式介绍及案例
点击文末小卡片免费获取软件测试全套资料资料在手涨薪更快POPage Object设计模式是一种面向对象( 页面对象的设计模式将测试对象及单个的测试步骤封装在每个Page对象以page为单位进行管理。优点可以使代码复用降低维护成本提高程序可读性和编写效率。可以将页面定位和业务操作分开测试对象元素对象和测试脚本用例脚本提高用例的可维护非PO模式PO模式面向过程的线性脚本POM把页面元素定位和业务操作流程分开实现松耦合复用性性差UI元素的改变不需要修改业务逻辑代码只需要找到对应的PO页修改定位即可数据代码分离维护性差PO能使代码更具有可读性高复用性、可维护性PO三层模式主要分三层1.base层对象库层page页面一些公共的方法。如初始化、元素定位、点击、输入、获取文本、截图等方法2.page层操作层封装对元素的操作。将每个涉及的元素操作单独封装一个操作方法然后根据需求组装操作步骤如登录方法输入帐号输入密码点击登录三个操作进行组装3.scripts层业务层导包调用 page页面使用单元测试框架对业务逻辑进行封装测试。如实现登录直接调用page组装的登陆方法即可。三者的关系page层继承base层scripts层调用page层案例项目结构介绍创建项目如下图1. 构建基础的 BasePage 对象层创建driver浏览器驱动封装# encodingUTF-8 # 浏览器启动 from selenium import webdriver def browser(): driverwebdriver.Chrome() # driver.get(http://www.baidu.com) return driver创建myuni.py文件,初始化封装定义一个继承自unittest.TestCase的测试用例类定义setUp和tearDown这两个方法与junit相同即如果定义了则会在每个测试case执行前先执行setUp方法执行完毕后执行tearDown方法。# encodingUTF-8 import unittest from driver import * class StartEnd(unittest.TestCase): def setUp(self): self.driverbrowser() self.driver.implicitly_wait(10) self.driver.maximize_window() def tearDown(self): self.driver.quit()创建function.py文件截图功能# encodingUTF-8 import os from selenium import webdriver # 截图 def insert_img(driver,filename): func_pathos.path.dirname(__file__) # print(func_path) base_diros.path.dirname(func_path) # print(base_dir) # 将路径转化为字符串 base_dirstr(base_dir) # 对路径的字符串进行替换 base_dirbase_dir.replace(\\,/) # print(base_dir) # 获取项目文件的要目录路径 basebase_dir.split(/Website)[0] # print(base) # 指定截图存放路径(注意路径最后要加/) filepathbase/Website/test_report/screnshot/filename driver.get_screenshot_as_file(filepath) if __name____main__: driverwebdriver.Chrome() driver.get(http://www.sogou.com)2. 构建首页的 Page 层操作层创建BasePage.py文件判断打开的页面是否是预期的页面# encodingUTF-8 from time import sleep class Page(): def __init__(self,driver): self.driverdriver self.base_urlhttp://localhost self.timeout10 def _open(self,url): url_self.base_urlurl # print(这个页面url是%s%url_) self.driver.maximize_window() self.driver.get(url_) # sleep(2) assert self.driver.current_urlurl_,这不是我们想要的地址 def open(self): self._open(self.url) def find_element(self,*loc): return self.driver.find_element(*loc)创建LoginPage.py文件页面元素定位封装# encodingUTF-8 from BasePage import * from selenium.webdriver.common.by import By class LoginPage(Page): url/news/ username_loc(By.NAME,username) password_loc(By.NAME,password) submit_loc(By.NAME,Submit) def type_username(self,username): self.find_element(*self.username_loc).send_keys(username) def type_password(self,password): self.find_element(*self.password_loc).send_keys(password) def type_submit(self): self.find_element(*self.submit_loc).click() def login_action(self,username,password): self.open() self.type_username(username) self.type_password(password) self.type_submit() loginPass_loc(By.LINK_TEXT,我的空间) loginErr_loc(By.LINK_TEXT,加入收藏) def type_loginPass_hint(self): return self.find_element(*self.loginPass_loc).text def type_loginErr_hit(self): return self.find_element(*self.loginErr_loc).text3.构建业务层创建test_login.py文件导包function、myunit、LoginPage创建LoginTest类继承myunit.StartEnd初始化方法定义测试用例名字以test开头unittest会自动将test开头的方法放入测试用例集中实现登录调用LoginPage组装的登陆方法输入用户名、密码、点击登录、断言截图# encodingUTF-8 import unittest from model import function,myunit from page_object.LoginPage import * from time import sleep class LoginTest(myunit.StartEnd): def test_login1_normal(self): print(test_login1_normal测试开始) poLoginPage(self.driver) po.login_action(yuruyi,12345678) sleep(5) self.assertEqual(po.type_loginPass_hint(),我的空间) function.insert_img(self.driver,login_normal.png) print(test_login1_normal执行结束) def test_login2_PasswdError(self): print(test_login2_PasswdError测试开始) poLoginPage(self.driver) po.login_action(yuruyi,1234567) sleep(5) self.assertEqual(po.type_loginErr_hit(),加入收藏) function.insert_img(self.driver,login_Err.png) print(test_login2_PasswdError执行结束) def test_login3_empty(self): print(test_login3_empty测试开始) po LoginPage(self.driver) po.login_action(, ) sleep(5) self.assertEqual(po.type_loginErr_hit(), 加入收藏) function.insert_img(self.driver, login_empty.png) print(test_login3_empty执行结束) if __name____main__: unittest.main()常用断言方法4. 构建用例集执行文件输出自动化测试报告在测试用例、测试文件比较多的时候使用统一的主测试执行文件进行测试用例的执行非常方便这就需要结合discover方法和TextTestRunner进行。# encodingUTF-8 import unittest # 测试报告模板 from HTMLTestRunnerCN import HTMLTestRunner import time report_dir./test_report test_dir./test_case print(start run test case) discoverunittest.defaultTestLoader.discover(test_dir,patterntest_login.py) nowtime.strftime(%Y-%m-%d %H_%M_%S) report_namereport_dir/nowresult.html print(start write report..) #使用runner运行器运行测试集 with open(report_name,wb)as f: runnerHTMLTestRunner(streamf,titleTest Report,descriptionlocalhost login test) runner.run(discover) f.close() print(Test end)测试报告模板最后感谢每一个认真阅读我文章的人礼尚往来总是要有的虽然不是什么很值钱的东西如果你用得到的话可以直接拿走这些资料对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库这个仓库也陪伴我走过了最艰难的路程希望也能帮助到你凡事要趁早特别是技术行业一定要提升技术功底。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2521976.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!