自动化测试:电商管理系统元素定位练习​

本次专题我们来说一下 Python中Unittest 框架的使用及如何通过HTMLTestRunner实现自动化测试报告的自动生成。案例中的代码我们仍旧使用课堂学习中部署的“电商管理系统”来实现。本次练习包括以下几个操作:

l 测试用例整体结构设计

l 测试用例的实现

l 测试套的组织及测试报告的生成

1. 测试用例整体结构设计

Unittest原名为PyUnit,是由java的JUnit衍生而来,用于编写和运行可重复的测试。基于断言机制来判断函数或方法的实际输出结果和期望输出结果是否一致,测试用例提供参数来执行函数或方法,获取它们的执行结果,然后使用断言方法来判断该函数或方法的输出结果与期望输出结果是否一致,如果一致则说明测试通过;如果不一致则说明测试不通过。

Unittest 要求单元测试类必须继承 TestCase,该类中的测试方法应以test开头,没有参数和返回值。另外可以通过在单元测试中增加两个特殊函数setUp()和tearDown()函数,用于实现在每调用一个测试方法的前后分别执行指定的动作,其中setUp是在测试函数调用前执行,tearDown是在之后执行。

我们首先为登录功能编写一个测试用例,代码结构如下,一共演示包括三个测试方法:

在这里插入图片描述

2. 测试用例的实现

接下来我们完成测试用例内容的实现。按照上面的结构,一共实现两个测试用例,一个登录的测试用例,一个增加商品类型的测试用例。

登录测试用例。这里将系统登录页面的打开和关闭功能分别封装进setUp和tearDown函数内部,这样后续每个方法执行的前后会自动打开登录页面并在测试执行之后关闭登录页面。

代码实现如下:

import unittest
from time import sleep
from selenium import webdriver# 登录测试用例
class LoginTest(unittest.TestCase):# 每执行一个测试方法前,先打开登录页面def setUp(self):self.driver = webdriver.Firefox()self.driver.implicitly_wait(10)self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')# 每执行一个测试方法后,关闭浏览器def tearDown(self):self.driver.quit()# 测试方法1:无效用户名登录测试def test_01_invalid_username(self):self.driver.find_element_by_id("username").send_keys('abcdefg')self.driver.find_element_by_id("password").send_keys('qftestxxxxx')self.driver.find_element_by_link_text('登 陆').click()sleep(2)# 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"self.assertIn('错误的用户名或密码', self.driver.page_source)# 测试方法2:无效密码登录测试def test_02_invalid_password(self):self.driver.find_element_by_id("username").send_keys('admin')self.driver.find_element_by_id("password").send_keys('123456')self.driver.find_element_by_link_text('登 陆').click()sleep(2)# 断言:如果登录失败,应该显示提示信息,包含文字:"错误的用户名或密码"self.assertIn('错误的用户名或密码', self.driver.page_source)# 测试方法3:有效用户名和密码登录测试def test_03_valid(self):self.driver.find_element_by_id("username").send_keys('admin')self.driver.find_element_by_id("password").send_keys('qftestxxxxxx')self.driver.find_element_by_link_text('登 陆').click()sleep(2)# 断言:如果登录成功,应该进入系统桌面,包含文字:"常用菜单"self.assertIn('常用菜单', self.driver.page_source)if __name__ == "__main__":unittest.main()增加商品类型测试用例。这里将系统登录和退出及关闭浏览器功能分别封装进setUp和tearDown函数内部,这样后续每个方法执行的前后会自动完成登录并在测试执行之后退出和关闭登录页面。
代码实现如下:
import random
import unittest
from time import sleep
from selenium import webdriver
from selenium.webdriver.support.select import Select# 增加商品分类测试用例
class AddTypeTest(unittest.TestCase):def setUp(self):self.driver = webdriver.Firefox()self.driver.implicitly_wait(10)self.driver.get('http://39.96.181.61/qftest-ds/index.php?m=backend&c=main&a=index')self.driver.find_element_by_id("username").send_keys('admin')self.driver.find_element_by_id("password").send_keys('qftestxxxxxxx')self.driver.find_element_by_link_text('登 陆').click()sleep(3)def tearDown(self):self.driver.switch_to.default_content()self.driver.find_element_by_link_text("退出登录").click()sleep(2)self.driver.quit()# 测试方法1:是否可要正确打开商品分类页面def test_01_open_type(self):sleep(5)# 依次点击目录:商品管理 - 商品分类self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()self.driver.find_element_by_partial_link_text('商品分类').click()sleep(5)# 切换到内部 iframeself.driver.switch_to.frame('main')# 断言:如果打开商品分类页面成功,应该包含显示文字:"分类名称"self.assertIn('分类名称', self.driver.page_source)# 测试方法2:是否可要新增商品分类,并且添加成功def test_02_add_type(self):sleep(5)# 依次点击目录:商品管理 - 商品分类self.driver.find_element_by_xpath('/html/body/div[5]/div[1]/div[2]/h3/a').click()self.driver.find_element_by_partial_link_text('商品分类').click()sleep(5)self.driver.switch_to.frame('main')# 点击“新增分类”按钮self.driver.find_element_by_xpath('/html/body/div/div[2]/div[1]/a[1]/font').click()sleep(1)# 输入分类名称self.driver.find_element_by_id('cate_name').send_keys('奥里给')sleep(1)# 从下拉列表中随机选择一个上级分类father_type = self.driver.find_element_by_id('parent_id')father_type_opts = Select(father_type).optionsrom = random.randint(0, len(father_type_opts) - 1)Select(father_type).select_by_index(rom)sleep(1)# 点击“保存并提交”按钮self.driver.find_element_by_css_selector('html body div.content form div.box div.submitbtn button.ubtn.btn').click()sleep(5)# 断言:新增的分类名称,应该显示在返回的分类表格页面中self.assertIn('奥里给', self.driver.page_source)if __name__ == "__main__":unittest.main()

