前面写过的框架,只能说是个基本框架,不能满足项目需求,接下来通过项目实战,来完善项目框架。
一.以一个简单注册接口为例,接口文档如下:
二.在开始前需要根据接口文档编写测试用例,这里推荐用excel来管理测试数据,简单的写了几条如下:(手机号先写成固定的手机号,后面在做优化)
三.前面搭建基础框架的时候简单介绍过,这里就不一一详细介绍了。
四.先来看注册的用例代码,在写之前先理一下大概流程:
1.数据在excel,所以需要导入excel方法来读取数据
2.读取测试数据后,需要导入ddt做数据驱动
3.然后发起http请求,需要导入封装好的request方法,根据实际结果与预期结果做对比
4.代码执行完成需要记录日志,需要导入日志方法
5.log的信息放在了yaml文件中,需要导入读取yaml文件的方法
6.生成日志,读取数据等需要用到路径,需要导入路径文件
前面已经封装好的方法就不一一贴出来了,request方法前面没写,如下:
import requests
def visit(url,method='get',params=None,data=None,json=None,**kwargs):
res=requests.request(method,url,params=params,data=data,json=json,**kwargs)
try:
return res.json()
except Exception as e:
print("格式错误{}".format(e))
配置文件信息如下:
有思路了就直接上代码:
import unittest
import ddt
import json
import os
from common import handler_request#导入封装好的requests类
from common import handler_excel#导入excel方法
from common import logger_handler#导入日志方法
from common import path_config#导入所有文件的路径
from common import read_yaml#导入读取yaml文件的方法
case_path=os.path.join(path_config.DATA_PATH,'case.xlsx')#用例数据的路径
excel=handler_excel.ExcelMothed(case_path)#初始化
register_cases=excel.get_case('register')#获取注册的case
log_info=read_yaml.read_yaml(os.path.join(path_config.CONFIG_PATH,'config.yml'))['log']#获得yaml中的log信息
logger=logger_handler.get_logger('register',logger_level=log_info['logger_level'],stream_level=log_info['stream_level'],handler_level=log_info['file_level'])
@ddt.ddt
class TestRegister(unittest.TestCase):
@ddt.data(*register_cases)
def testregister(self,case):
res=handler_request.visit(case['url'],case['method'],json=json.loads(case['data']),headers=json.loads(case['headers']))#请求接口
try:
self.assertTrue(json.loads(case['expected'])['code']==res['code'])#断言实际结果与预期结果
self.assertTrue(json.loads(case['expected'])['msg']==res['msg'])
logger.info("第{}条用例通过".format(case['case_id']))
except AssertionError as e:
logger.error('第{}条用例失败'.format(case['case_id']))
运行看一下结果:
自动化测试就实现了,但是如果测试数据没有改变而再次运行的话,注册成功的用例就会失败,所以就会造成每次测试前需要去手动改用例中的测试数据(手机号),为避免这种情况可以通过数据参数化来保证每次测试的时候数据不一样。
基本思路:每次都随机生成手机号,并替换掉excel中的手机号。
代码如下:此方法也放到了common中
import random
def random_phone():
'''随机生成手机号'''
while True:
phone = '1' + random