当前位置: 首页 > news >正文

【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——>下拉框选择测试框架

http://www.jsqmd.com/news/399289/

相关文章:

  • 多源异构大数据融合挖掘技术
  • 模型蒸馏在AI原生应用中的5大核心优势解析
  • 【UI自动化测试】1_PO模式 _面向过程编码
  • 开发日志4
  • 讲讲积分墙广告、精品页面、canvas 的 SEO 密码
  • Copilot进阶教程:在AI原生应用中实现智能开发工作流
  • 题解:AcWing 835 Trie字符串统计
  • 冥想第一千七百九十九天(1799)
  • 临沂有实力的橡胶木板材公司哪家好 - 品牌推荐(官方)
  • 冥想第一千八百天(1800)
  • 聊聊 Comsol 中的拓扑优化那些事儿
  • 2036年,AGI会如约而至吗?深度剖析通用人工智能的十年之约与未来图景
  • 题解:AcWing 143 最大异或对
  • 题解:AcWing 829 模拟队列
  • Seedance 深度解析:字节跳动 AI 视频生成模型从 1.0 到 2.0 的全面进化
  • 题解:AcWing 831 KMP字符串
  • CVE-2016-6802
  • 探秘DS18B20:单总线数字温度传感器的原理与应用
  • 题解:AcWing 154 滑动窗口
  • 与相似的灵魂为邻——一位文化从业者的圈层选择
  • 题解:AcWing 3302 表达式求值
  • CST仿真:探索涡旋与聚焦的奇妙世界
  • 678678678
  • SaaS架构下AI原生应用的最佳实践与案例分析
  • 题解:P15369 『ICerOI Round 1』并非图论
  • 题解:AcWing 828 模拟栈
  • 深度解析AI原生应用领域的事件驱动机制
  • 大数据ETL处理:GPU加速方案设计与性能优化
  • C语言中的数据类型和变量
  • 题解:AcWing 827 双链表