Python自动化测试实战篇(4)selenium+unttest+ddt实现自动化用例测试,模拟用户登陆点击交互测试,Assert捕获断言多种断言

news2025/10/18 20:40:33

在这里插入图片描述
这些是之前的文章,里面有一些基础的知识点在前面由于前面已经有写过,所以这一篇就不再详细对之前的内容进行描述
Python自动化测试实战篇(1)读取xlsx中账户密码,unittest框架实现通过requests接口post登录网站请求,JSON判断登录是否成功

Python自动化测试实战篇(2)unittest实现批量接口测试,并用HTMLTestRunner输出测试报告

Python自动化测试实战篇(3)优化unittest批量自动化接口测试代码,ddt驱动+yaml实现用例调用,输出HTMLTestRunner测试报告

代码已上传有需求可以自行下载
Python自动化测试实战篇(4)代码

需求

我目前的需求就是针对这个登录接口进行模拟用户批量进行登录测试,登陆完后再点击登录查看登录之后服务器返回的结果,尝试用各种方式去登陆然后查看服务器是否能够返回我们期望的值和数据。
在这里插入图片描述

结果样例图

在这里插入图片描述

1.新建一个lojump.yaml文件存放登录用户名和密码的测试用例

- userAccount: 'admin'
  loginPwd: '123456'
- userAccount: 'admin'
  loginPwd: '123Aa'
- userAccount: 'admin1'
  loginPwd: ''
- userAccount: ''
  loginPwd: ''
- userAccount: ''
  loginPwd: '123456'

2.将必要的包导入

from selenium import webdriver
from selenium.webdriver.common.by import By
import os  # 导入路径拼接
import requests
import time
import unittest
import yaml  # 导入yaml模块获取yaml文件值
from ddt import ddt, data, unpack  # 导入数据驱动
from HTMLTestRunner3_New import HTMLTestRunner

3.模拟测试前配置一些相应环境

导入本地的lojump.yaml文件,要使用utf-8格式不然会出现乱码

f = open(os.path.join(‘D:\pythonpj\pytest\lojump.yaml’), ‘r’, encoding=‘utf-8’)

加载yaml文件这里一定要使用safe_load不然会报错

ts_et = yaml.safe_load(f)

设置一个url我这里使用的是cms环境你可以自行查找,这里我直接使用requests的Post方法来进行请求

url = ‘http://192.168.52.129:8080/cms/manage/loginJump.do’

设置一个url请求头

headers = {‘Content-Type’: ‘application/x-www-form-urlencoded’}

设置交互点击地址的url

drurl = ‘http://192.168.52.129:8080/cms/manage/login.do’

4.使用selenium模拟用户点击

这里需要了解的是,首先定位不能够错误,如果定位错误那么后续的结果就是找不到,我这边模拟键盘输入的内容就是直接从yaml里面获取的,yaml头命名一定要跟你在dict[‘’]中请求的名称一样不然的话也是无法输入成功

        option = webdriver.ChromeOptions()
        option.add_experimental_option("detach", True)
        driver = webdriver.Chrome(chrome_options=option)
        driver.get(drurl)
        time.sleep(2)
        driver.find_element(By.XPATH, '//*[@id="userAccount"]').send_keys(dict['userAccount'])
        driver.find_element(By.XPATH, '//*[@id="loginPwd"]').send_keys(dict['loginPwd'])
        driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()

5.用requsts中Post请求接口

reps = requests.post(url=url, headers=headers,
                             data={'userAccount': dict['userAccount'],
                                   'loginPwd': dict['loginPwd']})

6.设置断言

这个断言个规则根据服务器返回的值来进行捕获,有什么返回值就捕获什么返回值即可。

js = reps.json()
        if js['msg'] == '登录成功!':  # 设定断言
            assert js['msg'] == '登录成功!'  # 捕获断言
            print('恭喜你接口登录成功')
        elif js['msg'] == '登录密码不正确!':
            assert js['msg'] == '登录密码不正确!'
            print('密码不正确')
        elif js['msg'] == '登录密码不能为空!':
            assert js['msg'] == '登录密码不能为空!'
            print('密码不能为空')
        elif js['msg'] == '登录帐号不能为空!':
            assert js['msg'] == '登录帐号不能为空!'
            print('账户不能为空')
        else:
            print('接口登录不成功')

7.测试单元完整代码

