UI自动化之数据驱动
1、数据驱动
1.1概述
数据驱动:在自动化测试中,把测试中使用到的数据分离出来,后续使用时再进行调用的思想叫做数据驱动。如果单纯的写在我们的测试模块里面,不是一个好的设计,如果数据需要修改是非常麻烦的,所以不管是什么类型的自动化测试,都是需要把数据分离出来的。当然分离到具体的文件里面,文件的形式其实有很多的,这里主要说明JSON的文件和YAML的文件在UI自动化测试中的应用。
1.2JSON文件数据格式
(1)导入json库;
(2)以k:value形式写入内容,写入的内容是以字典的形式写入;
(3)通过反序列化读取并返回文件内容。
如果在调试读取文件的过程中,出现下图所示错误:
那么我们可以通过卸载pytest库来解决这个问题:
1.2.1示例
以新浪邮箱登录输入框的文本提示信息为例来进行说明:
JSON文件中的内容:把两种情况下登录输入框的文本提示信息写道json文件中,以字典的形式。
{
"empty": "请输入邮箱名",
"formatError": "您输入的邮箱名格式不正确"
}
json文件的在测试类中的调用:
import json
import unittest
from selenium import webdriver
from 基础学习文件.unittest实战.init import Init #导入固件类
import time
#数据驱动,把消息提示的文本信息以json数据格式分离出去,我们调用json文件中的内容,也就是读取文件的过程,用到的是json库中的反序列化的方法,也就是load方法。
def readJson():
return json.load(open("sina.json",encoding="utf-8"))
print(readJson()) #输出的是一个字典的数据类型,获取数据也就是获取value的值。
#测试固件使用常规测试固件:
class SinaTest(Init): #把测试固件分离到固件类Init中,测试类继承固件类。
#测试步骤和断言
def test_sina_login_empty(self):
'''验证登录输入框为空的提示信息'''
self.driver.find_element_by_id("freename").send_keys("")
self.driver.find_element_by_id("freepassword").send_keys("")
self.driver.find_element_by_class_name("loginBtn").click()
time.sleep(3)
information=self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]")
'''assertEqual:比较两个对象是否相等,等同于字符串的比较”==“'''
self.assertEqual(information.text,readJson()["empty"]) #调用readJson()返回数据,由于是字典的数据类型,通过key值获取value。
def test_sina_login_formatError(self):
'''验证登录输入框格式不正确的提示信息'''
self.driver.find_element_by_id("freename").send_keys("asdwer")
self.driver.find_element_by_id("freepassword").send_keys("123456")
self.driver.find_element_by_class_name("loginBtn").click()
time.sleep(3)
information=self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]")
'''assertIn:比较一个对象是否包含另一个对象'''
self.assertIn(information.text,readJson()["formatError"]) #调用readJson()返回数据,由于是字典的数据类型,通过key值获取value。
1.3YAML文件数据格式
注意事项:
(1)操作yaml文件,需要安装一个第三方的库,安装的方式为:pip3 install pyyaml。
(2)以k:value的形式填写,冒号和value之间需要有一个空格。
(3)再yaml中写入的内容,是不需要加引号的。
(4)在js、java、go中返回的null、true、false,在python用的时候要修改为none、True、False。批量替换使用的是ctrl+
操作yaml文件的步骤:
(1)导入yaml的库;
(2)然后用witn上下文读取文件内容;
(3)最后通过yaml库中的safe.load()方法返回文件内容。
1.3.1示例
以新浪邮箱登录输入框的文本提示信息为例来进行说明:
YAML文件中的内容:把两种情况下登录输入框的文本提示信息写道yaml文件中:
login:
empty: 请输入邮箱名
formatError: 您输入的邮箱名格式不正确
yaml文件的在测试类中的调用:
import unittest
from selenium import webdriver
from 基础学习文件.unittest实战.init import Init #导入固件类
import time
import yaml
#数据驱动,把消息提示的文本信息以yaml数据格式分离出去,我们调用yaml文件中的内容,也就是读取文件的过程。
def readJson():
with(open("sina.yaml",encoding="utf-8")) as f:
return yaml.safe_load(f)
print(readJson()) #输出的是一个字典的数据类型,获取数据也就是获取value的值。
#测试固件使用常规测试固件:
class SinaTest(Init): #把测试固件分离到固件类Init中,测试类继承固件类。
#测试步骤和断言
def test_sina_login_empty(self):
'''验证登录输入框为空的提示信息'''
self.driver.find_element_by_id("freename").send_keys("")
self.driver.find_element_by_id("freepassword").send_keys("")
self.driver.find_element_by_class_name("loginBtn").click()
time.sleep(3)
information=self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]")
'''assertEqual:比较两个对象是否相等,等同于字符串的比较”==“'''
self.assertEqual(information.text,readJson()["login"]["empty"])
def test_sina_login_formatError(self):
'''验证登录输入框格式不正确的提示信息'''
self.driver.find_element_by_id("freename").send_keys("asdwer")
self.driver.find_element_by_id("freepassword").send_keys("123456")
self.driver.find_element_by_class_name("loginBtn").click()
time.sleep(3)
information=self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]")
'''assertIn:比较一个对象是否包含另一个对象'''
self.assertIn(information.text,readJson()["login"]["formatError"])
2、数据驱动和参数化的应用
以新浪邮箱登录输入框的文本提示信息为例来进行说明:
JSON文件中的内容:把两种情况下登录输入框的文本提示信息写道json文件中,以字典的形式。
{
"login":[
{"username":"","password":"","Assert":"请输入邮箱名"},
{"username":"asdwer","password":"123456","Assert":"您输入的邮箱名格式不正确"},
{"username":"asd123@sina.com","password":"123456","Assert":"登录名或密码错误"}
]
}
json文件的在测试类中的调用:
import unittest
from parameterized import parameterized,param
from selenium import webdriver
import time
import json
from 基础学习文件.unittest实战.init import Init
#单元测试框架之参数化
#数据驱动和参数化应用:
def readJsonLine():
list1=json.load(open("login_list.json",encoding="utf-8"))["login"]
return list1
class SinaTest(Init):
# #参数化需要借助外部的parameterized的库中的expand方法,param指向的是每次循环的测试数据。
# @parameterized.expand([param("","","请输入邮箱名"),param("asdwer","123456","您输入的邮箱名格式不正确"),param("asd123@sina.com","123456","登录名或密码错误")])
#参数化需要借助外部的parameterized的库中的expand方法,param指向的是每次循环的测试数据。
#借助数据驱动的思想,把数据分离出来,放在json文件中,然后读取文件内容,
@parameterized.expand([
param(readJsonLine()[0]["username"],readJsonLine()[0]["password"],readJsonLine()[0]["Assert"]),
param(readJsonLine()[1]["username"],readJsonLine()[1]["password"],readJsonLine()[1]["Assert"]),
param(readJsonLine()[2]["username"],readJsonLine()[2]["password"],readJsonLine()[2]["Assert"])
])
def test_sina_login(self,username,password,Assert):
'''验证登录输入框为空的提示信息'''
self.driver.find_element_by_id("freename").send_keys(username)
self.driver.find_element_by_id("freepassword").send_keys(password)
self.driver.find_element_by_class_name("loginBtn").click()
time.sleep(3)
information=self.driver.find_element_by_xpath("/html/body/div[3]/div/div[2]/div/div/div[4]/div[1]/div[1]/div[1]/span[1]")
'''assertEqual:比较两个对象是否相等,等同于字符串的比较”==“'''
self.assertEqual(information.text,Assert)