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

news/2025/2/4 10:56:04 标签: 自动化, 运维

一、自动化测试的准备

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/当天的日期/当天的日期以及时间.png
        dirName = 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 time

from selenium.webdriver.common.by import By

from common.Utils import OSDriver


class 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 输入密码:1
        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("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 By

from common.Utils import OSDriver


class Register:
    url=""
    driver = ""
    def __init__(self):
        self.url = "http://localhost:8081/register"
        self.driver = OSDriver.driver
        self.driver.get(self.url)

    def RegisterSucess1(self):
        #输入正确的用户名  用户名:xuwei    密码:123456
        self.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  输入密码:11111
        self.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.niftyadmin.cn/n/5841501.html

相关文章

记忆化搜索和动态规划 --最长回文子串为例

记忆化搜索 记忆化搜索是一种优化递归算法的方法,通过将已经计算过的子问题的结果存储起来(通常使用哈希表或数组),避免重复计算相同的子问题。 本质上是通过缓存中间结果来减少计算的重复性。 动态规划 动态规划是通过将问题分…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤: 第一步:发起请求到前端控制器(DispatcherServlet) 第二步:前端控制器请求HandlerMapping查找 Handler (可以根据xml配置、注解进行查找) 匹配条件包括…

Leetcode面试高频题分类刷题总结

https://zhuanlan.zhihu.com/p/349940945 以下8个门类是面试中最常考的算法与数据结构知识点。 排序类(Sort): 基础知识:快速排序(Quick Sort), 归并排序(Merge Sort)的…

ARM架构与编程(基于STM32F103)第四章 纯汇编点灯

这节相对比较简单,了解了汇编指令以后,我们需要进行一些实战训练,使用最基础的汇编指令把第一章寄存器点灯的程序用汇编来实现出来即可,只编写逻辑部分,目的是简化流程方便入门,不涉及到启动流程部分 接下来…

Axure PR 9 动效 设计交互

大家好,我是大明同学。 这期内容,我们来用Axure制作一组动效。 动效 创建动效元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.选中画布,将画布填充颜色设置为蓝色(#0052D9)。 3.在元件库中拖出一个圆形元件,选中矩形元件&…

04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))

目录 一、引言 二、算法原理 三、算法实现 四、知识小结 一、引言 决策树算法是一种常用的机器学习算法,可用于分类和回归问题。它基于特征之间的条件判断来构 建一棵树,树的每个节点代表一个特征,每个叶节点代表一个类别或回归值。决策…

猫眼大数据开发面试题及参考答案

Java 基本数据类型有哪些?包装类型又是什么? Java 的基本数据类型是 Java 语言中最基础的数据类型,它们用于存储简单的值。Java 的基本数据类型主要分为以下几类: 整型 byte:占 1 个字节,取值范围是 -128 到 127,通常用于节省内存的场景,比如处理文件或网络数据时,存…

Python-基于mediapipe,pyautogui,cv2和numpy的电脑手势截屏工具(进阶版)

前言:在我们的日常生活中,手机已经成为我们每天工作,学习,生活的一个不可或缺的部分。众所周知:为了我们的使用方便,手机里面的很多功能非常人性化,既便捷又高效,其中就有手机的截屏方式,它们花样繁多,如三指截屏,手势截屏等。那么怎么在电脑里面也实现这个功能呢?…