@ddt
class lg(unittest.TestCase):#定义一个类继承单元
    @data(*ts_et)
    @unpack
    def test_logjump(self, **dict):  # 定义一个测试用例
        option = webdriver.ChromeOptions()
        option.add_experimental_option("detach", True)
        driver = webdriver.Chrome(chrome_options=option)
        driver.get(drurl)
        time.sleep(2)
        driver.find_element(By.XPATH, '//*[@id="userAccount"]').send_keys(dict['userAccount'])
        driver.find_element(By.XPATH, '//*[@id="loginPwd"]').send_keys(dict['loginPwd'])
        driver.find_element(By.XPATH, '//*[@id="loginBtn"]').click()
        reps = requests.post(url=url, headers=headers,
                             data={'userAccount': dict['userAccount'],
                                   'loginPwd': dict['loginPwd']})
        time.sleep(2)
        js = reps.json()
        if js['msg'] == '登录成功!':  # 设定断言
            assert js['msg'] == '登录成功!'  # 捕获断言
            print('恭喜你接口登录成功')
        elif js['msg'] == '登录密码不正确!':
            assert js['msg'] == '登录密码不正确!'
            print('密码不正确')
        elif js['msg'] == '登录密码不能为空!':
            assert js['msg'] == '登录密码不能为空!'
            print('密码不能为空')
        elif js['msg'] == '登录帐号不能为空!':
            assert js['msg'] == '登录帐号不能为空!'
            print('账户不能为空')
        else:
            print('接口登录不成功')
        driver.quit()

8.输出HTMLTestRunner测试报告

def logjum():
    a1_path = os.path.abspath(os.path.dirname(__file__))
    report_path = os.path.join(a1_path, '用例测试报告.html')
    discre = unittest.defaultTestLoader.discover(start_dir=a1_path, pattern='g2.py')
    p = open(report_path, 'wb')
    run = HTMLTestRunner(stream=p, title='登录接口用例测试报告', description='执行情况', tester='you')
    run.run(discre)

9.执行

这里需要注意的是unittest.main()中一定要加入for循环1次,不然执行完操作之后就会出现无限循环下去的可能性,之前接口测试的时候没有出现这个bug,但是在selenium加进去后就出现了这个bug也不知道是什么问题引发。

if __name__ == '__main__':
    logjum()
    for i in range(0):
        unittest.main()

10.结果

可以看到执行完成,时间是58秒
在这里插入图片描述
登录接口也显示了执行了多条断言成功,并成功显示我们捕获的内容,当然我这里只是根据我的一些用例进行测试,你也可以自己多写几千条进行也没问题。
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详讲常见的字符函数

👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&a…

最近大火的chatGPT是什么?它是怎样聊天的?

ChatGPT是一款革命性的聊天机器人软件, ChatGPT( ChatGPT AI,聊天机器人欢迎您!)的核心功能是自动回复,可以根据客户的输入自动生成回复,从而提高客户服务的效率。还可以根据客户的输入自动生成…

四种幂等性解决方案

什么是幂等性? 幂等是一个数学与计算机学概念,在数学中某一元运算为幂等时,其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中,一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等…

C++学习记录——유 类和对象(3)

文章目录1、赋值运算符重载1、运算符重载1、理解2、运算符重载实例2、赋值运算符重载2、日期类的实现1、加减函数1、加函数2、减函数2、前/后置--重载3.两个日期相减其他1、流插入2、流提取日期类的整体实现代码: https://gitee.com/kongqizyd/start-some-c-codes-for-learning…

WebDAV之葫芦儿·派盘+KMPlayer

KMPlayer 支持WebDAV方式连接葫芦儿派盘。 KMPlayer几乎可以播放您系统上所有的影音文件,支持几乎全部音视频格式。通过其强大的插件功能,可以支持层出不穷的新格式。软件还具有齐全的操控功能,支持捕获音频、捕获AVI、捕获画面、外挂字幕、自定义编辑设置,是视频爱好者的不…

吞噬互联网:边缘计算和新商业网络的兴起

五年前,Gartner博客的一篇文章写道:“边缘将吞噬云。”表达的大概意思是,当大家都在特别关注云端时,Gartner看到了另一个方向——边缘,更能满足大家对低延迟和近乎实时处理的需求。如果快进五年,到2028 年&…

【Spark分布式内存计算框架——Spark Core】4. RDD函数(下) 重分区函数、聚合函数

重分区函数 如何对RDD中分区数目进行调整(增加分区或减少分区),在RDD函数中主要有如下三个函数。 1)、增加分区函数 函数名称:repartition,此函数使用的谨慎,会产生Shuffle。 2)、…

回归预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机多输入单输出