3. 测试套的组织及测试报告的生成

对于测试用例的执行,我们使用unittest下面的测试套件类TestSuite,从它的类定义来看,可以理解为多个独立的测试用例(test case)可以构成一个测试套件。

想让测试用例按顺序执行,要用到TestSuite类的addTest方法。调用addTest方法后,先添加的先执行,后添加的后执行。但是这里提请大家注意一下,在PyCharm中,addTest方法并没有起到作用,原因是在PyCharm中,引入了unittest模块,会默认按照unittest模式执行,此时需要将unittest模式转换成普通模式。

我们在做自动化测试的时候,希望能生一张漂亮的测试报告来展示用例执行的结果,这里我们使用HTMLTestRunner来实现。HTMLTestRunner 是 Python 标准库的 unittest 模块的一个扩展。它生成易于使用的 HTML 测试报告。

代码实现如下:

import unittest
from HTMLTestRunner import HTMLTestRunner
from F01_login_test import LoginTest
from F02_add_type_test import AddTypeTest# 定义测试套(包含要运行的测试用例及方法)
def test_suite():suite = unittest.TestSuite()# 添加第一个测试用例及所属测试方法suite.addTest(LoginTest('test_01_invalid_username'))suite.addTest(LoginTest('test_02_invalid_password'))suite.addTest(LoginTest('test_03_valid'))# 添加第二个测试用例及所属方法suite.addTest(AddTypeTest('test_01_open_type'))suite.addTest(AddTypeTest('test_02_add_type'))return suiteif __name__ == '__main__':# 设置测试报告输出文件with open('./test_report.html', 'wb') as f:runner = HTMLTestRunner(stream=f,title="自动化测试报告",description="电商系统自动化测试报告")# 运行测试套runner.run(test_suite())

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/474501.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL数据库基础(七):DML数据表操作

