news 2026/11/1 8:10:44

【UI自动化测试】2_PO模式 _单元测试框架(重点)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【UI自动化测试】2_PO模式 _单元测试框架(重点)

文章目录

  • 一、单元测试框架
  • 二、pytest组织测试用例
    • 2.1 test_login.py
    • 2.2 test_address.py
  • 三、pycharm中测试框架选择

一、单元测试框架

pytest(组织测试用例、方便生成测试报告、自动断言)

python:unittest java:junit、testNg

二、pytest组织测试用例

""" 1、一个测试类对标手工测试用例的一个测试点(测试点有正反向) 2、每个具体用例标题对标手工用例中一个用例标题 3、类级别的初始化方法setup_class在整个测试类运行之前会运行一次 4、类级别的销毁的方法teardown_class在整个测试类运行完之后运行一次 5、函数级别的初始化方法setup在每个测试方法运行之前都会运行一次 """引入pytest的好处:-方便组织、 管理多个测试用例-提供了丰富的断言方法-方便生成测试报告-减少了代码冗余 存在的问题:-代码冗余-业务脚本与页面对象没有分开 常见问题-测试方法就是测试标题,对应的输入的测试数据一定要对应-运行测试用例,如选择单个测试方法运行则只会运行一条-运行时不是用的pytest单元测试框架运行,运行连浏览器都不会打开--第一:删除pycharm历史运行记录--第二:修改pycharm默认运行测试工具 version_02 (包)-__init__.py-test_login.py#一个登录测试多种场景,写在一个测试文件当中,文件以test开头-test_address.py# 测试新增地址

2.1 test_login.py

# 导包fromtimeimportsleepfromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportBy# 1、定义测试类 --->模块(登录模块)classTestLogin():# 开始执行测试之前只会打开一次浏览器defsetup_class(self):# 加self的意义:定义实例属性或者类属性,里面的实例方法或者类方法都可以访问# self表示当前类属性self.driver=webdriver.Chrome()# 后面访问驱动对象使用self.driver访问self.driver.maximize_window()self.driver.implicitly_wait(10)# 所有的测试用例都运行完毕才会关闭浏览器defteardown_class(self):sleep(2)self.driver.quit()# 每个测试方法的起点一致;那么证明每个测试方法运行之前都会回到首页defsetup(self):self.driver.get("https://hmshop-test.itheima.net/")# 2、定义测试方法 ---> 标题# 登录失败-(账户不存在)deftest_login_account_not_exist(self):# 4、暂停3s ->代替测试步骤# a。使用Xpath 文本定位策略定位登录超链接,并点击self.driver.find_element_by_xpath("//*[text()='登录']").click()# b。使用Xpath 属性定位策略定位用户名输入框,并输入13600001111self.driver.find_element_by_xpath("//*[@id='username']").send_keys("13611111111")# c。使用Xpath 属性包含定位策略定位密码输入框,并输入123456self.driver.find_element_by_xpath("//*[contains(@id,'pass')]").send_keys("123456")# d。使用Xpath 属性与逻辑结合策略定位验证码输入框,并输入8888self.driver.find_element_by_xpath('//*[@placeholder="验证码" and @id="verify_code"]').send_keys("8888")# e。使用Xpath 层级与属性结合策略定位登录按钮,并点击;self.driver.find_element_by_xpath("//*[@class='login_bnt']/a").click()sleep(2)# 获取实际结果:msg=self.driver.find_element(By.CSS_SELECTOR,".layui-layer-content").textprint("msg:",msg)# 判断实际结果和预期结果是否一致assertmsg=="账号不存在!"# 登录失败-(密码错误)deftest_login_password_error(self):# 4、暂停3s ->代替测试步骤# a。使用Xpath 文本定位策略定位登录超链接,并点击self.driver.find_element_by_xpath("//*[text()='登录']").click()# b。使用Xpath 属性定位策略定位用户名输入框,并输入13600001111self.driver.find_element_by_xpath("//*[@id='username']").send_keys("13600001111")# c。使用Xpath 属性包含定位策略定位密码输入框,并输入123456self.driver.find_element_by_xpath("//*[contains(@id,'pass')]").send_keys("error")# d。使用Xpath 属性与逻辑结合策略定位验证码输入框,并输入8888self.driver.find_element_by_xpath('//*[@placeholder="验证码" and @id="verify_code"]').send_keys("8888")# e。使用Xpath 层级与属性结合策略定位登录按钮,并点击;self.driver.find_element_by_xpath("//*[@class='login_bnt']/a").click()sleep(2)# 获取实际结果msg=self.driver.find_element(By.CSS_SELECTOR,".layui-layer-content").textprint("msg:",msg)# 断言,期望的提示信息包含在实际结果中assert"密码错误"inmsg

