目录结构:
目标:
代码分类管理。
common. package 放公共代码
test_data 文件夹放所有测试数据,api.xlsx,case.config
test_result 文件夹放测试结果,report.(html报告)log(日志文件)
目标一、实现接口路径的读取
目标二、发送邮件
目标三:加入日志
目标四、实现登录后充值,获取cookies
目标一、读取路径首先讲文件的绝对路径获取出来
1)相对路径:不建议使用,不灵活,当文件位置更改或更换其他电脑设备,代码运行不了的风险
2)绝对路径:建议使用
新增project_path.py,代码内容如下
__author__ = ‘林越‘
__author__ = ‘zz‘
# 读取文件路径
import os
# print(os.path.split(os.path.split(os.path.realpath(__file__))[0])[0])
# a = os.path.os.path.realpath(__file__) # 获取当前文件的绝对路径
# b = (os.path.split(os.path.os.path.realpath(__file__))[0]) # 拆分路径后,字符串取值。
Project_path = (os.path.split(os.path.split(os.path.realpath(__file__))[0])[0])
# print(Project_path)
case_config_path = os.path.join(Project_path, "test_data", "case.config") # 拼接地址
# print(case_config_path)
html_path = os.path.join(Project_path, "test_result","report", "test_result.html")
# print(html_path)
test_data_path = os.path.join(Project_path,"test_data", "api.xlsx")
# print(test_data_path)
test_log_path = os.path.join(Project_path,"test_data", "my_log.txt")
# print(test_log_path)
路径获取到了,需要变更文件中路径。(标红的是变更处)
read_config.py 配置文件更改:
from configparser import ConfigParser
from class_2019_API_unnitest.common import project_path
class ReadConfig:
def read_config(self, filename, section, option):
cf = ConfigParser()
cf.read(filename)
value = cf.get(section, option)
return value
if __name__ == ‘__main__‘:
res = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "button")
res2 = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "case_id_list")
print(res2)
test_api.py文件路径更改
import unittest
from ddt import ddt, data
from class_2019_API_unnitest.common.new_do_excle import DoExcl
from class_2019_API_unnitest.common.http_request import HttpMethod
from class_2019_API_unnitest.common.read_config import ReadConfig
from class_2019_API_unnitest.common import project_path
from class_2019_API_unnitest.common.my_log import MyLog
button = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "button")
case_id_list = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "case_id_list")
test_data = DoExcl(project_path.test_data_path).get_data(button, case_id_list)
print(button)
logger = MyLog()
COOKIES = None # 声明一个全局变量
@ddt
class TestApi(unittest.TestCase):
def setUp(self):
self.t = DoExcl(project_path.test_data_path)
logger.info("开始测试")
@data(*test_data)
def test_api(self, data_item):
global COOKIES
logger.info("正在执行第{0}条测试用例{1}".format(data_item[‘id‘],data_item[‘description‘]))
logger.info("测试数据是{0}".format(data_item[‘param‘]))
res = HttpMethod().http_request(data_item[‘url‘], eval(data_item[‘param‘]), data_item[‘HttpMethod‘], COOKIES) # eval()函数将字符串转换成字典
if res.cookies:
COOKIES = res.cookies
logger.info("测试结果是:{0}".format(res.json()))
try:
self.assertEqual(str(data_item["ExpectedResult"]),res.json()[‘code‘])
TestResult = ‘PASS‘
except AssertionError as e:
TestResult = ‘failed‘
raise e
finally:
self.t.write_back(data_item["id"]+1, res.json()[‘code‘], TestResult)
def tearDown(self):
# print("测试结束了")
logger.info("测试结束了")
目标二:生成测试报告,发送邮件到邮箱
拓展知识点:账号授权码获取方式
在common中,新增一个send_emali.py 模版,已经写好的
run.py文件中倒入引用:
import unittest
from class_2019_API_unnitest.common import test_api
from class_2019_API_unnitest.common import project_path
from class_2019_API_unnitest.common.send_email import sendEmail
import HTMLTestRunnerNew
suite = unittest.TestSuite()
loader = unittest.TestLoader()
suite.addTest(loader.loadTestsFromModule(test_api))
with open (project_path.html_path, "wb+") as file:
runner = HTMLTestRunnerNew.HTMLTestRunner(file, title=‘测试报告‘, description=‘软件测试‘, tester=‘林越‘)
runner.run(suite)
# sendEmail().send_email("1213743428@qq.com",project_path.html_path)
目标三:生成日志(现在日志文件没有写入到文件中)??
在common中新增my_log.py文件,模版是老师已经写好的
在http_request.py文件中倒入并引用
在test_api.py文件中倒入并引导
目标四:实现登录后充值
拓展知识:
了解什么是:cookies,session,token
{}字典获取不到cookies,返回值不能是字典或者列表。。
http_requst.py
import requests
from class_2019_API_unnitest.common.my_log import MyLog
logger = MyLog()
class HttpMethod:
def http_request(self,url,param,http_method, cookies): # 传递cookies参数
if http_method.upper() ==‘POST‘:
try:
res = requests.post(url, param, cookies = cookies) # 传递cookies参数
logger.info("正在进行post请求")
except Exception as e:
logger.error("post注册请求出错,错误是{}".format(e))
# print("post注册请求出错,错误是{}".format(e))
else:
try:
res = requests.get(url, param, cookies = cookies) # 传递cookies参数
logger.info("正在进行get请求")
except Exception as e:
logger.error("post注册请求出错,错误是{}".format(e))
return res # 增加返回值,在请求正常的情况下有返回值
test_api.py
import unittest
from ddt import ddt, data
from class_2019_API_unnitest.common.new_do_excle import DoExcl
from class_2019_API_unnitest.common.http_request import HttpMethod
from class_2019_API_unnitest.common.read_config import ReadConfig
from class_2019_API_unnitest.common import project_path
from class_2019_API_unnitest.common.my_log import MyLog
button = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "button")
case_id_list = ReadConfig().read_config(project_path.case_config_path, "CONFIG", "case_id_list")
test_data = DoExcl(project_path.test_data_path).get_data(button, case_id_list)
print(button)
logger = MyLog()
COOKIES = None # 声明一个全局变量
@ddt
class TestApi(unittest.TestCase):
def setUp(self):
self.t = DoExcl(project_path.test_data_path)
logger.info("开始测试")
@data(*test_data)
def test_api(self, data_item):
global COOKIES
logger.info("正在执行第{0}条测试用例{1}".format(data_item[‘id‘],data_item[‘description‘]))
logger.info("测试数据是{0}".format(data_item[‘param‘]))
res = HttpMethod().http_request(data_item[‘url‘], eval(data_item[‘param‘]), data_item[‘HttpMethod‘], COOKIES) # eval()函数将字符串转换成字典
if res.cookies: # http_request.py返回的res可以获取到cookies,如果res.cookies为真,COOKIES = res.cookies 为假,COOKIES=NONE
COOKIES = res.cookies # 在用户登录后就会获取到cookies,在充值
logger.info("测试结果是:{0}".format(res.json()))
try:
self.assertEqual(str(data_item["ExpectedResult"]),res.json()[‘code‘])
TestResult = ‘PASS‘
except AssertionError as e:
TestResult = ‘failed‘
raise e
finally:
self.t.write_back(data_item["id"]+1, res.json()[‘code‘], TestResult)
def tearDown(self):
# print("测试结束了")
logger.info("测试结束了")
原文:https://www.cnblogs.com/lin-yue/p/10308517.html