根据yaml文件自动生成python文件
utp框架:
bin目录:存放执行文件(run.py)
cases目录:存放生成的用例的python文件(该目录下的文件为根据data目录下的测试用例生成的python文件:logoin.py、query.py、reg.py)
conf目录:存放配置文件(case_template(需回顾查看该文件的文件类型)、setting.py)
data目录:存放yaml格式的用例文件(login.yaml、query.yaml、reg.yaml)
lib目录:存放使用到的工具等python文件(tools.py)
logs目录:存放生成的日志文件
report目录:存放生成的测试报告(该目录下为运行程序后产生的测试报告,文件格式为html格式)
readme.txt文件:填写该框架的使用注意点或使用方式
login.yaml内容如下:
- url : http://ip/api/user/login method : post detail : 登录接口 data : username : niuhany passwd : aA1234 check : - sign - userId - url : http://ip/api/user/all_stu method : get check : - sdfsdfs headers : Referer : http://api.nnzhp.cn/ detail : 获取所有学生信息接口
case_template内容如下:
import unittest import ddt import requests @ddt.ddt class %s(unittest.TestCase): @ddt.file_data(r'%s') def test_interface(self,**test_data): #代表就是每一个用例数据的那个字典。 url = test_data.get('url') #url method = test_data.get('method').upper() #method detail = test_data.get('detail','没写用例描述')#用例描述 self._testMethodDoc = detail #这个变量就是指定用例描述的 data = test_data.get('data',{}) #请求数据 headers = test_data.get('headers',{}) #请求头 cookies = test_data.get('cookies',{}) #cookie is_json = test_data.get('is_json',0)#标识入参是否为json check = test_data.get('check') #断言 if method=='POST': if is_json: res = requests.post(url, json=data, cookies=cookies, headers=headers).text else: res = requests.post(url,data=data,cookies=cookies,headers=headers).text elif method=='GET': res = requests.get(url,params=data,cookies=cookies,headers=headers).text for c in check: self.assertIn(c,res,'预期结果:'+c+'实际结果:'+res)
setting.py如下:
os.path.abspath():取得当前目录
os.path.dirname():取得当前目录的上一级目录
os.path.join():目录拼接
import os BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #这个程序主目录 DATA_PATH = os.path.join(BASE_PATH,'data') #存放yaml文件的路径 CASE_PATH = os.path.join(BASE_PATH,'cases') #测试用例的目录 LOG_PATH = os.path.join(BASE_PATH,'logs') #日志的路径 REPORT_PATH = os.path.join(BASE_PATH,'report') #日志的路径 CASE_TEMPLATE = os.path.join(BASE_PATH,'conf','case_template') #用例模板的路径
tools.py如下:
[test_suite.addTests(case) for case in all_py]:(需要了解该行代码的含义)
unittest.TestSuite():用例集合
import os import glob from conf import setting import unittest import BeautifulReport as br import time def create_py(): with open(setting.CASE_TEMPLATE,encoding='utf-8') as fr: # 读取CASE_TEMPLATE文件 src_content = fr.read() all_file = glob.glob(setting.DATA_PATH + os.sep+ '*.yaml') for file in all_file: class_name = os.path.split(file)[-1].replace('.yaml','').capitalize()# 获取用例名称,并将名称的首字母大写(login、query、reg) py_content = src_content % (class_name,file) # case_template中两个s%的取值 py_path = os.path.join(setting.CASE_PATH,class_name.lower()+'.py') # cases目录下创建python文件 open(py_path,'w',encoding='utf-8').write(py_content) #向cases目录下的python文件中写入内容 def run_all_case(): test_suite = unittest.TestSuite() all_py = unittest.defaultTestLoader.discover(setting.CASE_PATH,'*.py') [test_suite.addTests(case) for case in all_py] report = br.BeautifulReport(test_suite) title = '%s_测试报告'%time.strftime('%Y%m%d%H%M%S') report.report(title,title,setting.REPORT_PATH)# title为测试报告的名称 return report.filename,report.success_count,report.failure_count
run.py如下:
from lib import tools def main(): tools.create_py() #生成python文件 file_name,success_count,fail_count = tools.run_all_case() #运行所有的用例 print(file_name,success_count,fail_count) main()