2.2 test_address.py

# 导包importtimefromtimeimportsleepfromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.selectimportSelectfromselenium.webdriver.support.waitimportWebDriverWaitclassTestAddress:# 开始执行测试之前只会打开一次浏览器defsetup_class(self):# 加self的意义:定义实例属性或者类属性,里面的实例方法或者类方法都可以访问# self表示当前类属性self.driver=webdriver.Chrome()# 后面访问驱动对象使用self.driver访问self.driver.maximize_window()self.driver.implicitly_wait(10)self.driver.get("https://hmshop-test.itheima.net/")# 所有的测试用例都运行完毕才会关闭浏览器defteardown_class(self):sleep(2)self.driver.quit()deftest_01_login_suc(self):# a。使用Xpath 文本定位策略定位登录超链接,并点击self.driver.find_element_by_xpath("//*[text()='登录']").click()# b。使用Xpath 属性定位策略定位用户名输入框,并输入13600001111self.driver.find_element_by_xpath("//*[@id='username']").send_keys("13600001111")# c。使用Xpath 属性包含定位策略定位密码输入框,并输入123456self.driver.find_element_by_xpath("//*[contains(@id,'pass')]").send_keys("123456")# d。使用Xpath 属性与逻辑结合策略定位验证码输入框,并输入8888self.driver.find_element_by_xpath('//*[@placeholder="验证码" and @id="verify_code"]').send_keys("8888")# e。使用Xpath 层级与属性结合策略定位登录按钮,并点击;self.driver.find_element_by_xpath("//*[@class='login_bnt']/a").click()sleep(2)deftest_02_add_address(self):# 2、在个人中心页面点击【账户设置】下【收货地址】ActionChains(self.driver).move_to_element(self.driver.find_element(By.XPATH,"//*[text()='账户设置']")).perform()self.driver.find_element(By.XPATH,"//*[text()='收货地址']").click()""" # (*)获取当前已经保存地址条数 old_num = self.driver.find_elements(By.CSS_SELECTOR, "em.red")[0].text print(f"新增地址前,已保存的地址条数为{old_num}") """# 3、点击【新增地址】:收货人信息 = cus{当前时间}self.driver.find_element(By.XPATH,"//*[text()='增加新地址']").click()customer_name=f"cus{time.strftime('%H_%M_%S')}"# 4、完成新增地址操作self.driver.find_element(By.CSS_SELECTOR,'[name="consignee"]').send_keys(customer_name)self.driver.find_element(By.CSS_SELECTOR,'[name="mobile"]').send_keys("13600001112")Select(self.driver.find_element(By.ID,"province")).select_by_value("1")# value属性值为1,代表北京Select(self.driver.find_element(By.ID,"city")).select_by_value("2")# 市辖区2Select(self.driver.find_element(By.ID,"district")).select_by_value("39")# 朝阳区39Select(self.driver.find_element(By.ID,"twon")).select_by_value("40")# 建外街道40self.driver.find_element(By.CSS_SELECTOR,'[name="address"]').send_keys("幸福门街道26栋")self.driver.find_element(By.CSS_SELECTOR,'[name="zipcode"]').send_keys("100000")self.driver.find_element(By.ID,"address_submit").click()# 当UI自动化脚本操作功能时,如该步骤会自动触发发送请求,最好在触发之后跟上强制等待1秒,防止发送请求失败sleep(1)""" # 5、控制滚动条移动到页面最底部 js_str = "window.scrollTo(0,2000)" self.driver.execute_script(js_str) sleep(2) # 6、刷新下界面 self.driver.refresh() # (*)再次获取当前已经保存地址条数 new_num = self.driver.find_elements(By.CSS_SELECTOR, "em.red")[0].text print(f"新增地址前,已保存的地址条数为{new_num}") # (*)判断新增完后的地址条数是否+1 如果+1则打印新增成功,否则打印新增失败 if int(new_num) -1 == int(old_num): print("新增成功") else: print("新增失败") """# 根据本次新增的【收货人】信息的文本,到界面上找元素,如果能找到则代表信息成功,找不到则失败截图try:# 显示等待# 如果找到元素对象则把元素对象赋值给is_suc变量is_suc=WebDriverWait(self.driver,10,1).until(lambdax:x.find_element(By.XPATH,f"//*[text()='{customer_name}']"))exceptExceptionase:# 找不到则给is_suc变量赋值为Falseis_suc=False# 截图self.driver.get_screenshot_as_file("新增地址失败.png")assertis_suc

