配置文件:以properties 、config、ini、log4j等结尾的都是配置文件,里面的参数改一下,项目就可以按照不同的方式执行出来; configparser 可以去读取配置信息,configparser里面的类模块ConfigParser;
配置文件编写分为三个区域: section:只能是中括号,中括号扩起来的叫做片段 ; option:键值对左侧的叫做option; value:键值对右侧的叫做value;
一、配置文件
创建一个配置文件:case.config
[MODE] mode=all [PYTHON11] num=89 name=生生 [LEMON] mun=33 age=18 boss=华华
读取配置文件的数据方法一:
import configparser
# 创建配置文件
cf = configparser.ConfigParser() # 创建实例
cf.read('case.config', encoding='utf-8')
# 读取配置文件的数据方法一
res_1 = cf.get('MODE', 'mode') # get 获取数据
print(res_1)
读取配置文件的数据方法二:
import configparser
# 创建配置文件
cf = configparser.ConfigParser() # 创建实例
cf.read('case.config', encoding='utf-8')
# 读取配置文件的数据方法二
# cf['MODE']——>返回配置文件对象,cf['MODE']['mode'] 取文件对象mode的值
res_2 = cf['MODE']['mode']
print(res_2)
获取所有片段section:
import configparser
# 创建配置文件
cf = configparser.ConfigParser() # 创建实例
cf.read('case.config', encoding='utf-8')
# 获取所有片段:
print(cf.sections())
根据指定的片区拿到所有的items(键值对):
import configparser
# 创建配置文件
cf = configparser.ConfigParser() # 创建实例
cf.read('case.config', encoding='utf-8')
# 根据指定的片区拿到所有的items
# 其中PYTHON11是一个片区section, items 是指键值对,每个键值对存在一个元组里面,然后嵌套一个列表里面
print(cf.items('PYTHON11'))
数据类型讨论的问题:获取到的数据都是字符串类型,可以使用eval()转换数据成原本的类型
import configparser
# 创建配置文件
cf = configparser.ConfigParser() # 创建实例
cf.read('case.config', encoding='utf-8')
# 打印出配置文件cf中获取片区PYTHON11中的num数据值
print(cf.get('PYTHON11', 'num'))
# 打印出配置文件cf中获取片区PYTHON11中的num数据值是字符串类型数据
print(type(cf.get('PYTHON11', 'num')))
# eval()转换配置文件中获取的片区中value的数据类型
print(type(eval(cf.get('PYTHON11', 'num'))))
2、配置文件与excel结合使用
1、创建一个hettp请求:
import requests
# 课堂派 登录、查询请求
class HttpRequest:
"""利用requests封装get请求和post请求"""
def http_request(self, deng_url, deng_data, method, cookie=None): # url、data、cookie 参数化
"""url:请求的地址 http://xxxx:port
param(参数):传递的参数,非必填参数,字典格式传递参数
method:请求方式,支持get以及post请求
cookie:请求的时候传递的cookie值"""
# 登录
if method.lower() == 'get':
deng_res = requests.get(deng_url, json=deng_data, cookies=cookie) # 响应结果的消息实体
else:
deng_res = requests.post(deng_url, json=deng_data, cookies=cookie) # 响应结果的消息实体
return deng_res # 返回一个消息实体
2、创建文件配置和配置文件类:
(1)创建一个配置文件:case.config
[MODE] mode=[1,3]
(2)创建一个配置文件类:
import configparser
# 创建文件配置类
class ReadConfig:
def read_config(self, file_name, section, option):
# 返回配置文件对象
cf = configparser.ConfigParser()
# 读取配置文件数据
cf.read(file_name, encoding='utf-8')
# 返回section、option
return cf.get(section, option)
3、创建一个excel数据文件:文件名‘nuannuan’,sheet名‘nuannuan_04’,列表标题如下:
4、创建一个反射类:
class GetData:
Cookie = None # 存储cookie,初始值None
5、创建一个从excel中获取测试数据的类:
from openpyxl import load_workbook
# 导入配置文件类
from class_015.config_excel.read_config import ReadConfig
class DoExcel:
def __init__(self, file_name, sheet_name):
self.file_name = file_name
self.sheet_name = sheet_name
def get_data(self):
"""用例的可配置:
button(button是参数名,标识符,不以数字开头,不使用关键字即可):
控制是否执行所有用例,默认值是all,为all则执行所有用例
如果不等于all的话,就进入分值判断
button的值只能输入all、列表 这两种类型的参数"""
# 从配置文件读取mode值
mode = ReadConfig().read_config('case.config', 'MODE', 'mode')
wb = load_workbook(self.file_name)
sheet = wb[self.sheet_name]
test_data = []
for i in range(2, sheet.max_row + 1):
sub_data = {}
sub_data['case_id'] = sheet.cell(i, 1).value
sub_data['module'] = sheet.cell(i, 2).value
sub_data['title'] = sheet.cell(i, 3).value
sub_data['method'] = sheet.cell(i, 4).value
sub_data['url'] = sheet.cell(i, 5).value
sub_data['data'] = sheet.cell(i, 6).value
sub_data['expected'] = sheet.cell(i, 7).value
test_data.append(sub_data) # 存储了所有数据
# 根据button值去进行判断
if mode == 'all':
final_data = test_data
else:
final_data = []
# 对test_data所有的数据进行遍历
for item in test_data:
if item['case_id'] in eval(mode):
final_data.append(item)
return final_data # 获取返回的数据
6、执行用例并获取测试报告:
import unittest
import HTMLTestRunnerNew
from class_015.config_excel.class_lei import TestKeTang
# 避坑——>使用ddt,使用loader加载用例
# 存储用例,加载数据
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestKeTang))
with open('test_kt_report.html', 'wb') as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(stream=file, verbosity=2, title='python“课堂派”单元测试报告',
description='报告描述:自动化课堂派测试报告', tester='暖暖')
runner.run(suite)