自我框架utp

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='[email protected]'
MAIL_PASSWRD = 'houyafan123'
TO = [
'[email protected]',
]
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 存放报告

猜你喜欢

转载自www.cnblogs.com/cslw5566/p/9142678.html
utp