💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
[TOC] ## **一、跳过用例** ~~~ 分类: 1.直接跳过 语法: unittest.skip(说明) 场景:一般适合功能未实现完成用例 2.条件满足跳过 语法: unittest.skipIf(条件,原因) 场景:一般判断条件满足,就不执行;如:达到指定版本,此功能失效; 提示: 以上两种方式,都可以修饰函数和类; ~~~ <br /> ## **二、HTML测试报告** ~~~ HTML报告:根据 TextTestrunner改编而来 操作: 1.导包 from xx.HTMLTestRunner import HTMLTestRunner 2.定义测试套件 suite unittest defaultTestLoader.discover("../case", pattern="test*.py) 3.实例化 HTMLTestRunner类,并调用run方法执行测试套件。 with open(报告存放路径, "wb") as f: #注意:生成html报告,必须使用wb,以二进制形式写入 # 实例化HTMLTestRunner类 HTMLTestRunner(stream=f).run(测试套件) ~~~ <details> <summary>run_html.py</summary> ``` # run_html.py ''' 目标:基于unittest框架执行生成html版报告 操作: 1.复制 HtmlTestRunner.py文件到指定目录 2.导包 from HTMLTestRunner import HTMLTestRunner 3.获取报告存放文件流,并实例化 HTMLTestRunner类,执行run方法 ''' import unittest import time from day06.tools.HTMLTestRunner import TextTestRunner suite = unittest.defaultTestLoader.discover("../case", pattern="test*.py") report_dir = "../report{}.html".format(time.strftime("%Y_%m_%d_%H_%M_%S")) with open(report_dir, "wb") as f: TextTestRunner(stream=f, verbosity=2, title="xxx项目自动化测试报告", descriptions="macOS系统") ``` </details> <br /> <details> <summary>test03_open_with.py</summary> ``` # test03_open_with.py ''' 目标:open 与 with open 的区别 1.共同点:打开文件 2.不同点:with open = 执行打开操作+关闭操作 ''' f = None try: f = open("../report/text.txt", "r", encoding="utf-8") print(f.read()) except: pass finally: f.close() '''with open 极力推荐''' # 读取 with open("../report/text.text.txt", "r", encoding="utf-8") as f: f.read() # 写入 with open("../report/text.text.txt", "w", encoding="utf-8") as f: f.read() ''' 文件流:打开指定写入的文件 ''' ``` </details> <br /> ## **三、po案例** ~~~ 版本: v1:不采用任何模式(线性模型) v2:采用测试框 unittest v3:业务代码和页面对象进行 v4:实际中的po模式编写 案例: tpshop:登录 1.账号不存在 2.密码错误 问题: v1:无法批量运行 v2:业务脚本与页面对象没有分开 PO介绍: PO:page(页面) object(对象) ~~~ <details> <summary>v1/test_login_password_error.py</summary> ``` # v1/test_login_password_error.py from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.implicitly_wait(30) driver.get("https://account.cnblogs.com/signin") # 打开登录链接 driver.find_element_by_partial_link_text("登录").click() # 输入用户名 driver.find_element_by_css_selector("#username").send_keys("130111222") # 输入密码 driver.find_element_by_css_selector("#password").send_keys("123456") # 输入验证码 driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 点击登录按钮 driver.find_element_by_css_selector(".J-login-submit").click() # 获取错误提示信息 msg = driver.find_element_by_css_selector(".layui-layer-content").text # 断言 assert msg == "密码错误!" # 点击提示框确定按钮 driver.find_element_by_css_selector("./layui-btn0").click() # 关闭 driver.quit() ``` </details> <br /> <details> <summary>v2/test_login.py</summary> ``` # v2/test_login.py import unittest from selenium import webdriver class TestLogin(unittest.TestCase): # 初始化 setUp def setUp(self): self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.implicitly_wait(30) self.driver.get("https://account.cnblogs.com/signin") # 打开登录链接 self.driver.find_element_by_partial_link_text("登录").click() # 结束 tearDown def tearDown(self): pass # 新建测试方法 用户名不存在 def test_login_username_not_exist(self): # 输入用户名 self.driver.find_element_by_css_selector("#username").send_keys("130111222") # 输入密码 self.driver.find_element_by_css_selector("#password").send_keys("123456") # 输入验证码 self.driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 点击登录按钮 self.driver.find_element_by_css_selector(".J-login-submit").click() # 获取错误提示信息 msg = self.driver.find_element_by_css_selector(".layui-layer-content").text try: # 断言 self.assertEqual(msg, "账号不存在!") # 点击提示框确定按钮 self.driver.find_element_by_css_selector("./layui-btn0").click() except AssertionError: # 截图 self.driver.get_screenshot_as_file("../image/fail.png") # 新建测试方法 密码错误 def test_login_password_err(self): # 输入用户名 self.driver.find_element_by_css_selector("#username").send_keys("130111222") # 输入密码 self.driver.find_element_by_css_selector("#password").send_keys("123456") # 输入验证码 self.driver.find_element_by_css_selector("#verify_code").send_keys("8888") # 点击登录按钮 self.driver.find_element_by_css_selector(".J-login-submit").click() # 获取错误提示信息 msg = self.driver.find_element_by_css_selector(".layui-layer-content").text try: # 断言 self.assertEqual(msg, "密码错误!") # 点击提示框确定按钮 self.driver.find_element_by_css_selector("./layui-btn0").click() except AssertionError: # 截图 self.driver.get_screenshot_as_file("../image/fail.png") ``` </details> <br /> ``` v版本: 结构: 1. base(基类):page页面公共的方法 # Base类 # 初始化方法 # 查找元素方法 # 点击元素方法 # 输入方法 # 获取文本方法 # 截图方法 注意: 1. 以上方法封装时候,解包只需1此,在查找元素解包; 2. driver为虚拟,谁调用base时,谁传入,无需关注从哪里来; 3. 1oc: 真正使用1oc的方法只有查找元素方法用; 2.page(页面对象):一个页面封装成一个对象 应用: 继承base 实现: 1.模块名: page+实际操作模块名称 如:page_1ogin.py; 2.页面对象名: 以大驼峰方法将模块名抄进来,有下划线去掉下划线; 3.方法: 涉及元素,将每个元素操作单独封装一个操作方法; 4.组装: 根据需求组装以上操作步骤; 3. scripts(业务层): 导包调用page页面 实现: 1.模块:test+实际操作模块名称如:test_1ogin.py 2.测试业务名称:以大驼峰方法将模块名抄进来,有下划线去掉下划线 3.方法: 1.初始化方法 setUp() 注:在 unittest框架中不能使用 def __init__()初始化方法; # 实例化页面对象 # 前置操作 如:打开等等 2.结束方法 teardown # 关闭驱动 3.测试方法 # 根据要操作的业务来实现 扩展: loc变量:类型为元组;*loc为解包; ``` ![E58865E8-4D54-46E2-B15A-2159F574CED4.jpg](https://i.loli.net/2021/01/17/MwJkgaWBRVpPUeo.jpg) <details> <summary>base/base.py</summary> ``` # base/base.py from selenium.webdriver.support.wait import WebDriverWait from selenium import webdriver class Base: # 初始化 def __init__(self, driver): # self.driver = driver # 临时代替driver self.driver = webdriver.Chrome() self.driver.maximize_window() self.driver.get("http://localhost") # 查找元素方法(提供:点击、输入、获取文本)使用 def base_find_lement(self, loc, timeout=30, poll=0.5): return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).\ until(lambda x:x.find_element(*loc)) # 点击方法 def base_click(self, loc): self.base_find_lement(loc).click() # 输入方法 def base_input(self, loc, value): el = self.base_find_lement(loc) # 清空 el.clear() # 输入 el.send_keys(value) # 获取文本 def base_get_text(self, loc): # 注意:一定要返回元素的文本信息 return self.base_find_lement(loc).text # 截图方法 def base_get_image(self): self.driver.get_screenshot_as_file("../image/fail.png") ``` </details> <br /> <details> <summary>page/__init__.py</summary> ``` # page/__init__.py from selenium.webdriver.common.by import By '''以下为登录页面元素配置信息,临时存放地''' # 登录链接 login_link = By.PARTIAL_LINK_TEXT, "登录" # 用户名 login_username = By.ID, "username" # 密码 login_pwd = By.ID, "password" # 验证码 login_verify_code = By.ID, "verify_code" # 登录按钮 login_btn = By.CSS_SELECTOR, ".j-login-submit" # 获取异常文本信息 login_err_info = By.CSS_SELECTOR, ".layui-layer-content" # 点击异常提示框 按钮 login_err_btn_ok = By.CSS_SELECTOR, "./layui-layer--btn0" ``` </details> <br /> <details> <summary>page/page_login.py</summary> ``` # page/page_login.py from day06_02.v4 import page from day06_02.v4.base import Base class PageLogin(Base): # 点击登录链接 def page_click_login_link(self): self.base_click(page.login_link) # 输入用户名 def page_input_username(self, username): self.base_input(page.login_username, username) # 输入密码 def page_input_password(self, pwd): self.base_input(page.login_pwd, pwd) # 输入验证 def page_input_verify_code(self, code): self.base_input(page.login_verify_code, code) # 点击登录按钮 def page_click_login_btn(self): self.base_click(page.login_btn) # 获取异常提示信息 def page_get_error_info(self): return self.base_get_text(page.login_err_info) # 点击异常信息框 【确定】按钮 def page_click_err_btn_ok(self): self.base_click(page.login_err_btn_ok) # 截图 def page_get_screenshot(self): self.base_get_image() # 组合业务方法 def page_login(self, username, pwd, code): self.page_input_username(username) self.page_input_password(pwd) self.page_input_verify_code(code) self.page_click_login_btn() ``` </details> <br /> <details> <summary>scripts/test_login.py</summary> ``` # scripts/test_login.py import unittest from day06_02.v4.page_login import PageLogin from parameterized import parameterized def get_data(): return [("138111222", "123456", "8888", "账号不存在!"), ("1380003333", "123123", "8888", "密码错误!")] class TestLogin(unittest.TestCase): login = None @classmethod def setUpClass(cls): # 实例化 获取页面对象 PageLogin cls.login = PageLogin() # 点击登录链接 cls.login.page_click_login_link() @classmethod def tearDownClass(cls): # 关闭 driver驱动对象 cls.login.driver.quit() # 登录测试方法 @parameterized.expand(get_data()) def test_login(self, username, pwd, code, except_result): # 调用登录方法 self.login.page_login(username, pwd, code) # 获取登录提示信息 msg = self.login.page_get_error_info() try: # 断言 self.assertEqual(msg, except_result) except AssertionError: # 截图 self.login.page_get_img() ``` </details> <br />