自动化测试之数据驱动

数据驱动的思想:
在自动化测试过程中,把测试过程中使用到的数据单独的分离到文件中,这样统一来管理具体的测试数据。文件的形式其实有很多的,这里主要说明下json yaml csv excel mysql 文件在UI自动化测试中的应用。

下面主要是针对UI自动化测试的数据进行分离,原始代码为:

from selenium import webdriver
import unittest
import time as t
class BaiduTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=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]')
        self.assertEqual(divText.text,'请输入邮箱名')

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys('qwert')
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=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]')
        self.assertEqual(divText.text,'您输入的邮箱名格式不正确')

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户不匹配'''
        self.driver.find_element_by_id('freename').send_keys('asdf@sina.com')
        self.driver.find_element_by_id('freepassword').send_keys('asdfg')
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,'登录名或密码错误')

if __name__ == '__main__':
    unittest.main()

 

 
一、json文件
 
1、首先我们在当前工程下创建一个data文件夹,我们测试过程要用到的测试数据的文件都要放在这个文件夹下
2、然后我们在data这个文件夹下添加一个为sina.json的json文件
 
3、然后我们在这个json文件里写入测试数据,以key:value的形式 加双引号 写在大括号里
   我们以sina登录模块测试为例:
{
  "loginNull": {"username": "","password": "","result": "请输入邮箱名"},
  "emailFormat": {"username": "sadert","password": "asrtr","result": "您输入的邮箱名格式不正确"},
  "loginError": {"username": "sdrtdt@sina.com","password": "aserty","result": "登录名或密码错误"}
}
 
4、在当前工程下创建一个包utils,包内创建一个名为operatioJson的python文件

 

 

     文件里面写入读取json文件的函数 
import json
import os

def base_dir():
    return os.path.dirname(os.path.dirname(__file__)) 

def readJson():
#load()对文件进行反序列化,本质上是读取文件里面的内容
return json.load(open(os.path.join(base_dir(),'data','sina.json')))

5.完善后的测试脚本为:

from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationJson import readJson #调用readJson函数

class sinaTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_id('freename').send_keys(readJson()['loginNull']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readJson()['loginNull']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=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]')
        self.assertEqual(divText.text,readJson()['loginNull']['result'])

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys(readJson()['emailFormat']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readJson()['emailFormat']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        divText=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]')
        self.assertEqual(divText.text,readJson()['emailFormat']['result'])

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户密码不匹配'''
        self.driver.find_element_by_id('freename').send_keys(readJson()['loginError']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readJson()['loginError']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readJson()['loginError']['result'])

if __name__ == '__main__':
    unittest.main()

 

二、yaml文件

 

安装操作yaml文件的库:pip3 install pyyaml

 

1.https://ruanyifeng.com/blog/2016/07/yaml.html

2.yaml基本语言规则

大小写敏感
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

3.下面我们演示把测试数据存储到YAML文件里面,分离出来的文件内容为:

loginNull:
  username: ""
  password: ""
  result: "请输入邮箱名"

emailFormat:
  username: "asdfgh"
  password: "asdfg"
  result: "您输入的邮箱名格式不正确"

loginError:
  username: "asdfg@sina.com"
  password: "asdfgqawsd"
  result: "登录名或密码错误"

4.在包内写入读取yaml文件的函数

import yaml
import os

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))

def readYaml():
    with open(os.path.join(base_dir(),'data','sina.yaml'),encoding='utf-8') as f:
        return yaml.safe_load(f)  #读取yaml文件以字典的数据类型

5.完善后的测试脚本为:

from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationYaml import readYaml #调用我们写好的读取yaml文件的函数

