大家好,欢迎来到IT知识分享网。
PO模式学习思路
采用版本迭代的方式来学习,便于对不同版本的优缺点进行对比和理解。
- V1:不使用任何设计模式和单元测试框架
- V2:使用UnitTest管理用例
- V3:使用方法封装的思想,对代码进行优化
- V4:采用PO模式的分层思想对代码进行拆分
- V5:对PO分层之后的代码继续优化
- V6:PO模式深入封装,把共同操作提取封装到父类中,子类直接调用父类的方法
无模式
1. 案例说明
对TPshop项目的登录模块进行自动化测试。
提示:登录模块包含了很多测试用例,比如:账号不存在、密码错误、验证码错误、登录成功等等。为了节省时间我们只选取几个有代表性的用例来演示。
1.1 选择的测试用例
- 账号不存在
1. 点击首页的‘登录’链接,进入登录页面2. 输入一个不存在的用户名3. 输入密码4. 输入验证码5. 点击登录按钮6. 获取错误提示信息
- 密码错误
1. 点击首页的‘登录’链接,进入登录页面2. 输入用户名3. 输入一个错误的密码4. 输入验证码5. 点击登录按钮6. 获取错误提示信息
2. V1版本
不使用任何设计模式和单元测试框架。
每个文件里编写一个用例,完全的面向过程的编程方式。
2.1 存在的问题
一条测试用例对应一个文件,用例较多时不方便管理维护
代码高度冗余
2.2 示例代码
登录功能-账号不存在
1 from selenium import webdriver 2 # 创建浏览器驱动对象,并完成初始化操作 3 driver = webdriver.Firefox() 4 driver.maximize_window() 5 driver.implicitly_wait(10) 6 driver.get("http://localhost") 7 """ 8 登录功能-账号不存在 9 """ 10 # 点击首页的‘登录’链接,进入登录页面 11 driver.find_element_by_link_text("登录").click() 12 # 输入用户名 13 driver.find_element_by_id("username").send_keys("13099999999") 14 # 输入密码 15 driver.find_element_by_id("password").send_keys("123456") 16 # 输入验证码 17 driver.find_element_by_id("verify_code").send_keys("8888") 18 # 点击‘登录’按钮 19 driver.find_element_by_name("sbtbutton").click() 20 # 获取提示信息 21 msg = driver.find_element_by_class_name("layui-layer-content").text 22 print("msg=", msg) 23 # 关闭驱动对象 24 driver.quit()
View Code
登录功能-密码错误
1 from selenium import webdriver 2 # 创建浏览器驱动对象,并完成初始化操作 3 driver = webdriver.Firefox() 4 driver.maximize_window() 5 driver.implicitly_wait(10) 6 driver.get("http://localhost") 7 """ 8 登录功能-密码错误 9 """ 10 # 点击首页的‘登录’链接,进入登录页面 11 driver.find_element_by_link_text("登录").click() 12 # 输入用户名 13 driver.find_element_by_id("username").send_keys("13012345678") 14 # 输入密码 15 driver.find_element_by_id("password").send_keys("error") 16 # 输入验证码 17 driver.find_element_by_id("verify_code").send_keys("8888") 18 # 点击‘登录’按钮 19 driver.find_element_by_name("sbtbutton").click() 20 # 获取提示信息 21 msg = driver.find_element_by_class_name("layui-layer-content").text 22 print("msg=", msg) 23 # 关闭驱动对象 24 driver.quit()
View Code
3. V2版本
使用UnitTest管理用例,并断言用例的执行结果
3.1 引入UnitTest的好处
方便组织、管理多个测试用例
提供了丰富的断言方法
方便生成测试报告
减少了代码冗余
3.2 存在的问题
代码冗余
3.3 示例代码
1 import unittest 2 from selenium import webdriver 3 class TestLogin(unittest.TestCase): 4 """ 5 对登录模块的功能进行测试 6 """ 7 @classmethod 8 def setUpClass(cls): 9 cls.driver = webdriver.Firefox() 10 cls.driver.maximize_window() 11 cls.driver.implicitly_wait(10) 12 cls.driver.get("http://localhost") 13 @classmethod 14 def tearDownClass(cls): 15 cls.driver.quit() 16 def setUp(self): 17 # 打开首页 18 self.driver.get("http://localhost") 19 # 点击首页的‘登录’链接,进入登录页面 20 self.driver.find_element_by_link_text("登录").click() 21 # 账号不存在 22 def test_login_username_is_error(self): 23 # 输入用户名 24 self.driver.find_element_by_id("username").send_keys("13099999999") 25 # 输入密码 26 self.driver.find_element_by_id("password").send_keys("123456") 27 # 输入验证码 28 self.driver.find_element_by_id("verify_code").send_keys("8888") 29 # 点击‘登录’ 30 self.driver.find_element_by_name("sbtbutton").click() 31 # 断言提示信息 32 msg = self.driver.find_element_by_class_name("layui-layer-content").text 33 print("msg=", msg) 34 self.assertIn("账号不存在", msg) 35 # 密码错误 36 def test_login_password_is_error(self): 37 # 输入用户名 38 self.driver.find_element_by_id("username").send_keys("13012345678") 39 # 输入密码 40 self.driver.find_element_by_id("password").send_keys("error") 41 # 输入验证码 42 self.driver.find_element_by_id("verify_code").send_keys("8888") 43 # 点击‘登录’ 44 self.driver.find_element_by_name("sbtbutton").click() 45 # 断言提示信息 46 msg = self.driver.find_element_by_class_name("layui-layer-content").text 47 print("msg=", msg) 48 self.assertIn("密码错误", msg)
View Code
方法封装
1. 深入理解方法封装的思想2. 能够使用方法封装的思想对代码进行优化
1. 方法封装
方法封装:是将一些有共性的或多次被使用的代码提取到一个方法中,供其他地方调用。
封装的好处:
避免代码冗余
容易维护
隐藏代码实现的细节
目的:用最少的代码实现最多的功能
2. V3版本
使用方法封装的思想,对代码进行优化。
定义获取驱动对象的工具类
封装“获取弹出框的提示消息”
2.1 定义获取驱动对象的工具类
对登录流程的代码进行优化,定义获取驱动对象的工具类
1 # utils.py 2 class DriverUtil: 3 """ 4 浏览器驱动工具类 5 """ 6 _driver = None 7 @classmethod 8 def get_driver(cls): 9 """ 10 获取浏览器驱动对象,并完成初始化设置 11 :return: 浏览器驱动对象 12 """ 13 if cls._driver is None: 14 cls._driver = webdriver.Firefox() 15 cls._driver.maximize_window() 16 cls._driver.implicitly_wait(10) 17 cls._driver.get("http://localhost") 18 return cls._driver 19 @classmethod 20 def quit_driver(cls): 21 """ 22 关闭浏览器驱动 23 """ 24 if cls._driver: 25 cls._driver.quit() 26 cls._driver = None
View Code
2.2 封装“获取弹出框的提示消息”
对登录流程的代码进行优化,封装‘获取弹出框的提示消息’的方法
1 # utils.py 2 def get_tips_msg(): 3 """ 4 获取弹出框的提示消息 5 :return: 消息文本内容 6 """ 7 msg = DriverUtil.get_driver().find_element_by_class_name("layui-layer-content").tex 8 t 9 return msg
View Code
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/34418.html