
【软件测试】8. 自动化测试实践一、 编写web测试用例二、自动化测试脚本开发2.1 用例需要用到的配置common包1 Utils.py2.2 存放测试用例文件tests包1BlogLogin.py博客登录页相关测试用例2BlogList.py博客首页相关测试用例3BlogDetail.py博客详情页相关测试用例4BlogEdit.py博客编辑页相关测试用例5RunTest.py三、将自动化测试补充到测试报告3.1 测试报告模板3.2 测试报告主要内容以码海阁博客系统为例基于web项目进行完整的自动化实战。一、 编写web测试用例二、自动化测试脚本开发参考测试用例创建自动化测试项目编写自动化测试脚本。项目代码结构2.1 用例需要用到的配置common包1 Utils.pyimportdatetimeimportos.pathimportsys# 创建一个浏览器对象fromseleniumimportwebdriverfromselenium.webdriver.edge.serviceimportServicefromwebdriver_manager.microsoftimportEdgeChromiumDriverManagerclassDriver:driverdef__init__(self):optionswebdriver.EdgeOptions()self.driverwebdriver.Edge(serviceService(EdgeChromiumDriverManager().install()),optionsoptions)self.driver.implicitly_wait(2)defgetScreeShot(self):# 创建屏幕截图# 图片文件名称./2024-07-19-134936.pngdirnamedatetime.datetime.now().strftime(%Y-%m-%d)# 判断dirname文件夹是否已经存在若不存在则创建文件夹# ../images/2024-07-19ifnotos.path.exists(../images/dirname):# ../images/2024-07-19os.mkdir(../images/dirname)# 2024-07-19-134936.png# 图片路径./images/调用方法-2024-07-19/2024-07-19-134936.png# 图片路径./images/LoginSucTest-2024-07-19/2024-07-19-134936.png# 图片路径./images/LoginFailTest-2024-07-19/2024-07-19-134936.pngfilenamesys._getframe().f_back.f_code.co_name-datetime.datetime.now().strftime(%Y-%m-%d-%H%M%S).pngself.driver.save_screenshot(../images/dirname/filename)BlogDriverDriver()2.2 存放测试用例文件tests包1BlogLogin.py博客登录页相关测试用例# 导入time模块可以让程序暂停等待比如等待页面加载importtime# 从selenium库中导入By用来告诉程序用哪种方式找元素比如用ID、CSS选择器fromselenium.webdriver.common.byimportBy# 从common文件夹的Utils.py文件中导入BlogDriver就是之前创建好的浏览器对象fromcommon.UtilsimportBlogDriver# 定义一个类用来测试博客登录页面的所有功能# 类就相当于一个工具箱里面放着跟登录相关的所有测试方法classBlogLogin:# 类的属性存放登录页面的网址暂时是空字符串后面会赋值url# 类的属性存放浏览器驱动对象暂时是空字符串后面会赋值driver# 构造方法当你写 BlogLogin() 创建对象时这个方法会自动执行def__init__(self):# 把登录页面的网址存到 self.url 里self.urlhttp://192.168.47.135:8653/blog_system/blog_login.html# 把之前创建好的浏览器对象拿过来存到 self.driver 里# 注意所有测试类都共用这一个浏览器不会重复打开self.driverBlogDriver.driver# 让浏览器打开登录页面self.driver.get(self.url)# 测试用例1测试用正确的账号密码能否登录成功defLoginSucTest(self):# 步骤1找到用户名输入框先清空里面可能已有的文字self.driver.find_element(By.CSS_SELECTOR,#username).clear()# 步骤2找到密码输入框先清空里面可能已有的文字self.driver.find_element(By.CSS_SELECTOR,#password).clear()# 步骤3在用户名框里输入正确的用户名 zhangsanself.driver.find_element(By.CSS_SELECTOR,#username).send_keys(zhangsan)# 步骤4在密码框里输入正确的密码 123456self.driver.find_element(By.CSS_SELECTOR,#password).send_keys(123456)# 步骤5找到登录按钮并点击self.driver.find_element(By.CSS_SELECTOR,#submit).click()# 步骤6验证是否登录成功# 登录成功后页面会跳转到首页首页上会显示用户的昵称# 如果能找到这个昵称元素说明登录成功如果找不到程序会报错self.driver.find_element(By.CSS_SELECTOR,body div.container div.left div h3)# 步骤7截个图保存当前页面的样子方便以后看结果BlogDriver.getScreenShot()# 步骤8返回登录页面为了下一个测试用例能重新开始self.driver.back()# 测试用例2测试用错误的密码能否登录失败defLoginFailTest(self):# 注意如果多次调用 send_keys文字会拼在一起而不是替换# 比如先 send_keys(abc) 再 send_keys(123)结果变成 abc123# 所以要先用 clear() 清空输入框再输入新内容# 步骤1找到用户名输入框清空self.driver.find_element(By.CSS_SELECTOR,#username).clear()# 步骤2找到密码输入框清空self.driver.find_element(By.CSS_SELECTOR,#password).clear()# 步骤3输入正确的用户名 zhangsanself.driver.find_element(By.CSS_SELECTOR,#username).send_keys(zhangsan)# 步骤4输入错误的密码 123正确密码应该是 123456self.driver.find_element(By.CSS_SELECTOR,#password).send_keys(123)# 步骤5点击登录按钮self.driver.find_element(By.CSS_SELECTOR,#submit).click()# 步骤6获取页面上的错误提示文字# 登录失败时页面上会显示用户名或密码错误# 用 find_element 找到这个提示用 .text 取出里面的文字存到 actual 变量里actualself.driver.find_element(By.CSS_SELECTOR,#body).text# 步骤7截个图保存错误页面BlogDriver.getScreenShot()# 步骤8用 assert 断言来检查结果是否符合预期# 如果 actual 等于 用户名或密码错误说明测试通过程序继续# 如果 actual 不等于 用户名或密码错误说明测试失败程序报错停止assertactual用户名或密码错误2BlogList.py博客首页相关测试用例fromselenium.webdriver.common.byimportByfromcommon.UtilsimportBlogDriver# 博客首页测试用例classBlogList:urldriverdef__init__(self):# 注意列表页URL不是登录页self.urlhttp://8.137.19.140:9090/blog_list.htmlself.driverBlogDriver.driver self.driver.get(self.url)# 测试首页登录情况下defListTestByLogin(self):# 1. 测试博客标题是否存在第一篇文章的标题链接self.driver.find_element(By.CSS_SELECTOR,body div.container div.right div:nth-child(1) a)# 2. 测试编辑按钮是否存在self.driver.find_element(By.CSS_SELECTOR,body div.container div.right div:nth-child(1) a.btn-edit)# 3. 测试博客内容是否存在self.driver.find_element(By.CSS_SELECTOR,body div.container div.right div:nth-child(1) p)# 4. 个人信息-检查昵称是否存在self.driver.find_element(By.CSS_SELECTOR,body div.container div.left div h3)# 5. 添加屏幕截图BlogDriver.getScreenShot()3BlogDetail.py博客详情页相关测试用例fromselenium.webdriver.common.byimportByfromcommon.UtilsimportBlogDriver# 测试博客详情页classBlogDetail:urldriverdef__init__(self):self.urlhttp://8.137.19.140:9090/blog_detail.html?blogId2self.driverBlogDriver.driver self.driver.get(self.url)# 登录状态下的博客详情页的测试defDetailTestByLogin(self):# 检查标题self.driver.find_element(By.CSS_SELECTOR,body div.container div.right div div.title)# 检查时间self.driver.find_element(By.CSS_SELECTOR,body div.container div.right div div.date)# 检查内容self.driver.find_element(By.CSS_SELECTOR,#detail p)# 屏幕截图BlogDriver.getScreenShot()4BlogEdit.py博客编辑页相关测试用例importtimefromselenium.webdriver.common.byimportByfromcommon.UtilsimportBlogDriver# 测试博客编辑页面classBlogEdit:urldriverdef__init__(self):self.urlhttp://8.137.19.140:9090/blog_login.htmlself.driverBlogDriver.driver self.driver.get(self.url)# 正确发布博客登录状态下defEditSucTestByLogin(self):self.driver.find_element(By.CSS_SELECTOR,#title).send_keys(自动化测试创建)# 找到编辑区输入关键词编辑区域不可操作# 通过点击菜单栏达到编辑区域不为空的目的# 博客系统编辑区域默认情况下就不为空可以暂不处理# 直接点击发布按钮来发布博客self.driver.find_element(By.CSS_SELECTOR,#submit).click()# 点击完成之后出现页面跳转页面跳转需要加载时间可能会出现代码执行的速度比页面渲染的速度更快导致元素查找不到# 可以添加隐式等待/显示等待# 隐式等待创建浏览器对象之后就可以加上因为隐式等待的作用域在driver整个生命周期# 显示等待可以作用在当前代码中actualself.driver.find_element(By.CSS_SELECTOR,body div.container div.right div:nth-child(1) a).textassertactual自动化测试创建# 屏幕截图BlogDriver.getScreenShot()5RunTest.pyfromtestsimportBlogLoginfromtestsimportBlogListfromtestsimportBlogDetailfromcommon.UtilsimportBlogDriverfromtestsimportBlogEditif__name____main__:BlogLogin.BlogLogin().LoginFailTest()BlogLogin.BlogLogin().LoginSucTest()# 登录成功之后就可以调用博客首页测试首页的用例登录状态BlogList.BlogList().ListTestByLogin()# 测试登录状态下的博客详情页BlogDetail.BlogDetail().DetailTestByLogin()# 博客编辑页面BlogEdit.BlogEdit().EditSucTestByLogin()# 执行浏览器的退出BlogDriver.driver.quit()三、将自动化测试补充到测试报告3.1 测试报告模板类似这种3.2 测试报告主要内容类似这种