自动化测试实例:Web登录功能性测试(无验证码)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快
一、什么是自动化测试
把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说,自动化测试对比起手工测试除了需要写代码外并没有什么不同,它们的不同在于在各自适合的场景不同,从而使它们能够在它们的场合发挥更大的优势。
二、什么情况不需要自动化测试
①需求变动频繁
②项目周期短
③自动化脚本一次性
等受时间(少)、技术(难度大)和重用性(低)因素影响的情况
三、自动化测试过程
上面说了很多概念性的东西,现在我引入一个实例来说明自动化测试的过程。现在有一个场景,我们需要测试一个网站的登录界面(简书的登录页面)。

首先需要写测试用例(如果有需求文档再写测试用例更好,这里的登录只做最简单的手机或邮箱、密码登录,其他如记住我,注册功能不测试)
组合有两个:
手机+密码,可以拓展成①手机已注册+密码正确,②手机已注册+密码不正确,③手机未注册+密码在数据库内,④手机未注册+密码不在数据库内,⑤手机号密码均为空,⑥手机号为空,⑦密码为空,⑧手机号密码都不空。其中手机号密码全部空的情况前面四种情况都可以验证。
邮箱+密码,可以拓展的几个方面与上面相同。所以写成的手工测试用例如下图(图片中所有数据均为虚拟数据,仅供参考)

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

上面的自动化测试用例中有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与浏览器或者浏览器版本是否匹配
这一章,主要说了不需要验证码的自动化登录是如何执行的,下一章我们聊一下有验证码的情况应该如何做登录功能的自动化测试,下下一章我们再聊自动化测试框架。
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

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

