前言
自动化测试过程中,会通过模块的操作先后顺序进行代码编写,但对于整体性来说,需要先构建一个框架或者模型,便于后期对代码的维护,减少代码开发量以及维护成本。目前自动化模型有:线性测试、模块化、数据驱动等。
模型分类
1.线性测试
线性测试就是每一个脚本都能单独运行,不依赖其他脚本;比如:发一封邮件,需要先登录,之后填写邮件,最后发送邮件,退出。
我们可以通过实例来看一下,以dvwa的登录为例:
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地址:
小结:
从上面的两个方法可以看出,我们在登陆时,需要重复两遍的登录操作,都是从输入网址开始,直到登录后,再进行其他操作。但如果需要修改登录账号、密码的话,就要改两个地方,造成了代码的重复编写和修改,如果涉及的脚本比较多,则需要对每个脚本的进行修改,维护成本较大。
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地址:
点击File Upload:
小结:
模块化测试模型,有两个优点:一个是可以提高开发效率,不用重复地编写相同的脚本,直接调用之前写好的模块脚本就可以了;另一个是可以方便对代码的维护,如果公共模块需要变化,我们只要改公共模块代码就可以,其他代码就不用修改。
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 等文件格式,只要从文件中读取数据,即实现了数据与脚本的分离,实现了参数化。如果数据需要变更,只需要更新文件中的数据即可,无需对脚本代码进行更改,保证了代码的稳定性,也提高了代码的维护成本。