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

ops/2025/2/9 3:22:29/

一、自动化测试的准备

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.ppmy.cn/ops/156871.html

相关文章

Jenkins基础篇 - Jenkins介绍与安装示例

文章目录 1. Jenkins介绍2. Jenkins安装2.1 使用War文件安装2.1.1 硬件要求2.1.2 软件要求2.1.3 安装Java2.1.4 安装Jenkins 3 安装后设置向导3.1 解锁Jenkins3.2 自定义Jenkins插件3.3 创建第一个管理员用户3.4 实例配置3.5 Jenkins已就绪!!&#xff01…

VC播放mp3的方法

1、使用msi库 #include <mmsystem.h> #pragma comment(lib,"winmm.lib") .......//打开文件MCI_OPEN_PARMS mciOpen; mciOpen.lpstrDeviceType _T("mpegvideo"); mciOpen.lpstrElementName _T("c://1.mp3"); MCIERROR mciError mci…

【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目

解决idea至少创建jdk17项目 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗?解决 问题 idea现在只能创建最少jdk17&#xff0c;不能创建java8了吗 我本来以为是 IDEA 版本更新导致的 Bug&#xff0c;开始还没在意。 直到我今天自己初始化项目时才发现&am…

102,【2】buuctf web [第二章 web进阶]XSS闯关

进入靶场 点击看看 前情提要 如果只想得到flag时 不想做题时&#xff0c;把level由1不断往下修改就可通过一关又一关 最后在url处修改level为7即可得到flag 通过做题破解每一关的话&#xff0c;就如下 操作 第一关 修改url <script>alert(xss)</script> 第二…

《具身智能时代:机器人具身抓取技术的前沿探索与应用综述》

自2022年GPT等大模型的爆发以来&#xff0c;人工智能领域以语言模型为代表的预训练模型在多个领域掀起了创新浪潮。到了2024年&#xff0c;DeepSeek等新技术进一步加速了具身智能的发展&#xff0c;特别是在机器人领域&#xff0c;预训练模型的引入深刻改变了传统的感知、决策和…

一次报警了解:direct path read、enq: KO - fast object checkpoint

背景 今天突然接到订单超时报警&#xff0c;数据库的状态确实惊出一身冷汗&#xff0c;查看系统日志正常&#xff0c;数据库日志正常&#xff0c;load 1-3之间&#xff0c;Session 连接200左右&#xff0c;未发现有负载。于是生成一个ASH报告&#xff0c;感觉比平时要慢很多&am…

STM32 简介

STM32 简介 1. STM32性能2. STM32命名规则3. STM32分类4. 传统嵌入式方向 1. STM32性能 STM32 的优异性体现在如下几个方面&#xff1a; 超低的价格。8 位机的价格&#xff0c;32 位机的性能&#xff0c;是 STM32 最大的优势。超多的外设。STM32 拥有包括&#xff1a;FMC、TIME…

Vue3 ref属性

ref() 接受一个内部值&#xff0c;返回一个响应式的、可更改的 ref 对象&#xff0c;此对象只有一个指向其内部值的属性 .value。 function ref<T>(value: T): Ref<UnwrapRef<T>>interface Ref<T> {value: T } 详细信息 ref 对象是可更改的&#xff…