相关文章:
自动化测试实例:Web登录功能性测试(无验证码)
🍅 点击文末小卡片 ,免费获取软件测试全套资料,资料在手,涨薪更快 一、什么是自动化测试 把人为驱动的测试行为转化为机器执行的一种过程称为自动化测试。(来自百度百科)本质上来说,自动化测试对比起手工测试除了需要…...
【算法篇】二叉树类(3)(笔记)
目录 一、Leetcode 题目 1. 二叉树的最近公共祖先 2. 二叉搜索树的最近公共祖先 (1)递归法 (2)迭代法 3. 二叉搜索树中的插入操作 (1)递归法 (2)迭代法 4. 删除二叉搜索树中…...
基于php的律所管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...
MySQL 之索引详解
想象一下,你正在图书馆寻找一本关于 MySQL 索引的书。图书馆里有成千上万本书,但没有目录。你只能一排一排、一本一本地找,直到找到你想要的书。这将会花费大量的时间!数据库索引就像图书馆的目录一样,可以帮助数据库系…...
C#测试调用FreeSpire.PDFViewer浏览PDF文件
Free Spire.PDFViewer是商业版Spire.PDFViewer的社区版本,支持以控件形式打开并查看PDf文件,但由于是免费版本,存在使用限制,打开的PDF文档只显示前10页内容。如果日常操作的pdf文件都不超过10页,可以考虑使用Free Spi…...
又一挣钱副业:AI生成影视解说,半个月涨粉变现3.5W+!
这两年大家都在感叹生活不易,然而我想说的是,机会还是有的,但问题不在于有没有,而在于你是否能够认准机会,然后抓住它。 接触过很多咨询项目的人,发现很多人依旧停留在传统思维中,认为副业就是…...
R语言 基础 笔记 3
起因, 目的: 思考一个问题: AI 这么强,AI 什么都知道,为什么还要学习这些基础的东西, 为什么还要写这些笔记? 我觉得,大体过一遍,还是有好处的。 有个大致印象,下次查的时候,也方便一些。 几个函数 cbind() 按照列,拼接数据, 会改变某些列的数据类型。data() 查看…...
【MySQL】常见的SQL优化方式(一)
目录 1、插入数据 (1)批量插入 (2)手动提交事务 (3)主键顺序插入 2、主键优化 (1)页分裂 (2)页合并 3、order by 优化 (1)排…...
【重点】使用axios.request.put上传文件,报错分析
使用axios的put方法上传文件时,如果遇到错误,可能的原因有以下几点: 跨域问题:如果请求的URL与当前页面的域名不同,可能会触发跨域问题。解决方法是在服务器端设置允许跨域请求,如设置CORS(跨域…...
最新最全的阿里大模型面试真题!看到就是赚到
前言 随着人工智能技术的飞速发展,计算机视觉(CV)、自然语言处理(NLP)、搜索、推荐、广告推送和风险控制等领域的岗位越来越受到追捧,掌握大型模型技术已成为这些岗位的必备技能。然而,目前公开…...
使用Docker快速本地部署RSSHub结合内网穿透访问RSS订阅源
文章目录 前言1. Docker 安装2. Docker 部署Rsshub3. 本地访问Rsshub4. Linux安装Cpolar5. 配置公网地址6. 远程访问Rsshub7. 固定Cpolar公网地址8. 固定地址访问 前言 今天和大家分享的是如何在本地快速简单部署Rsshub工具,并结合cpolar内网穿透工具使用公网地址远…...
win10系统K8S安装教程
准备工作 电脑硬件:支持虚拟化的CPU,内存最好在32G以上,16G也可以操作系统:window10 专业版 1 开启虚拟化 1.1 BIOS 由于主板和CPU的品牌不太一样,这里的操作仅供参考,以Intel的平台为例: …...
C#和Python共享内存技术
我这里做一个简单的示例 1.C#写入内存的方法,FileName是内存共享的名字 t是内存size public static void SaveGluePLYToMemory(string FileName, string msg){try{ long t 100;// SetMemorySize(msg);// 100;//# 创建内存块,test1,其他语言利用这个内存…...
Java每日面试题(JVM)(day15)
目录 Java对象内存布局markWord 数据结构JDK1.8 JVM 内存结构JDK1.8堆内存结构GC垃圾回收如何发现垃圾如何回收垃圾 JVM调优参数 Java对象内存布局 markWord 数据结构 JDK1.8 JVM 内存结构 程序计数器: 线程私有,记录代码执行的位置. Java虚拟机栈: 线程私有&#…...
在 CentOS 8 上安装和部署 OpenSearch 2.17 的实战指南20240924
在 CentOS 8 上安装和部署 OpenSearch 2.17 的实战指南 引言 随着数据的快速增长,企业对高效搜索和分析工具的需求也在不断增加。OpenSearch 是由社区主导的搜索和分析引擎,它为大规模数据索引、日志分析、全文检索等场景提供了强大的支持。在这篇博客…...
青动CRM-E售后V2.0.4
CRM售后管理系统,旨在助力企业销售售后全流程精细化、数字化管理,主要功能:客户、合同、工单、任务、报价、产品、库存、出纳、收费,适用于:服装鞋帽、化妆品、机械机电、家具装潢、建材行业、快销品、母婴用品、办公用…...
免杀对抗—C++混淆算法shellcode上线回调编译执行
前言 上次讲了python混淆免杀,今天讲一下C混淆免杀。其实都大差不差的,也都是通过各种算法对shellcod进行混淆免杀,只不过是语言从python换成c了而已。 实验环境 测试环境依旧是360、火绒、WD还有VT。 shellcode上线 下面是最基本几个sh…...
考研数据结构——C语言实现插入排序
插入排序是一种简单直观的比较排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place(原地排序)&#…...
苍穹外卖学习笔记(十三)
三. 导入商品浏览功能代码 由于user的Controller与admin的相同,记得修改RestController注释 1. 查询分类 CategoryController package com.sky.controller.user;import com.sky.entity.Category; import com.sky.result.Result; import com.sky.service.Categor…...
如果没有pos信息,只有一些近景的照片,可以用编辑重建大师进行建模吗?
可以。软件在新建工程时,提供有无人机和近景的选择,选择为近景即可。 重建大师,这是一款专为超大规模实景三维数据生产设计的集群并行处理软件,支持卫星影像、航空影像、倾斜影像和激光点云多源数据输入建模,可完成超…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Redis数据倾斜问题解决
Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中,部分节点存储的数据量或访问量远高于其他节点,导致这些节点负载过高,影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...