文章目录 DML数据表操作 一、数据表的基本操作 1、数据表的创建 2、查询已创建数据表 3、修改数据表信息 ① 数据表字段添加 ② 修改字段名称或字段类型 ③ 删除某个字段 ④ 修改数据表名称 4、删除数据表 二、字段类型详解 1、整数类型 2、浮点类型 3、日期类型…

超声波清洗机洗眼镜好吗?超声波清洗机哪个品牌更值得推荐一些

随着科技的进步,很多朋友因为长时间沉迷于看电子产品,所以早早的就佩戴上眼镜了,从而离不开眼镜。眼镜长时间佩戴会导致上面积累着非常多的灰尘,堆积在镜片上就会导致视线变得模糊不清了,影响视线。然而很多人也很少去…

ArcGIS学习(八)基于GIS平台的控规编制办法

ArcGIS学习(八)基于GIS平台的控规编制办法 上一任务我们学习了”如何进行图片数据的矢量化?" 这一关我们来学习一个比较简单的案例一一”如何在ArcGIS中录入控规指标,绘制控规图纸?" 首先,先来看看这个案例的分析思路以及导入CAD格式的控规图纸。 接着,来看…

Python如何正确计算出“滑块验证码”的“缺失距离”(7)

前言 本文是该专栏的第63篇,后面会持续分享python爬虫干货知识,记得关注。 在本专栏之前,笔者有详细介绍过关于python如何解决“滑块缺失验证码”的方法,感兴趣的同学可以在本专栏往前翻阅并查看。 而本文,笔者将重点来介绍在处理爬虫项目的时候,遇到“滑块缺失的验证码…

[晓理紫]每日论文分享(有中文摘要,源码或项目地址)--强化学习、机器人等

专属领域论文订阅 VX关注{晓理紫},每日更新论文,如感兴趣,请转发给有需要的同学,谢谢支持 如果你感觉对你有所帮助,请关注我,每日准时为你推送最新论文。 为了答谢各位网友的支持,从今日起免费为…

17.Qt 单选框相关操作

目录 前言&#xff1a; 技能&#xff1a; 内容&#xff1a; 1. 布置界面 2.管理 3.槽函数 参考&#xff1a; 前言&#xff1a; 组合选择只能选择一个的单选框实现&#xff0c;以及管理组合单选框 技能&#xff1a; <QRadioButton> <QButtonGroup> 内容&…

python-产品篇-游戏-成语填填乐

文章目录 准备代码效果 准备 无需其他文件&#xff0c;复制即用 代码 import random list["春暖花开","十字路口","千军万马","白手起家","张灯结彩","风和日丽","万里长城","人来人往",&…

vscode配置使用和常见错误

先来看看如何使用vscode。 官网下载地址:Visual Studio Code - 代码编辑。重新 我是直接点Windows下载的&#xff0c;我看别人博客还分享下载缓慢的问题&#xff0c;大家如果也出现了可以去搜一搜&#xff0c;很容易解决。 一 大致使用 我们直接点打开文件&#xff0c;它会让…

Sora爆火,普通人的10个赚钱机会

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

C++面试宝典第28题:寻找丢失的数字

题目 给定一个包含n个整数的数组nums,其中nums[i]在区间[1, n]内。请找出所有在[1, n]范围内,但没有出现在nums中的数字,并以数组的形式返回结果。 示例1: 输入:nums = [4, 3, 2, 7, 8, 2, 3, 1] 输出:[5, 6] 示例2: 输入:nums = [1, 1] 输出:[2] 解析 初看这道题,…

基于Java开发的个人视频网站的搭建与实现[附源码]

基于Java开发的个人视频网站的搭建与实现[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &am…

root MUSIC 算法补充说明

root MUSIC 算法补充说明 多项式求根root MUSIC 算法原理如何从 2 M − 2 2M-2 2M−2 个根中确定 K K K 个根从复数域上观察 2 M − 2 2M-2 2M−2 个根的分布 这篇笔记是上一篇关于 root MUSIC 笔记的补充。 多项式求根 要理解 root MUSIC 算法&#xff0c;需要理解多项式求…