1. 方法封装基本步骤
- 找个合适的位置存放封装的方法(谁都能够方便调用)
- 定义方法(函数)
- 将要封装内容原方不动的拷贝到定义的方法内部
- 观察拷贝过的来的内容, 是否缺少某些东西(是否有报错)
- 缺什么给什么(修复错误), 确认是否需要添加返回值
- 将原来的位置替换为封装好的方法名(使用)
2. PO设计模式
V1
-
实现形式:一条测试用例对应一个测试脚本
-
缺陷:
- 由于是同一个模块下的测试用例, 测试步骤完全一致, 测试数据不同, 测试脚本代码存在高度冗余
- 一条用例对应一个测试脚本, 后期不好维护
-
结论:属于自动化测试, 但是存在缺陷
-
代码实现:
- 账号不存在
- 密码不存在
""" 账号不存在 点击首页的‘登录’链接,进入登录页面 输入一个不存在的用户名 输入密码 输入验证码 点击登录按钮 获取错误提示信息 """ from selenium import webdriver import time driver = webdriver.Chrome() driver.get('http://127.0.0.1/') driver.implicitly_wait(10) # 隐式等待 driver.maximize_window() # 窗口最大化 # 点击首页的‘登录’链接,进入登录页面 driver.find_element_by_link_text('登录').click() # 输入一个不存在的用户名 driver.find_element_by_id('username').send_keys('13811110000') # 输入密码 driver.find_element_by_id('password').send_keys('123456') # 输入验证码 driver.find_element_by_id('verify_code').send_keys('8888') # 点击登录按钮 driver.find_element_by_name('sbtbutton').click() # 获取错误提示信息 msg = driver.find_element_by_class_name('layui-layer-content').text print('msg:', msg) time.sleep(3) driver.quit()
""" 密码错误 点击首页的‘登录’链接,进入登录页面 输入用户名 输入一个错误的密码 输入验证码 点击登录按钮 获取错误提示信息 """ from selenium import webdriver import time driver = webdriver.Chrome() driver.get('http://127.0.0.1/') driver.implicitly_wait(10) # 隐式等待 driver.maximize_window() # 窗口最大化 # 点击首页的‘登录’链接,进入登录页面 driver.find_element_by_link_text('登录').click() # 输入用户名 driver.find_element_by_id('username').send_keys('13800001111') # 输入一个错误的密码 driver.find_element_by_id('password').send_keys('error') # 输入验证码 driver.find_element_by_id('verify_code').send_keys('8888') # 点击登录按钮 driver.find_element_by_name('sbtbutton').click() # 获取错误提示信息 msg = driver.find_element_by_class_name('layui-layer-content').text print('msg:', msg) time.sleep(3) driver.quit()
V2
-
实现形式:
- 一条测试用例对应一个测试方法
- 类级别 Fixture 和方法级别 Fixture 结合使用, 优化所有测试用例的前置操作和后续收尾工作
-
缺陷:元素定位及元素操作部分的代码依然存在冗余
-
结论:属于自动化测试, 但是存在缺陷
-
代码实现:
""" 登录测试用例 """ import unittest from selenium import webdriver import time class TestTPShopLogin(unittest.TestCase): """登录测试类""" @classmethod def setUpClass(cls) -> None: cls.driver = webdriver.Chrome() cls.driver.get('http://127.0.0.1/') cls.driver.implicitly_wait(10) # 隐式等待 cls.driver.maximize_window() # 窗口最大化 @classmethod def tearDownClass(cls) -> None: time.sleep(3) cls.driver.quit() def setUp(self) -> None: self.driver.get('http://127.0.0.1/') # 打开首页 # 点击首页的‘登录’链接,进入登录页面 self.driver.find_element_by_link_text('登录').click() # def tearDown(self) -> None: # pass def test_account_does_not_exist(self): """用户不存在""" # 输入一个不存在的用户名 self.driver.find_element_by_id('username').send_keys('13811110000') # 输入密码 self.driver.find_element_by_id('password').send_keys('123456') # 输入验证码 self.driver.find_element_by_id('verify_code').send_keys('8888') # 点击登录按钮 self.driver.find_element_by_name('sbtbutton').click() time.sleep(2) # 获取错误提示信息 msg = self.driver.find_element_by_class_name('layui-layer-content').text print('msg:', msg) # 设置断言判断测试结果 # self.assertIn(预期结果, 实际结果) self.assertIn('账号不存在', msg) def test_wrong_password(self): """密码错误""" # 输入用户名 self.driver.find_element_by_id('username').send_keys('13800001111') # 输入一个错误的密码 self.driver.find_element_by_id('password').send_keys('error') # 输入验证码 self.driver.find_element_by_id('verify_code').send_keys('8888') # 点击登录按钮 self.driver.find_element_by_name('sbtbutton').click() # 获取错误提示信息 msg = self.driver.find_element_by_class_name('layui-layer-content').text print('msg:', msg) # 设置断言判断测试结果 self.assertIn('密码错误', msg) if __name__ == '__main__': unittest.main()
V3
-
核心内容
- 方法封装:是将一些有共性的或多次被使用的代码提取到一个方法中,供其他地方调用
- 好处:
- 减少代码冗余度
- 提高可维护性
- 隐藏代码的具体实现细节
-
实现内容
- 浏览器驱动对象工具类的封装实现
- 定义浏览器对象工具类
- 定义获取和退出浏览器对象方法 : 确保在一次代码执行周期内, 只有一个浏览器驱动对象
- 调用
- 获取弹窗信息方法的封装实现
- 方法封装基本步骤
- 找个合适的位置存放封装的方法(谁都能够方便调用)
- 定义方法(函数)
- 将要封装内容原方不动的拷贝到定义的方法内部
- 观察拷贝过的来的内容, 是否缺少某些东西(是否有报错)
- 缺什么给什么(修复错误), 确认是否需要添加返回值
- 将原来的位置替换为封装好的方法名(使用)
- 方法封装基本步骤
- 浏览器驱动对象工具类的封装实现
-
代码实现
""" 登录测试用例 """ import unittest from selenium import webdriver import time from utils import DriverUtil, get_tip_message class TestTPShopLogin(unittest