接口测试第三阶段代码

 目录结构: 

 

目标:

代码分类管理。

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("测试结束了")

 
 

 

posted @ 2019-02-02 14:08  木木越越  阅读(239)  评论(0编辑  收藏  举报