1.针对自动读取yml文件进行接口测试并产生报告发送文件。
1)read.me
# 依赖软件
基于python3的
pip install requests
pip install pyyaml
pip install ddt
pip install nnlog
pip install btbf #好看的报告模块
pip install yagmail
2)conf --》base.txt #此文件便于替换其中的类名和文件名
import unittest,requests
import ddt
from BeautifulReport import BeautifulReport as bf
from urllib import parse
from conf.setting import BASE_URL #导入配置文件并从中获取
@ddt.ddt
class %s(unittest.TestCase):
base_url = BASE_URL
@ddt.file_data(r'%s')#注意加r防止转义,ddt帮你读文件,获取文件内容,循环调用函数 #这里不用{file_name}是因为下面有几个{}会都认为是所需参数。
def test_request(self,**kwargs):
detail = kwargs.get('detail','没写用例描述')
self._testMethodDoc = detail #动态的用例描述
url = kwargs.get('url')#url
url = parse.urljoin(self.base_url,url)#拼接好url
method = kwargs.get('method','get')#请求方式
data = kwargs.get('data',{}) #请求参数
header = kwargs.get('header',{})#请求头
cookie = kwargs.get('cookie',{})#cookie
check = kwargs.get('check')
method = method.lower() #便于处理
try:
if method=='get':
res = requests.get(url,params=data,cookies=cookie,headers=header).text
#因为接口有异常的情况下, 可能返回的不是json串,会报错
else:
res = requests.post(url,data=data,cookies=cookie,headers=header).text
except Exception as e:
print('接口请求出错')
res = e
for c in check:
self.assertIn(c,res,msg='预计结果不符,预期结果:'+c + '实际结果:' +res) #不用%s是应为格式化时候会有多余%s值影响上面取值
3. cases-- 用来存放不同用例的yaml文件 比如login和reg
###login.yaml
-
url : /api/user/login
method : post
detail : 正常登录
data :
username : niuhanyang
passwd : aA123456
check :
- userId
- sign
-
url : /api/user/login
method : post
detail : 密码错误
data :
username : niuhanyang
passwd : aA12333
check :
- 密码错误
-
url : /api/user/login
method : post
detail : 不传密码
data :
username : niuhanyang
check :
- 必填参数未填
#####reg.yaml
-
url : /api/user/user_reg
method : post
detail : 用户名字已经被注册的
data :
username : niuhanyang
passwd : aA123456
cpasswd : aA123456
check :
- 用户已存在
4. lib-->tools.py
import datetime
import yagmail
from conf import setting
import os #
import unittest
from BeautifulReport import BeautifulReport as bf
def makeCase():
all_yaml = os.listdir(setting.YAML_PATH) #获取该路径所有文件
base_case_str = open(setting.CASE_TEMPLATE,encoding='utf-8').read()#读取到文件里的东西
for yaml in all_yaml:
if yaml.endswith('.yaml') or yaml.endswith('.yml'):#判断是否是yml文件
class_name = yaml.replace('.yml','').replace('.yaml','').capitalize()#获取类名,并首字母大写 类名一般首字母大写 不用字符分割防止a.b.c之类结构
file_name = os.path.join(setting.YAML_PATH,yaml)#拼接绝对路径
content = base_case_str %(class_name,file_name) #将参数写入已读取的base文件内容中 这里不用str.format是因为{}
py_file_name = os.path.join(setting.CASE_PATH,class_name)#拼好python文件的绝对路径,便于写
open('%s.py'%py_file_name,'w',encoding='utf-8').write(content)
def run_all_case(): #执行目录下py文件的所有用例
suite = unittest.TestSuite()
all_py = unittest.defaultTestLoader.discover(setting.CASE_PATH,'*.py') #寻找测试用例,可以规则如test_*.py
#找到所有的python文件
[ suite.addTests(py) for py in all_py] #每个py文件可能有多个类所以这里用addTests 一个可不加s
#列表生成式,添加文件里面的case到测试集合里面
run=bf(suite)
today = datetime.datetime.today().strftime('%Y%m%d%H%M%S') #导入模块可以ctrl加回车添加
title = '%s_接口测报告.html'%today
report_abs_path = os.path.join(setting.REPORT_PATH,title) #
run.report(title,filename=title,log_path=setting.REPORT_PATH)
return run.success_count,run.failure_count,report_abs_path #报告的绝对路径可用于发送邮件
def sendmail(title,content,attrs=None):
m = yagmail.SMTP(host=setting.MAIL_HOST,user=setting.MAIL_USER
,password=setting.MAIL_PASSWRD
)
m.send(to=setting.TO,subject=title,
contents=content,
attachments=attrs)
5.conf-->setting.py
import os
BASE_PATH = os.path.dirname(
os.path.dirname(os.path.abspath(__file__))
)
MAIL_HOST='smtp.163.com'
MAIL_USER='uitestp4p@163.com'
MAIL_PASSWRD = 'houyafan123'
TO = [
'511402865@qq.com',
]
LEVEL = 'debug' #日志级别
LOG_PATH = os.path.join(BASE_PATH,'logs') #存放日志的路径
CASE_PATH = os.path.join(BASE_PATH,'cases') #存放用例的路径
YAML_PATH = os.path.join(BASE_PATH,'case_data') #存放yaml文件的路径
CASE_TEMPLATE = os.path.join(BASE_PATH,'conf','base.txt') #用例模板的路径
REPORT_PATH = os.path.join(BASE_PATH,'report') #存放报告的目录
BASE_URL = 'http://118.24.3.40' #接口的地址
LOG_NAME='utp.log' #日志的文件名
6.report 存放报告