自动化测试实例:Web登录功能性测试(无验证码)

news/2024/9/28 17:49:05/

🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快

一、什么是自动化测试

把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说,自动化测试对比起手工测试除了需要写代码外并没有什么不同,它们的不同在于在各自适合的场景不同,从而使它们能够在它们的场合发挥更大的优势。

二、什么情况不需要自动化测试

①需求变动频繁

②项目周期短

③自动化脚本一次性

等受时间(少)、技术(难度大)和重用性(低)因素影响的情况

三、自动化测试过程

上面说了很多概念性的东西,现在我引入一个实例来说明自动化测试的过程。现在有一个场景,我们需要测试一个网站的登录界面(简书的登录页面)。

首先需要写测试用例(如果有需求文档再写测试用例更好,这里的登录只做最简单的手机或邮箱、密码登录,其他如记住我,注册功能不测试)

组合有两个:

手机+密码,可以拓展成①手机已注册+密码正确,②手机已注册+密码不正确,③手机未注册+密码在数据库内,④手机未注册+密码不在数据库内,⑤手机号密码均为空,⑥手机号为空,⑦密码为空,⑧手机号密码都不空。其中手机号密码全部空的情况前面四种情况都可以验证。

邮箱+密码,可以拓展的几个方面与上面相同。所以写成的手工测试用例如下图(图片中所有数据均为虚拟数据,仅供参考)

然后我们可以把这个手工测试用例转变成自动测试用例,以上的用例都属于登录这个行为的,自动化测试的用例比手工测试的用例要更详细一点。 这里举两个例子

上面的自动化测试用例中有id(编号),feature(功能名称),scenario(场景名称),given(前置条件),when(操作步骤),then(预测结果),result(实际结果)这几个元素其中,given,when,then是所有用例的基本元素,在此基础上还可以扩展更多的元素如测试数据的覆盖率,测试结果的可靠性等等,这里的元素都是用到英文是为了方便使用某些测试框架的时候直接用,可以看到里面填入的内容对比起手工测试用例要更加详细更加脚本化。

经过用例设计评审后开始进行测试,因为这次是自动化测试,所以需要写脚本,验证脚本正确性,提交缺陷。如果把脚本和用例等写在测试框架里面会更有利于我们对这次测试的管理,不过自动化测试框架是一个需要展开的内容,所以留到下下次讲。

现在我们用一个现成的框架unittest

import unittest
import time
from selenium import webdriver
from selenium.webdriver import ActionChainsclass testcase(unittest.TestCase):def setUp(self):print("test start")self.browser = webdriver.Chrome(r'D:\webdriver\chromedriver.exe')url = 'https://www.jianshu.com/sign_in'self.browser.get(url)input1 = self.browser.find_element_by_id('session_remember_me')selected = input1.is_selected()if selected:#判断勾选框是否勾选,把“记住我”勾选去掉input1.click()def test_Login_001(self):#必须要加test在前面不然不执行print("Login_001")self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888')self.browser.find_element_by_id('session_password').send_keys('ABC111')self.browser.find_element_by_class_name('sign-in-button').click()time.sleep(30)try:hover_element = self.browser.find_element_by_class_name('user')#获取需要鼠标悬停才能显示下拉栏的元素classActionChains(self.browser).move_to_element(hover_element).perform()#鼠标移动到这个元素并悬停(在头像处悬停)time.sleep(3)self.browser.find_element_by_link_text('我的主页').click()#悬停后下拉栏选择“我的主页”result1 = self.browser.find_element_by_xpath("//a[@class='name']").textself.assertEqual(result1, '昵称')#只能是self.直接不能是self.browser.except Exception as e:print("error reason:s%" % e)raise etime.sleep(1)def test_Login_002(self):print("Login_001")self.browser.find_element_by_id('session_email_or_mobile_number').send_keys('18888888888')self.browser.find_element_by_id('session_password').send_keys('')self.browser.find_element_by_class_name('sign-in-button').click()time.sleep(8)try:result1 = self.browser.find_element_by_xpath("//span[@class='noty_text']").textself.assertEqual(result1, '手机号码/邮箱地址或密码不能为空')#只能是self.直接不能是self.browser.except Exception as e:print("error reason:s%" % e)raise etime.sleep(1)'''可以继续加入用例'''def tearDown(self):self.browser.quit()print('test gone')if __name__=="__main__":unittest.main()

上面的代码只写了两条用例,剩下也是按照这个思路写,很多的代码解释我也写作注释了。因为这一篇章我不考虑验证码的问题,所以这里处理验证码的方法是在按登录后等待手动操作接着获取结果,用断言assertEqual判断结果是否正确。

这里用了setup和teardown两种方法,这两种方法都是每个case运行前或运行后都会执行一次的。这里也可以用setupclass和teardownclass来替代,这两种方法是在所有case执行前或执行后用一次,如果在以上这个例子中用setupclass和teardownclass需要在每个case的结尾加上重置回登录页面的代码,所以setupclass和teardownclass更加适合流程递进的用例。

不过这里需要提一下最后的这里unittest.main(),可以看到在执行程序前,引入了unittest,最后这个入口也指向了unittest的main方法,我们来看一下用例是如何被实现的。

