python测试培训_python自动化测试学习-自动化测试模型

前言

自动化测试过程中,会通过模块的操作先后顺序进行代码编写,但对于整体性来说,需要先构建一个框架或者模型,便于后期对代码的维护,减少代码开发量以及维护成本。目前自动化模型有:线性测试、模块化、数据驱动等。

模型分类

1.线性测试

线性测试就是每一个脚本都能单独运行,不依赖其他脚本;比如:发一封邮件,需要先登录,之后填写邮件,最后发送邮件,退出。

我们可以通过实例来看一下,以dvwa的登录为例:

1598704063372259.jpg

test_loginWeb.py中的代码如下:

from selenium import webdriver

from time import sleep

import pytest

def test_CI():

driver=webdriver.Firefox()

#登录网址

driver.get("http://10.5.1.247/dvwa/login.php")

#输入用户名

driver.find_element_by_name("username").send_keys("admin")

#输入密码

driver.find_element_by_name("password").send_keys("password")

#点击登录

driver.find_element_by_name("Login").click()

sleep(1)

driver.find_element_by_link_text("Command Injection").click()

sleep(1)

driver.find_element_by_name("ip").send_keys("127.0.0.1")

sleep(1)

driver.find_element_by_name("Submit").click()

sleep(3)

driver.quit()

def test_FUP():

driver=webdriver.Firefox()

driver.get("http://10.5.1.247/dvwa/login.php")

driver.find_element_by_name("username").send_keys("admin")

driver.find_element_by_name("password").send_keys("password")

driver.find_element_by_name("Login").click()

sleep(1)

driver.find_element_by_link_text("File Upload").click()

sleep(3)

driver.quit()

if __name__ == '__main__':

pytest.main(["-sq","test_loginWeb.py"])

执行结果:

"E:\Program Files\myPytest\venv\Scripts\python.exe" "E:/Program Files/myPytest/test_case/test_loginWeb.py"

..

2 passed in 20.87s

Process finished with exit code 0

点击Command Injection,并输入ip地址:

1598703728195689.jpg

小结:

从上面的两个方法可以看出,我们在登陆时,需要重复两遍的登录操作,都是从输入网址开始,直到登录后,再进行其他操作。但如果需要修改登录账号、密码的话,就要改两个地方,造成了代码的重复编写和修改,如果涉及的脚本比较多,则需要对每个脚本的进行修改,维护成本较大。

2.模块化测试模型

我们会发现在线性测试模型中,有很多内容是重复的,于是我们可以考虑把重复的代码写成一个公共的模块,其他函数主要去调用即可,这样就可以减少代码的重复率。如果想要修改,只要修改一个公共模块,则相对比较容易。

conftest.py中的代码:

import pytest

import os

from selenium import webdriver

from time import sleep

@pytest.fixture

def login():

'''打开浏览器'''

global driver

driver = webdriver.Firefox()

driver.get("http://10.5.1.247/dvwa/login.php")

driver.find_element_by_name("username").send_keys("admin")

driver.find_element_by_name("password").send_keys("password")

driver.find_element_by_name("Login").click()

sleep(1)

print('\n打开浏览器!')

return driver

test_loginWeb.py中的代码:

from selenium import webdriver

from time import sleep

import pytest

def test_CI(login):

global driver

driver=login

driver.find_element_by_link_text("Command Injection").click()

sleep(1)

driver.find_element_by_name("ip").send_keys("127.0.0.1")

sleep(1)

driver.find_element_by_name("Submit").click()

sleep(3)

driver.quit()

sleep(2)

def test_FUP(login):

driver=login

driver.find_element_by_link_text("File Upload").click()

sleep(3)

driver.quit()

if __name__ == '__main__':

pytest.main(["-sq","test_loginWeb.py"])

执行结果:

"E:\Program Files\myPytest\venv\Scripts\python.exe" "E:/Program Files/myPytest/test_case/test_loginWeb.py"

打开浏览器!

.

打开浏览器!

.

2 passed in 25.88s

Process finished with exit code 0

点击Command Injection,并输入ip地址:

1598703816843101.jpg

点击File Upload:

1598703841112454.jpg

小结:

模块化测试模型,有两个优点:一个是可以提高开发效率,不用重复地编写相同的脚本,直接调用之前写好的模块脚本就可以了;另一个是可以方便对代码的维护,如果公共模块需要变化,我们只要改公共模块代码就可以,其他代码就不用修改。

3.数据驱动测试模型

数据驱动算是对模块化模型的一个补充,数据的更新驱动自动化的执行,从而引起测试结果的改变。数据驱动的含义其实就是参数化,通过数据和代码分离,不影响代码的执行,又能够通过输入数据的不同进而影响输出结果。

login.csv中的数据:

admin,admin

admin,password

admin,123

test_loginWeb.py中的代码:

from selenium import webdriver

from time import sleep

import pytest

import csv

def test_login():

global driver

driver = webdriver.Firefox()

#打开网址

driver.get("http://10.5.1.247/dvwa/login.php")

#读取文件中的数据

user=open('data\\data.csv','rt',encoding='utf-8')

datas=csv.reader(user)

#循环数据不同的用户和密码

for data in datas:

driver.find_element_by_name("username").send_keys(data[0])

sleep(1)

driver.find_element_by_name("password").send_keys(data[1])

sleep(1)

driver.find_element_by_name("Login").click()

sleep(2)

driver.quit()

if __name__ == '__main__':

pytest.main(["-sq","test_loginWeb.py"])

执行结果:

"E:\Program Files\myPytest\venv\Scripts\python.exe" "E:/Program Files/myPytest/test_case/test_loginWeb.py"

.

1 passed in 17.74s

Process finished with exit code 0

小结:

当我们在读取一组数据时,不管是json、csv、txt 等文件格式,只要从文件中读取数据,即实现了数据与脚本的分离,实现了参数化。如果数据需要变更,只需要更新文件中的数据即可,无需对脚本代码进行更改,保证了代码的稳定性,也提高了代码的维护成本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值