class sinaTest(unittest.TestCase):
    def setUp(self) -> None:
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None:
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_id('freename').send_keys(readYaml()['loginNull']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readYaml()['loginNull']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readYaml()['loginNull']['result'])

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys(readYaml()['emailFormat']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readYaml()['emailFormat']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readYaml()['emailFormat']['result'])

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户密码不匹配'''
        self.driver.find_element_by_id('freename').send_keys(readYaml()['loginError']['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readYaml()['loginError']['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readYaml()['loginError']['result'])

if __name__ == '__main__':
    unittest.main()

 

三、csv文件(表格另存为时,将文件类型保存为CSV)

 

    在Python中读取csv⽂件⾥⾯的使⽤直接使⽤标准库csv就可以的,在csv的库⾥⾯,读取⽂件的⽅式主要分为两种的⽅式,字典或者是列表的⽅式来读取数据。

 1.以字典的方式来读取

   (1)将csv的文件放到data的文件夹下

   (2)在untils的包下创建一个文件,文件内写入以字典的方式读取文件的函数

import csv
import os

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))

def readCsvDict():
    '''以字典的形式读取数据'''
    lists=[]
    with open(os.path.join(base_dir(),'data','sina.csv'),encoding='utf-8-sig')as f:
        reader=csv.DictReader(f)
        for item in reader:
            lists.append(dict(item))
        return lists

   (3)完善后的测试脚本为:

from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationCsv import readCsvDict

class sinaTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_id('freename').send_keys(readCsvDict()[0]['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[0]['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readCsvDict()[0]['result'])

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys(readCsvDict()[1]['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[1]['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=self.driver.find_element_by_xpath('/html/body/div[3]/div/div[2]/sdiv/div/div[4]/div[1]/div[1]/div[1]/span[1]')
        self.assertEqual(divText.text,readCsvDict()[1]['result'])

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户密码不匹配'''
        self.driver.find_element_by_id('freename').send_keys(readCsvDict()[2]['username'])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvDict()[2]['password'])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readCsvDict()[2]['result'])

if __name__ == '__main__':
    unittest.main()

 

  2.以列表的方式来读取

     (1)在untils的包下创建一个文件,文件内写入以列表的方式读取文件的函数

import csv
import os

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))

def readCsvlist():
    '''列表的形式读取数据'''
    lists=[]
    with open(os.path.join(base_dir(),'data','sina.csv'),encoding='utf-8-sig')as f:
        reader=csv.reader(f)
        #忽略第一行的内容
        next(reader)
        for item in reader:
            lists.append(item)
        return lists

   (2)完善后的测试脚本如下:

from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationCsv import readCsvlist

class sinaTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_id('freename').send_keys(readCsvlist()[0][0])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[0][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readCsvlist()[0][2])

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys(readCsvlist()[1][0])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[1][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readCsvlist()[1][2])

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户密码不匹配'''
        self.driver.find_element_by_id('freename').send_keys(readCsvlist()[2][0])
        self.driver.find_element_by_id('freepassword').send_keys(readCsvlist()[2][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readCsvlist()[2][2])

if __name__ == '__main__':
    unittest.main()

 

 

四、excel文件  

   安装操作excel文件的库:pip3 install xlrd

 

 1、将写有测试数据的excel 文件放进data文件夹里

 2.在utils的包内创建一个python文件,写入读取Excel文件的函数:

import os
import xlrd

def base_dir():
    return os.path.dirname(os.path.dirname(__file__))

def readExcel():
    lists=[]
    sheet=xlrd.open_workbook(os.path.join(base_dir(),'data','sina.xls'))
    book=sheet.sheet_by_index(0) #excel文件中的第一个表 索引为0
    for item in range(1,book.nrows): #从第一行开始读取它的所有行
        lists.append(book.row_values(item)) #读取行内的所有值 将这些值添加到列表里
    return lists

 

3.完善后的测试脚本如下:

from selenium import webdriver
import unittest
import time as t
from 单元测试框架.utils.operationExcel import readExcel

class sinaTest(unittest.TestCase):
    def setUp(self) -> None: #前提
        self.driver=webdriver.Chrome()
        self.driver.get('https://mail.sina.com.cn/')
        self.driver.maximize_window()
        self.driver.implicitly_wait(30)

    def tearDown(self) -> None: #清理
        self.driver.quit()

    def test_sina_null(self):
        '''sina邮箱验证:登录账户为空'''
        self.driver.find_element_by_id('freename').send_keys(readExcel()[0][0])
        self.driver.find_element_by_id('freepassword').send_keys(readExcel()[0][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readExcel()[0][2])

    def test_sina_email_format(self):
        '''sina邮箱验证:登录邮箱格式不正确'''
        self.driver.find_element_by_id('freename').send_keys(readExcel()[1][0])
        self.driver.find_element_by_id('freepassword').send_keys(readExcel()[1][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readExcel()[1][2])

    def test_sina_username_error(self):
        '''sina邮箱验证:登录账户密码不匹配'''
        self.driver.find_element_by_id('freename').send_keys(readExcel()[2][0])
        self.driver.find_element_by_id('freepassword').send_keys(readExcel()[2][1])
        self.driver.find_element_by_class_name('loginBtn').click()
        t.sleep(3)
        divText=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]')
        self.assertEqual(divText.text,readExcel()[2][2])

if __name__ == '__main__':
    unittest.main()

 

 

posted @ 2021-12-08 19:41  Cyyy-  阅读(349)  评论(0)    收藏  举报