首先,打开python文件夹,如果没有改安装路径应该会在C盘(如C:\Python\Lib\unittest),打开main.py文件可以看到unittest.main()调用的是class TestProgram进入到init初始化testRunner、testLoader并根据用例模块即我们写的case创建测试集和执行它。简单来说就是unittest.main()其实是到了class TestProgram里面我们的case经过init方法初始化case需要进行的所有动作,parseArgs方法传入参数并赋值,createTests方法根据前一个方法的赋值创建测试集,runTests方法执行测试用例这四个步骤。

完成测试需要输出测试结果

import unittest
import HTMLTestRunner
import time
import testcasesuite=unittest.TestSuite()#创建测试集,也就是把所有的用例放在一起
ts=unittest.TestLoader()#加载测试suite.addTests(ts.loadTestsFromModule(testcase))#寻找模块名testcase的用例,把它加载并加入到测试集now=time.strftime("%Y-%m-%d_%H_%M_%S")
path="python_report"+now+".html"with open(path,"wb+") as f:runner=HTMLTestRunner.HTMLTestRunner(stream=f,verbosity=2,title='MathFunc Test Report',description='generated by HTMLTestRunner.')'''stream表示测试报告写入文件的存储区域,如stream=f表示以文件流的方式输出报告到open(path,"wb+")的路径verbosity=1的时候 默认值为1,不限制完整结果,即单个用例成功输出’.’,失败输出’F’,错误输出’E’=0的时候。不输出信息=2的时候,需要打印详细的返回信息title表示测试报告标题description表示测试报告描述'''runner.run(suite)#输出结果html

这里的HTMLTestRunner我是下载HTMLTestRunner.py再进行修改得到的 ,修改方法及下载网上可查,你也可以通过pip install html-testRunner的方法下载最新的HTMLTestRunner,方法同样网上可查展示效果如下:

用户指导手册

用户指导手册每个公司都会有模板按照模板来写就可以了。

四、在这个过程你可能会遇到的问题

1.下载webdriver与浏览器或者浏览器版本是否匹配

这一章,主要说了不需要验证码的自动化登录是如何执行的,下一章我们聊一下有验证码的情况应该如何做登录功能的自动化测试,下下一章我们再聊自动化测试框架。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!凡事要趁早,特别是技术行业,一定要提升技术功底。


http://www.ppmy.cn/news/1531586.html

相关文章

Linux云计算 |【第四阶段】PROJECT2-DAY2

综合项目内容: 升级网站运行平台、部署Redis内存存储服务集群、数据迁移、部署PXCMySQL实现强同步、部署LB和HA集群 一、项目拓扑结构 PROJECT2-DAY1回顾: 服务架构缺点分析: ① 数据存储结构存在单点故障(需增调度器&#xff0…

Harbor使用

文章目录 1、上传镜像1.1、在Harbor上创建一个项目1.2、docker添加安全访问权限1.3、推送docker镜像到该项目中1.3.1、登录到Harbor1.3.2、给镜像重新打一个标签1.3.3、推送镜像到Harbor中 2、拉取镜像2.1、先删掉原来的镜像2.2、执行拉取命令 1、上传镜像 需求:将…

Service nxpnfc_hal_svc

类似service启动 主要分为两部分 service nxpnfc_hal_svc /vendor/bin/hw/vendor.nxp.nxpnfc1.0-serviceclass haluser nfcgroup nfc 1.nxpnfc_hal_svc,这个一般是权限te device/rockchip/common/sepolicy/nxp_nfc_server.te type nfc_vendor_data_file, file_t…

frp内网穿透服务器+客户端详细配置

当我们拥有一台云服务器时,可以将局域网服务器的服务通过内网穿透发布到公网上。frp是一个主流的内网穿透软件,本文讲解frp内网穿透服务器客户端详细配置。 一、需要准备的内容: 腾讯云服务器:https://curl.qcloud.com/Sjy0zKjy 2…

Linux如何通过链接下载文件

在Linux系统中,你可以通过多种方式通过链接下载文件。这些方式包括使用命令行工具(如wget、curl、axel等)和图形界面程序(如浏览器或文件管理器)。以下是几种常用的命令行方法: 1. 使用wget wget是一个非交…

CSS定位详解:相对定位、绝对定位、固定定位与 z-index

目录 非 VIP 用户可前往公众号回复“css”进行免费阅读 相对定位 绝对定位 固定定位 z - index 非 VIP 用户可前往公众号回复“css”进行免费阅读 相对定位 相对定位的作用是对元素自身原本的位置进行微调。它不会脱离文档流(即不脱标),其真实位置仍在 “原处…

WebSocket实现在线聊天室

项目实现源码: 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔(例如每秒或几分钟)向服务器发送HTTP请求,服务器收到请求后,处理请求并返回数据给客户端 轮询具体实现htt…

遇到 Docker 镜像拉取失败的问题时该如何解决

遇到 Docker 镜像拉取失败的问题时,可以按照以下步骤进行排查和解决: 1. 检查网络连接 确保你的计算机可以访问互联网。尝试 ping 通 Docker Hub 或其他镜像仓库的域名: ping hub.docker.com2. 检查 Docker 服务状态 确保 Docker 服务正在…