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)

 

posted @ 2022-04-12 18:58  柒の夜  阅读(387)  评论(0编辑  收藏  举报