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

一、自动化测试的准备

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类型的浏览器启动对象。

python 复制代码
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。

python 复制代码
# 此为创建屏幕截图的函数
    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 文件中直接使用屏幕截图函数。

python 复制代码
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 注册页测试

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

python 复制代码
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()
相关推荐
JuiceFS1 分钟前
JuiceFS sync 原理解析与性能优化,企业级数据同步利器
运维·后端
fruge1 小时前
前端自动化脚本:用 Node.js 写批量处理工具(图片压缩、文件重命名)
前端·node.js·自动化
Logan Lie1 小时前
Web服务监听地址的取舍:0.0.0.0 vs 127.0.0.1
运维·后端
Y淑滢潇潇1 小时前
RHCE 防火墙实验
linux·运维·rhce
稻谷君W2 小时前
Ubuntu 远程访问 Win11 WSL2 并固定访问教程
linux·运维·ubuntu
泡沫·2 小时前
4.iSCSI 服务器
运维·服务器·数据库
悠悠121383 小时前
告别Zabbix?我用Netdata只花10分钟就搞定了50台服务器的秒级监控(保姆级实战)
运维·服务器·zabbix
天庭鸡腿哥3 小时前
大小只有4K的软件,可让系统瞬间丝滑!
运维·服务器·windows·microsoft·everything
虚伪的空想家3 小时前
华为昇腾Atlas 800 A2物理服务器开启VT-d模式
运维·服务器·ubuntu·kvm·vt-d·直通
学渣676563 小时前
服务器端口映射
运维·服务器