来自文件test_data_xiejinjieguo_ddt.xlsx
来自文件do_excel_ddt.py
from openpyxl import load_workbook
class DoExcel:
@staticmethod
def get_data(file_name,sheet_name):
wb=load_workbook(file_name)
sheet=wb[sheet_name]
test_data=[]
for i in range(2,sheet.max_row+1):#
row_data={}#字典
row_data['case_id']= sheet.cell(i, 1).value #行号 第1列第2行
row_data['url']=sheet.cell(i,2).value
row_data['data'] = sheet.cell(i, 3).value
row_data['title'] = sheet.cell(i, 4).value
row_data['http_method'] = sheet.cell(i,5).value
row_data['expected'] = sheet.cell(i, 6).value#添加了一个期望值到测试数据里面去
test_data.append(row_data)
return test_data
@staticmethod
#把结果写进Excel
def write_back(file_name,sheet_name,i,result,Testresult):#专门写回数据
wb=load_workbook(file_name)
sheet=wb[sheet_name]
sheet.cell(i,7).value=result
sheet.cell(i,8).value=Testresult
wb.save(file_name)#保存结果
if __name__ =='__main__':
test_data=DoExcel().get_data("../test_data/test_data_xiejinjieguo_duomokuai.xlsx", 'login')
print(test_data)
# No such file or directory: 'test_data_xiejinjieguo_jiacaseid.xlsx' 相对路径和绝对路径
#涉及Excel写操作,一定要关掉Excel
#Execl里面数字就是数字,其它全是字符串。
来自文件http_request_jingtaifangfa.py
import requests
class HttpRequest:
@staticmethod
def http_request(url,data,http_method,cookie=None):
try :
if http_method.upper()=='POST':
res=requests.post(url,data,cookies=cookie)
# elif http_method.upper()=='POST':
# res=requests.post(url,data,cookies=cookie)
else:
print("输入的请求方法不对")
except Exception as e:
print("请求报错了:{0}".format(e))
raise e
return res#返回结果
if __name__ =='__main__':
#注册
register_url= 'http://api.nnzhp.cn/api/user/add_stu'
register_data= { "name":"niuhanyang","grade":"天蝎座","phone":'18614711314'}
#登录
login_url= 'http://api.nnzhp.cn/api/user/login'
login_data={"username": "niuhanyang", "passwd": 'aA123456'}
# 充值
recharge_url= 'http://api.nnzhp.cn/api/user/gold_add'
recharge_data={"stu_id": "2170", "gold": '1'}
login_res=HttpRequest().http_request(login_url,login_data,'post')
recharge_res=HttpRequest().http_request(recharge_url,recharge_data,'post',login_res.cookies)
print("充值结果:{}".format(recharge_res.json()))
来自文件get_cookie.py
#反射:不管何时何地,只要传入一个类名,它就可以帮你操作。
class GetCookie:
Cookie=None
来自文件project_path_ddt.py
#路径的可配置
import os
'''专门来读取路径的值'''
project_path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
#对路径进行了切割,返回了这样一个元组
# path=os.path.realpath(__file__)
#测试用例的路径
test_case_path=os.path.join(project_path,'test_data','test_data_xiejinjieguo_ddt.xlsx')
#这就是绝对路径,顶级目录变,它就跟着变
#测试报告的路径
test_report_path=os.path.join(project_path,'test_result','html_report','test_api.html')
#前提是test_data的上一级目录打开,并执行run文件。这种办法,文件在哪里执行都行。
#某个时间,相对路径很好用,但是如果参照物变了就不行了。绝对路径,换台电脑就不行了。
来自文件test_http_request_ddt.py
#参数化
#执行错误,怎么写回结果?try except finally
import unittest
from tools.project_path_ddt import *
from tools.http_request_jingtaifangfa import HttpRequest
from tools.get_cookie import GetCookie#反射
from ddt import ddt,data#ddt拆分嵌套列表里面的数据。列表嵌套列表或列表嵌套字典这种形式,用data可以脱
#一层外衣,脱完之后有几个元素就有几条用例。
from tools.do_excel_ddt import DoExcel
test_data=DoExcel.get_data(test_case_path,'login')
# test_data=DoExcel.get_data('../test_data/test_data_xiejinjieguo_config.xlsx','login')#执行登录的用例
#FileNotFoundError: [Errno 2] No such file or directory: '../test_data/test_data_xiejinjieguo_config.xlsx'
#路径变了, 不可用相对路径了,相对于test_http_request_ddt可以用相对路径,但是相对于run而言,要用绝对路径
@ddt#装饰测试类
class TestHttpRequest(unittest.TestCase):
def setUp(self):
pass
@data(*test_data)
def test_api(self,item):#ddt脱外套,以逗号去数有几个元素,每个元素都传进item这个参数
#数据类型必须是列表嵌套列表或者是列表嵌套字典,如果是列表嵌套列表,读数据的时候以索引的方式来读,
#如果是列表嵌套字典,读数据就以key的方式来读。
res=HttpRequest.http_request(item['url'],eval(item['data']),item['http_method'],getattr(GetCookie,'Cookie'))
try:
self.assertEqual(item['expected'],res.json()['error_code'])#做断言,是拿实际结果和期望结果去比对,判断用例通不通过,不加断言,根本没有期望结果,用例都是通过的。
#预期结果
TestResult='PASS'
except AssertionError as e:
TestResult='Failed'
print('执行用例出错:{0}'.format(e))
raise e
finally:#加finally,不管用例有没有执行通过,它里面的代码是一定会执行的。
DoExcel.write_back(test_case_path,'login',item['case_id']+1,str(res.json()),TestResult)
print('获取到的结果是:{0}'.format(res.text)) # 打印结果
def tearDown(self):
pass
来自文件run_ddt_html.py
import unittest#引入单元测试
import HTMLTestRunner#HTML测试报告
from tools.project_path_ddt import *
from tools.test_http_request_ddt import TestHttpRequest
suite=unittest.TestSuite()
# suite.addTest(TestHttpRequest('test_api'))#测试类的实例
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestHttpRequest))
with open(test_report_path,'wb') as file:
#执行用例
runner=HTMLTestRunner.HTMLTestRunner(stream=file,
title='第一阶段项目实战',
description='这个是单元测试报告1115',
tester='清菡')
runner.run(suite)
已创建文件test_data_xiejinjieguo_ddt.xlsx,文件do_excel_ddt.py,文件http_request_jingtaifangfa.py,文件get_cookie.py,文件project_path_ddt.py,文件test_http_request_ddt.py,文件run_ddt_html.py,运行文件run_ddt_html.py
输出结果如下:
写多个模块,不同的模块就用不同的test_http_request,run里面去做加载。
来自文件test_data_xiejinjieguo_duomokuai.xlsx
反射:不管何时何地,只要传入一个类名,它就可以帮你操作。
来自文件get_cookie.py
#反射:不管何时何地,只要传入一个类名,它就可以帮你操作。
class GetCookie:
Cookie=None
来自文件do_excel_ddt.py
from openpyxl import load_workbook
class DoExcel:
@staticmethod
def get_data(file_name,sheet_name):
wb=load_workbook(file_name)
sheet=wb[sheet_name]
test_data=[]
for i in range(2,sheet.max_row+1):#
row_data={}#字典
row_data['case_id']= sheet.cell(i, 1).value #行号 第1列第2行
row_data['url']=sheet.cell(i,2).value
row_data['data'] = sheet.cell(i, 3).value
row_data['title'] = sheet.cell(i, 4).value
row_data['http_method'] = sheet.cell(i,5).value
row_data['expected'] = sheet.cell(i, 6).value#添加了一个期望值到测试数据里面去
test_data.append(row_data)
return test_data
@staticmethod
#把结果写进Excel
def write_back(file_name,sheet_name,i,result,Testresult):#专门写回数据
wb=load_workbook(file_name)
sheet=wb[sheet_name]
sheet.cell(i,7).value=result
sheet.cell(i,8).value=Testresult
wb.save(file_name)#保存结果
if __name__ =='__main__':
test_data=DoExcel().get_data("../test_data/test_data_xiejinjieguo_duomokuai.xlsx", 'login')
print(test_data)
# No such file or directory: 'test_data_xiejinjieguo_jiacaseid.xlsx' 相对路径和绝对路径
#涉及Excel写操作,一定要关掉Excel
#Execl里面数字就是数字,其它全是字符串。
来自文件http_request_jingtaifangfa.py
import requests
class HttpRequest:
@staticmethod
def http_request(url,data,http_method,cookie=None):
try :
if http_method.upper()=='POST':
res=requests.post(url,data,cookies=cookie)
# elif http_method.upper()=='POST':
# res=requests.post(url,data,cookies=cookie)
else:
print("输入的请求方法不对")
except Exception as e:
print("请求报错了:{0}".format(e))
raise e
return res#返回结果
if __name__ =='__main__':
#注册
register_url= 'http://api.nnzhp.cn/api/user/add_stu'
register_data= { "name":"niuhanyang","grade":"天蝎座","phone":'18614711314'}
#登录
login_url= 'http://api.nnzhp.cn/api/user/login'
login_data={"username": "niuhanyang", "passwd": 'aA123456'}
# 充值
recharge_url= 'http://api.nnzhp.cn/api/user/gold_add'
recharge_data={"stu_id": "2170", "gold": '1'}
login_res=HttpRequest().http_request(login_url,login_data,'post')
recharge_res=HttpRequest().http_request(recharge_url,recharge_data,'post',login_res.cookies)
print("充值结果:{}".format(recharge_res.json()))
实现路径的可配置。
来自文件project_path_duomokuai.py
#路径的可配置
import os
'''专门来读取路径的值'''
project_path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
#对路径进行了切割,返回了这样一个元组
# path=os.path.realpath(__file__)
#测试用例的路径
test_case_path=os.path.join(project_path,'test_data','test_data_xiejinjieguo_duomokuai.xlsx')
#这就是绝对路径,顶级目录变,它就跟着变
#测试报告的路径
test_report_path=os.path.join(project_path,'test_result','html_report','test_api.html')
#前提是test_data的上一级目录打开,并执行run文件。这种办法,文件在哪里执行都行。
#某个时间,相对路径很好用,但是如果参照物变了就不行了。绝对路径,换台电脑就不行了。
来自文件test_http_request_login.py
#参数化
#执行错误,怎么写回结果?try except finally
import unittest
from tools.project_path_duomokuai import *
from tools.http_request_jingtaifangfa import HttpRequest
from tools.get_cookie import GetCookie#反射
from ddt import ddt,data#ddt拆分嵌套列表里面的数据。列表嵌套列表或列表嵌套字典这种形式,用data可以脱
#一层外衣,脱完之后有几个元素就有几条用例。
from tools.do_excel_ddt import DoExcel
test_data=DoExcel.get_data(test_case_path,'login')
# test_data=DoExcel.get_data('../test_data/test_data_xiejinjieguo_config.xlsx','login')#执行登录的用例
#FileNotFoundError: [Errno 2] No such file or directory: '../test_data/test_data_xiejinjieguo_config.xlsx'
#路径变了, 不可用相对路径了,相对于test_http_request_ddt可以用相对路径,但是相对于run而言,要用绝对路径
@ddt#装饰测试类
class TestHttpRequest(unittest.TestCase):
def setUp(self):
pass
@data(*test_data)
def test_api(self,item):#ddt脱外套,以逗号去数有几个元素,每个元素都传进item这个参数
#数据类型必须是列表嵌套列表或者是列表嵌套字典,如果是列表嵌套列表,读数据的时候以索引的方式来读,
#如果是列表嵌套字典,读数据就以key的方式来读。
res=HttpRequest.http_request(item['url'],eval(item['data']),item['http_method'],getattr(GetCookie,'Cookie'))
try:
self.assertEqual(item['expected'],res.json()['error_code'])#做断言,是拿实际结果和期望结果去比对,判断用例通不通过,不加断言,根本没有期望结果,用例都是通过的。
#预期结果
TestResult='PASS'
except AssertionError as e:
TestResult='Failed'
print('执行用例出错:{0}'.format(e))
raise e
finally:#加finally,不管用例有没有执行通过,它里面的代码是一定会执行的。
DoExcel.write_back(test_case_path,'login',item['case_id']+1,str(res.json()),TestResult)
print('获取到的结果是:{0}'.format(res.text)) # 打印结果
def tearDown(self):
pass
来自文件test_http_request_recharge.py
#参数化
#执行错误,怎么写回结果?try except finally
import unittest
from tools.project_path_duomokuai import *
from tools.http_request_jingtaifangfa import HttpRequest
from tools.get_cookie import GetCookie#反射
from ddt import ddt,data#ddt拆分嵌套列表里面的数据。列表嵌套列表或列表嵌套字典这种形式,用data可以脱
#一层外衣,脱完之后有几个元素就有几条用例。
from tools.do_excel_ddt import DoExcel
test_data=DoExcel.get_data(test_case_path,'recharge')
# test_data=DoExcel.get_data('../test_data/test_data_xiejinjieguo_config.xlsx','login')#执行登录的用例
#FileNotFoundError: [Errno 2] No such file or directory: '../test_data/test_data_xiejinjieguo_config.xlsx'
#路径变了, 不可用相对路径了,相对于test_http_request_ddt可以用相对路径,但是相对于run而言,要用绝对路径
@ddt#装饰测试类
class TestHttpRequest(unittest.TestCase):
def setUp(self):
pass
@data(*test_data)
def test_api(self,item):#ddt脱外套,以逗号去数有几个元素,每个元素都传进item这个参数
#数据类型必须是列表嵌套列表或者是列表嵌套字典,如果是列表嵌套列表,读数据的时候以索引的方式来读,
#如果是列表嵌套字典,读数据就以key的方式来读。
res=HttpRequest.http_request(item['url'],eval(item['data']),item['http_method'],getattr(GetCookie,'Cookie'))
if res.cookies: # 利用反射存储cookie值
setattr(GetCookie, 'Cookie', res.cookies)
try:
self.assertEqual(item['expected'],res.json()['error_code'])#做断言,是拿实际结果和期望结果去比对,判断用例通不通过,不加断言,根本没有期望结果,用例都是通过的。
#预期结果
TestResult='PASS'
except AssertionError as e:
TestResult='Failed'
print('执行用例出错:{0}'.format(e))
raise e
finally:#加finally,不管用例有没有执行通过,它里面的代码是一定会执行的。
DoExcel.write_back(test_case_path,'recharge',item['case_id']+1,str(res.text),TestResult)
print('获取到的结果是:{0}'.format(res.text)) # 打印结果
def tearDown(self):
pass
来自文件run_duomokuai.py
'''
写多个模块,不同的模块就用不同的test_http_request,run里面去做加载
'''
import unittest#引入单元测试
import HTMLTestRunner#HTML测试报告
from tools.project_path_duomokuai import *
from tools import test_http_request_login
from tools import test_http_request_recharge
suite=unittest.TestSuite()
# suite.addTest(TestHttpRequest('test_api'))#测试类的实例
loader=unittest.TestLoader()
#并行多个用例的方法一
suite.addTest(loader.loadTestsFromModule(test_http_request_login))
suite.addTest(loader.loadTestsFromModule(test_http_request_recharge))
with open(test_report_path,'wb') as file:
#执行用例
runner=HTMLTestRunner.HTMLTestRunner(stream=file,
title='第一阶段项目实战',
description='这个是单元测试报告1115',
tester='清菡')
runner.run(suite)
已创建文件test_data_xiejinjieguo_duomokuai.xlsx,文件get_cookie.py,文件do_excel_ddt.py,文件http_request_jingtaifangfa.py,文件project_path_duomokuai.py,文件test_http_request_login.py,文件test_http_request_recharge.py,文件run_duomokuai.py,运行文件run_duomokuai.py
输出结果如下:
通过配置文件去决定执行哪个模块的用例。通过配置文件,以字典的形式key去存它的表单,value去存它执行所有用例还是些其它的用例。
来自文件test_data_xiejinjieguo_config.xlsx
来自文件do_excel_config.py
from openpyxl import load_workbook
from tools.read_config import ReadConfig
from tools import project_path_config
class DoExcel:
@staticmethod
def get_data(file_name):
wb = load_workbook(file_name)
mode=eval(ReadConfig.get_config(project_path_config.case_config_path, 'MODE', 'mode'))
test_data = []#把字典里所有数据都拿到
for key in mode:#遍历这个存在配置文件里的字典
sheet = wb[key]#key是表单名
if mode[key]=='all':
for i in range(2,sheet.max_row+1):#
row_data={}#字典
row_data['case_id']= sheet.cell(i, 1).value #行号 第1列第2行
row_data['url']=sheet.cell(i,2).value
row_data['data'] = sheet.cell(i, 3).value
row_data['title'] = sheet.cell(i, 4).value
row_data['http_method'] = sheet.cell(i,5).value
row_data['expected'] = sheet.cell(i, 6).value#添加了一个期望值到测试数据里面去
row_data['sheet_name'] = key
test_data.append(row_data)
else:
for case_id in mode[key]:#
row_data = {} # 字典
row_data['case_id'] = sheet.cell(case_id+1, 1).value # 行号 第1列第2行
row_data['url'] = sheet.cell(case_id+1, 2).value
row_data['data'] = sheet.cell(case_id+1, 3).value
row_data['title'] = sheet.cell(case_id+1, 4).value
row_data['http_method'] = sheet.cell(case_id+1, 5).value
row_data['expected'] = sheet.cell(case_id+1, 6).value # 添加了一个期望值到测试数据里面去
row_data['sheet_name']=key
test_data.append(row_data)
return test_data
@staticmethod
#把结果写进Excel
def write_back(file_name,sheet_name,i,result,Testresult):#专门写回数据
wb=load_workbook(file_name)
sheet=wb[sheet_name]
sheet.cell(i,7).value=result
sheet.cell(i,8).value=Testresult
wb.save(file_name)#保存结果
if __name__ =='__main__':
test_data=DoExcel().get_data(project_path_config.test_case_path)
print(len(test_data))
# No such file or directory: 'test_data_xiejinjieguo_jiacaseid.xlsx' 相对路径和绝对路径
#涉及Excel写操作,一定要关掉Excel
#Execl里面数字就是数字,其它全是字符串。
来自文件case.config
来自文件http_request_jingtaifangfa.py
import requests
class HttpRequest:
@staticmethod
def http_request(url,data,http_method,cookie=None):
try :
if http_method.upper()=='POST':
res=requests.post(url,data,cookies=cookie)
# elif http_method.upper()=='POST':
# res=requests.post(url,data,cookies=cookie)
else:
print("输入的请求方法不对")
except Exception as e:
print("请求报错了:{0}".format(e))
raise e
return res#返回结果
if __name__ =='__main__':
#注册
register_url= 'http://api.nnzhp.cn/api/user/add_stu'
register_data= { "name":"niuhanyang","grade":"天蝎座","phone":'18614711314'}
#登录
login_url= 'http://api.nnzhp.cn/api/user/login'
login_data={"username": "niuhanyang", "passwd": 'aA123456'}
# 充值
recharge_url= 'http://api.nnzhp.cn/api/user/gold_add'
recharge_data={"stu_id": "2170", "gold": '1'}
login_res=HttpRequest().http_request(login_url,login_data,'post')
recharge_res=HttpRequest().http_request(recharge_url,recharge_data,'post',login_res.cookies)
print("充值结果:{}".format(recharge_res.json()))
来自文件project_path_config.py
#路径的可配置
import os
'''专门来读取路径的值'''
project_path=os.path.split(os.path.split(os.path.realpath(__file__))[0])[0]
#对路径进行了切割,返回了这样一个元组
# path=os.path.realpath(__file__)
#测试用例的路径
test_case_path=os.path.join(project_path,'test_data','test_data_xiejinjieguo_config.xlsx')
#这就是绝对路径,顶级目录变,它就跟着变
#测试报告的路径
test_report_path=os.path.join(project_path,'test_result','html_report','test_api.html')
#配置文件的路径
case_config_path=os.path.join(project_path,'conf','case.config')
# print(case_config_path)
#前提是test_data的上一级目录打开,并执行run文件。这种办法,文件在哪里执行都行。
#某个时间,相对路径很好用,但是如果参照物变了就不行了。绝对路径,换台电脑就不行了。
来自文件test_http_request_config.py
import unittest
from tools.project_path_config import *
from tools.http_request_jingtaifangfa import HttpRequest
from tools.get_cookie import GetCookie#反射
from ddt import ddt,data
from tools.do_excel_config import DoExcel
test_data=DoExcel.get_data(test_case_path)#执行所有的用例
@ddt#装饰测试类
class TestHttpRequest(unittest.TestCase):
def setUp(self):
pass
@data(*test_data)
def test_api(self,item):#ddt脱外套,以逗号去数有几个元素,每个元素都传进item这个参数
#数据类型必须是列表嵌套列表或者是列表嵌套字典,如果是列表嵌套列表,读数据的时候以索引的方式来读,
#如果是列表嵌套字典,读数据就以key的方式来读。
res=HttpRequest.http_request(item['url'],eval(item['data']),item['http_method'],getattr(GetCookie,'Cookie'))
if res.cookies:#利用反射存储cookie值
setattr(GetCookie,'Cookie',res.cookies)
try:
self.assertEqual(item['expected'],res.json()['error_code'])#做断言,是拿实际结果和期望结果去比对,判断用例通不通过,不加断言,根本没有期望结果,用例都是通过的。
#预期结果
TestResult='PASS'
except AssertionError as e:
TestResult='Failed'
print('执行用例出错:{0}'.format(e))
raise e
finally:#加finally,不管用例有没有执行通过,它里面的代码是一定会执行的。
DoExcel.write_back(test_case_path,item['sheet_name'],item['case_id']+1,str(res.json()),TestResult)
print('获取到的结果是:{0}'.format(res.text)) # 打印结果
def tearDown(self):
pass
来自文件get_cookie.py
#反射:不管何时何地,只要传入一个类名,它就可以帮你操作。
class GetCookie:
Cookie=None
来自文件read_config.py
import configparser
class ReadConfig:
@staticmethod
def get_config(file_path,section,option):
cf=configparser.ConfigParser()
cf.read(file_path)
return cf[section][option]
if __name__ == '__main__':
from tools import project_path_config
print(ReadConfig.get_config(project_path_config.case_config_path, 'MODE', 'mode'))
来自文件run_ddt_config.py
#方法二
#通过配置文件去决定执行哪个模块的用例。通过配置文件,以字典的形式key去存它的表单,
# value去存它执行所有用例还是些其它的用例
import unittest#引入单元测试
import HTMLTestRunner#HTML测试报告
from tools.project_path_config import *
from tools.test_http_request_config import TestHttpRequest
suite=unittest.TestSuite()
# suite.addTest(TestHttpRequest('test_api'))#测试类的实例
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestHttpRequest))
with open(test_report_path,'wb') as file:
#执行用例
runner=HTMLTestRunner.HTMLTestRunner(stream=file,
title='第一阶段项目实战',
description='这个是单元测试报告1115',
tester='清菡')
runner.run(suite)
已创建文件test_data_xiejinjieguo_config.xlsx,文件get_cookie.py,文件do_excel_config.py,文件case.config,文件http_request_jingtaifangfa.py,文件project_path_config.py,文件test_http_request_config.py,文件read_config.py,文件run_ddt_config.py,执行文件run_ddt_config.py
输出结果如下: