自动化软件测试的基本流程

一、自动化测试的准备

1.1  了解测试系统

        首先对于需要测试的系统我们需要按照软件需求说明书明确软件功能。这里以智慧养老系统作为案例进行测试,先让我们看看该系统的登录界面和用户管理界面。

登录界面:

登录成功默认界面:

用户管理界面:

1.2  绘制脑图

        使用脑图绘制出系统重每一个功能需要测试的流程和内容(绘制工具建议使用Xmid),这里没有写出完整系统的功能,只绘制了登录、注册用户以及用户管理界面的功能。

1.3  创建python项目

        利用 PyCharm 创建python项目,创建完毕后一定检查设置中解释器里是否有selenium和webdrivermanger 两个插件。我这肯定是有的,这两玩意装起来非常非常的费劲,要是不会安装的话可以私信给我。

 二、自动化测试代码编写

2.1 分组        

        明确了自己需要测试的几个功能,我们可以以他们为标题创建python文件,例如关于登录界面的测试就叫 Login.py ,关于注册的测试就叫 Register.py , 关于用户管理的测试叫UserMange.py,并且在每一个页面中编写相关的测试用例。

        但是每一个python文件都需要利用webDriverMange下载相关的浏览器驱动并且以特定的方式打开特定浏览器的特定页面。因此如果每一次都在文件中创建一次浏览器驱动对象是非常麻烦且浪费空间的,我们可以统一创建一个浏览器驱动对象,并且以单例模式的方式提供给整个项目中的所有测试文件使用。在这里我们创建Utils.py 文件用于存放所有文件需要使用到的工具,例如浏览器驱动对象、屏幕截图方法等等。

        并且在这里我们将 utils 文件放入common包中,将其他页面和功能的测试放入tests包中。为什么要将这些文件分别放到一个包呢,因为需要方别被别人导入和使用,文件夹是没有办法被其他文件导入和使用的(包中有__init__.py 文件 文件夹是没有的)

2.2 Utils.py 测试文件配制

        在Driver类中创建一个浏览器对象并且使用单例模式进行实例化,使得所有的文件只能使用OSDriver 这个对象实例化处的Driver类型的浏览器启动对象。

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager#创建浏览器驱动对象
class Driver:driver = ""def __init__(self):options = webdriver.ChromeOptions()self.driver = webdriver.Chrome(service=ChromeDriverManager().install(), options=options)
#此为单例模式的使用,使得其他文件只能使用这一个创建好的对象
OSDriver = Driver()

2.3 Login.py 登录页测试

        在这里我们根据脑图编写代码测试了选择正确的身份,正确输入用户名和密码以及选择错误的身份输入用户名密码的情况。代码如下所示。这些代码无非就是选中输入框进行自动输入以及点击等操作,并没有什么难度,唯一要注意的是,在一个函数内写完测试用例后,不要再函数里进行浏览器驱动对象的退出,这一步操作会导致其他的函数执行失败。

        在输入错误的测试用例中,这里添加了一个屏幕截图的操作,这一步操作可以将被截屏的照片存放在当天日期的文件夹中,并且文件名为调用截屏的函数名+日期时间。为了完成这一步操作我们首先需要在Utils文件中添加屏幕截图的函数getScreenShot。

# 此为创建屏幕截图的函数def getScreenShot(self):#文件名称为:../images/当天的日期/当天的日期以及时间.pngdirName = datetime.datetime.now().strftime("%Y-%m-%d")#判断当日存放的照片路径(dirName)是否存在,如果不存在则创建一个if not os.path.exists("../images/"+dirName):os.makedirs("../images/"+dirName)#创建错误照片的文件名(当天的日期以及时间.png)# sys._getframe().f_back.f_code.co_name 能够获取到调用该方法的方法名filename = sys._getframe().f_back.f_code.co_name + "-" +datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S") + ".png"self.driver.save_screenshot("../images/"+dirName+"/"+filename)

 添加完毕后可以在 Login.py 文件中直接使用屏幕截图函数。

import timefrom selenium.webdriver.common.by import Byfrom common.Utils import OSDriverclass Login:url= ""driver = ""def __init__(self):self.url = "http://localhost:8081/login"#将Utils中的浏览器驱动对象导入进来self.driver = OSDriver.driver#利用驱动对象将url指定的地址打开self.driver.get(self.url)#成功登陆的测试用例def LoginSuccess1(self):#输入正确的管理员账号密码self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("123")#选择管理员身份self.driver.find_element(By.CSS_SELECTOR,"body > div > form > div:nth-child(6) > div > div > input").send_keys("管理员")#提交登录请求self.driver.find_element(By.CSS_SELECTOR,"body > div > form > input[type=submit]:nth-child(8)").click()#检查是否登录成功self.driver.find_element(By.CSS_SELECTOR,"body > div.container > ul > li:nth-child(2) > a")self.driver.quit()def LoginSuccess2(self):# 输入正确的用户账号密码self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("hjy")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("123456")# 选择用户身份# time.sleep(2)self.driver.find_element(By.CSS_SELECTOR,"body > div > form > div:nth-child(6) > div > div > input").click()self.driver.find_element(By.CSS_SELECTOR,"body > div > form > div:nth-child(6) > div > dl > dd:nth-child(2)").click()# 提交登录请求self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input[type=submit]:nth-child(8)").click()# 检查是否登录成功self.driver.find_element(By.CSS_SELECTOR, "body > div.container > ul > li:nth-child(2) > a")self.driver.quit()#异常登录的测试用例def LoginFail1(self):#选择管理员账号,输入账号:admin 输入密码:1self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("1")self.driver.find_element(By.CSS_SELECTOR,"body > div > form > input[type=submit]:nth-child(8)").click()#检查是否有文本提示信息ErroTest = self.driver.find_element(By.CSS_SELECTOR,"body > div > form > span")assert ErroTest.text == "请确定账户信息是否正确!"self.driver.quit()def LoginFail2(self):self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("hjy")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("1")#选择用户身份self.driver.find_element(By.CSS_SELECTOR, "body > div > form > div:nth-child(6) > div > div > input").click()self.driver.find_element(By.CSS_SELECTOR,"body > div > form > div:nth-child(6) > div > dl > dd:nth-child(2)").click()#点击登录self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input[type=submit]:nth-child(8)").click()ErroTest = self.driver.find_element(By.CSS_SELECTOR, "body > div > form > span")#检查结果是否符合预期OSDriver.getScreenShot()assert ErroTest.text == "请确定账户信息是否正确!"self.driver.quit()Login().LoginFail2()

2.4 Register.py 注册页测试

        依然是根据脑图挑选了几个测试用例进行测试。

from selenium.webdriver.common.by import Byfrom common.Utils import OSDriverclass Register:url=""driver = ""def __init__(self):self.url = "http://localhost:8081/register"self.driver = OSDriver.driverself.driver.get(self.url)def RegisterSucess1(self):#输入正确的用户名  用户名:xuwei    密码:123456self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("xuwei")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(6)").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input[type=submit]:nth-child(8)")self.driver.back()def RegisterFail1(self):#输入正确的账号并且输入小于6位不为空格的密码  输入账号:test1  输入密码:11111self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("test1")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("11111")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(6)").send_keys("11111")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input[type=submit]:nth-child(8)").click()#检查提示文本是否出现ErrTest = self.driver.find_element(By.CSS_SELECTOR,"body > div > form > span")if not ErrTest.text == "密码必须大约6位!":OSDriver.getScreenShot()assert ErrTest.text == "密码必须大约6位!"self.driver.back()def RegisterFail2(self):#输入正确的账号并且输入的密码为6个空格  输入账号:test2 输入密码:******(*在此处代表空格)self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(2)").send_keys("admin")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(4)").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input:nth-child(6)").send_keys("123456")self.driver.find_element(By.CSS_SELECTOR, "body > div > form > input[type=submit]:nth-child(8)").click()#检查提示文本是否出现:用户名重复,请重新输入!ErrTest = self.driver.find_element(By.CSS_SELECTOR,"body > div > form > span")if not ErrTest.text == "用户名重复,请重新输入!":OSDriver.getScreenShot()assert ErrTest.text == "用户名重复,请重新输入!"self.driver.back()Register().RegisterSucess1()
Register().RegisterFail1()
Register().RegisterFail2()

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

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

相关文章

Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、常见问题解答六、使用Chatbox进行交互6.1 …

Android 深入探究 JSONObject 与 JSONArray:Android 中的数据解析与数组操作全解析

在现代软件开发中,数据的传输和存储形式多种多样,而 JSON(JavaScript Object Notation)以其简洁、易读、便于解析的特点,成为了最常用的数据格式之一。在 Android 开发中,JSONObject和JSONArray同样是处理 …

机器学习day5

自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测 代码 import tensorflow as tf import numpy as np# 1. 自定义数据集 data [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1…

计算机网络中常见高危端口有哪些?如何封禁高危端口?

保障网络安全,从封禁高危端口开始! 在计算机网络中,端口是设备与外界通信的“大门”,但某些端口因常被黑客利用而成为高危入口。封禁这些端口是防御网络攻击的关键一步。本文将详解 10个常见高危端口,并提供多平台封禁…

ZK-ALU-在有限域上实现左移

先看在实数域上实现左移, 再看在有限域上的实现 左移-整数 计算机中的左移计算&#xff08;<< 操作&#xff09;通常由处理器的硬件电路直接支持&#xff0c;因此效率非常高。在编程语言中&#xff0c;左移操作可以通过位移运算符&#xff08;例如 C/C 中的 <<&a…

CommonJS

CommonJS 是由 JavaScript 社区于 2oo9 年提出的包含模块、文件、IO、控制台在内的一系列标准。Node.js 的实现中采用了 CommonJS 标准的一部分&#xff0c;并在其基础上进行了一些调整。我们所说的 CommonJS 模块和 Node.js 中的实现并不完全一样&#xff0c;现在一般谈到 Com…

android java 用系统弹窗的方式实现模拟点击动画特效

接上一篇&#xff1a;android java系统弹窗的基础模板-CSDN博客 本篇记录的是系统弹窗的一个应用示例&#xff1a;实现点击动画效果 首先模拟点击的实现参考&#xff1a;android模拟点击_motionevent upevent motionevent.obtain(systemclo-CSDN博客 动画效果&#xff0c;是…

基于最近邻数据进行分类

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 完整代码&#xff1a; import torch import numpy as np from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score import matplotlib.pyplot as plt# 生成一个简单的数据…

[SAP ABAP] ABAP SQL跟踪工具

事务码ST05 操作步骤 步骤1&#xff1a;使用事务码ST05之前&#xff0c;将要检测的程序生成的页面先呈现出来&#xff0c;这里我们想看下面程序的取数操作&#xff0c;所以停留在选择界面 步骤2&#xff1a; 新建一个GUI窗口&#xff0c;输入事务码ST05&#xff0c;点击 Acti…

算法的时间复杂度

什么是时间复杂度&#xff1f; 算法的时间复杂度是算法的执行效率 算法的执行时间和算法输入值之间的关系&#xff0c;与函数中代码的执行次数有关。 常见的时间复杂度案例分析&#xff1a; O(1) 算法的执行时间和输入值无关 O(logn) 算法的执行时间和代码的执行次数呈log…

蓝桥杯备考:高精度算法之除法

我们除法的高精度其实也不完全是高精度&#xff0c;而是一个高精度作被除数除以一个低精度 模拟我们的小学除法 由于题目中我们的除数最大是1e9&#xff0c;当它真正是1e9的时候&#xff0c;t是有可能超过1e9的&#xff0c;所以要用long long

重新刷题求职2-DAY1

DAY1 1.704. 二分查找 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 最普通的二分查找&#xff0c;查用的习惯左闭右…

算法竞赛(Python)-堆栈

文章目录 一 基础知识二 题目有效的括号字符串解码 一 基础知识 堆栈&#xff08;Stack&#xff09;&#xff1a;简称为栈。一种线性表数据结构&#xff0c;是一种只允许在表的一端进行插入和删除操作的线性表。   我们把栈中允许插入和删除的一端称为 「栈顶&#xff08;top…

SpringBoot 中的测试jar包knife4j(实现效果非常简单)

1、效果图 非常快的可以看见你实现的接口 路径http://localhost:8080/doc.html#/home 端口必须是自己的 2、实现效果 2.1、导入jar包 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-openapi3-jakarta-spring-boot-star…

16.1.STM32F407ZGT6-CAN基础概念

参考&#xff1a; https://blog.csdn.net/sunlight_vip/article/details/128639144 前言&#xff1a; 学习总结CAN的知识点&#xff1a; 1.can是什么&#xff0c;历史由来和背景 2.can的物理层&#xff0c;链路层 3.初始化的流程和关键点 4.波特率怎么设置 5.can id怎么过滤 6…

Linux环境下的Java项目部署技巧:Nginx 详解

Nginx 的启动 Nginx 启动会生成 2 个进程&#xff1a;主进程与守护进程 主进程&#xff1a;常用于提供反向代理服务。特点&#xff1a;占内存大守护进程&#xff1a;防止主进程以外关闭。特点&#xff1a;占内存小 Nginx 启动需要占用 80 端口: 当 Ngnix 启动失败时&#xff0…

【Pytorch和Keras】使用transformer库进行图像分类

目录 一、环境准备二、基于Pytorch的预训练模型1、准备数据集2、加载预训练模型3、 使用pytorch进行模型构建 三、基于keras的预训练模型四、模型测试五、参考 现在大多数的模型都会上传到huggface平台进行统一的管理&#xff0c;transformer库能关联到huggface中对应的模型&am…

relational DB与NoSQL DB有什么区别?该如何选型?

Relational Database(关系型数据库,简称RDB)与NoSQL Database(非关系型数据库)是两类常见的数据库类型。它们在设计理念、数据存储方式、性能优化、扩展性等方面有许多差异。下面我们将会详细分析它们的区别,以及如何根据应用场景进行选型。 一、数据模型的区别 关系型…

Flutter常用Widget小部件

小部件Widget是一个类&#xff0c;按照继承方式&#xff0c;分为无状态的StatelessWidget和有状态的StatefulWidget。 这里先创建一个简单的无状态的Text小部件。 Text文本Widget 文件&#xff1a;lib/app/app.dart。 import package:flutter/material.dart;class App exte…

智能小区物业管理系统推动数字化转型与提升用户居住体验

内容概要 在当今快速发展的社会中&#xff0c;智能小区物业管理系统的出现正在改变传统的物业管理方式。这种系统不仅仅是一种工具&#xff0c;更是一种推动数字化转型的重要力量。它通过高效的技术手段&#xff0c;将物业管理与用户居住体验紧密结合&#xff0c;无疑为社区带…