三、pycharm中测试框架选择

File——>Settings——>Tools——>Python Integrated Tools——>Testing: Default test runner——>下拉框选择测试框架

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/24 11:29:08

CST仿真:探索涡旋与聚焦的奇妙世界

CST仿真 涡旋与聚焦在电磁学和光学领域,涡旋与聚焦现象一直是研究的热点。CST(Computer Simulation Technology)软件作为一款强大的电磁仿真工具,为我们深入探究这些现象提供了有力的手段。今天,咱们就来唠唠如何利用C…

作者头像 李华
网站建设 2026/10/24 16:50:26

JAVA虚拟机-JVM

了解类加载的完整过程吗? 类加载过程可以分为加载、链接和初始化三个阶段,其中链接阶段可以划分为验证、准备和解析三个子阶段。 在加载阶段,类加载器负责查找类的字节码文件并将其加载到内存中。链接(Linking) 包含三个子阶段:验…

作者头像 李华
网站建设 2026/10/24 16:51:06

vue+springboot人工智能AI问答时代个人计算机的安全防护科普系统

目录技术架构设计核心功能实现安全防护专项部署方案效能优化开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术架构设计 前端采用Vue3TypeScript构建响应式界面,使用Element Plus组件库实现科普内容展示与交互后端…

作者头像 李华
网站建设 2026/10/31 3:45:06

vue+springboot基于ai技术的学习资料分享平台

目录技术栈选择与概述核心功能模块设计AI技术实现细节前后端交互规范性能优化策略安全防护措施测试与部署方案扩展性设计开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术栈选择与概述 前端框架:Vue 3&#xff0…

作者头像 李华
网站建设 2026/11/1 4:28:56

vue+springboot甜点蛋糕商城系统 团子烘焙销售服务系统

目录技术架构设计前端实现(Vue.js)后端实现(Spring Boot)数据库设计部署与运维扩展功能性能与安全优化开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!技术架构设计 前后端分离架…

作者头像 李华
网站建设 2026/10/31 2:34:10

《时间简史》深度读书笔记(系统整合扩展版)

《时间简史》深度读书笔记(系统整合扩展版) 作者:史蒂芬霍金 英文原名:A Brief History of Time 出版时间:1988年一、写作背景与时代意义 20世纪是人类物理学发生剧烈革命的世纪。 在短短一百年内,人类完成…

作者头像 李华