回归预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机多输入单输出 目录回归预测 | MATLAB实现PSO-LSSVM粒子群算法优化最小二乘支持向量机多输入单输出预测效果基本介绍模型描述程序设计参考资料预测效果 基本介绍 MATLAB实现PSO_LSSVM粒子群算法优化最小二乘支持…

车道线检测-LaneATT 论文学习笔记

论文:《Keep your Eyes on the Lane: Real-time Attention-guided Lane Detection》 地址:https://arxiv.org/abs/2010.12035v2 代码:https://github.com/lucastabelini/LaneATT 整体结构 车道线的表示方式 Lane{(xi,yi)}i0Npts−1,yii⋅Hima…

【23种设计模式】结构型模式详细介绍

前言 本文为 【23种设计模式】结构型模式 相关内容介绍,下边将对适配器模式,桥接模式,组合模式,装饰模式,外观模式,亨元模式,代理模式,具体包括它们的特点与实现等进行详尽介绍~ &a…

mysql物理innobackupex备份脚本和自动备份脚本

目录 备份命令 恢复命令 自动备份脚本 innobackupex是一款MySQL备份工具,备份速度快(通过直接copy物理文件),而且支持压缩、流式传输、加密等功能 新安装的数据库自带innobackupex,如果找不到命令,需安装percona-xtrabackup-2…

python数据结构:数组、链表、栈、队列、树

目录1.数组1.1 数组的数据结构1.1.1 数组的定义1.1.2 随机访问和连续内存1.1.3 静态内存和动态内存1.1.4 物理大小和逻辑大小1.2 数组的操作1.2.1 增加数组大小1.2.2 减小数组大小1.2.3 插入一项1.2.4 删除一项1.2.5 复杂度权衡1.3 二维数组2.链表2.1 链表分类2.2 链表特点2.3 …

OKCC呼叫中心使用中常见问题及处理方法

经常有客户咨询在使用OKCC呼叫中心系统时遇到的一些常见但不复杂的问题,下面整理了一些问题和处理方法给伙伴们参考:一、外呼任务为何启动后会自动暂停?1.检查该账户余额是否充足;2.外呼任务班组中是否有空闲坐席;3.分…

终于找到blender渲染总是崩溃的原因了

如果您开始渲染,Blender 会崩溃,并在渲染过程中自动关闭,可能是由于这两个主要原因之一。Blender 用完了可用内存显卡有问题在本文中,我们将了解如何处理 Blender 在渲染时崩溃的情况。Blender内存不足如果我们从 RAM 问题开始。要…

卸载Node.js

0 写在前面 无论您是因为什么原因要卸载Node.js都必须要卸载干净。 请阅读: 1 卸载步骤 1.1通过控制面板卸载node.js winR—>control.exe—>卸载程序—>卸载Node.js 等待—>卸载成功 1.2 删除安装时的nodejs文件夹 通过记忆或者Everthing搜索找…

《MySQL学习》 事务隔离 与 MVCC

《MySQL学习》 事务隔离 一.事务的概念 事务保证一组数据要么全部成功要么全部失败,MySQL的事务基于引擎(如InnoDB)实现。 二.事务的隔离性与隔离级别 MySQL的标准隔离级别: 读未提交 : 一个事务还没提交时&#…

网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面

Hqst盈盛电子导读:网络变压器与不同芯片之间的匹配原则及POE通讯产品需要注意哪些方面网络变压器与不同芯片之间的匹配原则:一,电流型PHY芯片一般要配的网络变压器:1、变压器PHY侧3线共模电感 (更适合POE产品&#xff…

Nginx_3

Rewrite功能配置 Rewrite是Nginx服务器提供的一个重要基本功能,是Web服务器产品中几乎必备的功能。主要的作用是用来实现URL的重写。www.jd.com 注意:Nginx服务器的Rewrite功能的实现依赖于PCRE的支持,因此在编译安装Nginx服务器之前,需要安…

Thinkphp大型进销存ERP源码/ 进销存APP源码/小程序ERP系统/含VUE源码支持二次开发

框架:ThinkPHP5.0.24 uniapp 包含:服务端php全套开源源码,uniapp前端全套开源源码(可发布H5/android/iod/微信小程序/抖音小程序/支付宝/百度小程序) 注:这个是全开源,随便你怎么开,怎么来&a…

DHCP基础

DHCP基础产生背景传统手工配置的缺陷DHCP基本概念及优点DHCP工作原理DHCP租期更新DHCP相关配置命令解析产生背景 因为现在上网的人已经变得非常多了,上网又需要分配IP地址,那么如何进行IP地址的分配?如果是手动分配IP地址,在人数…