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

📅 发布时间:2026/7/11 13:39:09 👁️ 浏览次数:
【UI自动化测试】2_PO模式 _单元测试框架(重点)
文章目录一、单元测试框架二、pytest组织测试用例2.1 test_login.py2.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.driverwebdriver.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(//*[idusername]).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 idverify_code]).send_keys(8888)# e。使用Xpath 层级与属性结合策略定位登录按钮并点击self.driver.find_element_by_xpath(//*[classlogin_bnt]/a).click()sleep(2)# 获取实际结果msgself.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(//*[idusername]).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 idverify_code]).send_keys(8888)# e。使用Xpath 层级与属性结合策略定位登录按钮并点击self.driver.find_element_by_xpath(//*[classlogin_bnt]/a).click()sleep(2)# 获取实际结果msgself.driver.find_element(By.CSS_SELECTOR,.layui-layer-content).textprint(msg:,msg)# 断言期望的提示信息包含在实际结果中assert密码错误inmsg2.2 test_address.py# 导包importtimefromtimeimportsleepfromseleniumimportwebdriverfromselenium.webdriverimportActionChainsfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.selectimportSelectfromselenium.webdriver.support.waitimportWebDriverWaitclassTestAddress:# 开始执行测试之前只会打开一次浏览器defsetup_class(self):# 加self的意义定义实例属性或者类属性里面的实例方法或者类方法都可以访问# self表示当前类属性self.driverwebdriver.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(//*[idusername]).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 idverify_code]).send_keys(8888)# e。使用Xpath 层级与属性结合策略定位登录按钮并点击self.driver.find_element_by_xpath(//*[classlogin_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_namefcus{time.strftime(%H_%M_%S)}# 4、完成新增地址操作self.driver.find_element(By.CSS_SELECTOR,[nameconsignee]).send_keys(customer_name)self.driver.find_element(By.CSS_SELECTOR,[namemobile]).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,[nameaddress]).send_keys(幸福门街道26栋)self.driver.find_element(By.CSS_SELECTOR,[namezipcode]).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_sucWebDriverWait(self.driver,10,1).until(lambdax:x.find_element(By.XPATH,f//*[text(){customer_name}]))exceptExceptionase:# 找不到则给is_suc变量赋值为Falseis_sucFalse# 截图self.driver.get_screenshot_as_file(新增地址失败.png)assertis_suc三、pycharm中测试框架选择File——Settings——Tools——Python Integrated Tools——Testing: Default test runner——下拉框选择测试框架