使用requests+unittest进行接口测试

之前学习python做接口测试时,用的时requests+excel的方式来进行接口测试,后来在工作中也用unittest来做了一个项目的接口测试,接口测试用例完全基于unittest来编写,把大致步骤记录一下。

项目背景

之前公司的测试并没有在前期就介入项目,即使是接口测试,也是在研发人员完成项目开发后再进行的接口校验,其实更接近于验证一下接口功能是否正常实现了,一般这种工作我更喜欢使用postman来进行,一个一个把接口录入postman,每个都单独校验一下,最终也会形成一套测试脚本(对于没有代码能力又要进行接口测试的人来说简直是神器)。后来再论坛看其他人的经验贴时,发现其实对于公司这种接口比较少的项目,也完全可以用python自带的unittest来写测试用例,一个接口写作一个py文件,其实也很简洁,相对于requests+excel的方式省去了读取/解析excel文件的步骤,维护起来也不麻烦。

结构说明

base_data: 封装了一些基础数据,如固定的ip地址、端口(方便后期修改)

common_utils: 存放了一些配置文件、读取配置文件的方法、发送请求的方法

reports:存放测试报告

test_suits: 存放接口测试用例

run_report.py: 最终运行文件,即调用测试用例,执行后生成报告

每个模块下的具体内容

1.common_utils

config.ini配置文件
[URL]
# url = http://192.168.XXX:7001
url  = http://192.168.XXX:8080
read_config.py读取配置文件的方法

# -*- coding:utf-8 -*-

import configparser
import os

class ReadConfig:
    def __init__(self, filepath=None):
        if filepath:
            configpath1 = filepath
        else:
            root_dir1 = os.path.dirname(__file__)  # 获取当前脚本的目录
            configpath1 = os.path.join(root_dir1, "config.ini")  # 拼接路径
            # print(root_dir1)

            # root_dir = os.path.dirname(os.path.abspath(‘.‘)) # 获取当前脚本所在目录的上一级目录
            # configpath = os.path.join(root_dir, "common_utils/config.ini") # 拼接路径
            # print(root_dir)

        self.cf = configparser.ConfigParser()
        self.cf.read(configpath1)

    def get_host(self, param):
        value = self.cf.get("URL", param)
        return value

base_url = ReadConfig()

# if __name__ == ‘__main__‘:
#     test = ReadConfig()
#     t = test.get_host("url")
#     print(t)
    # print(base_url.get_host("URL"))
send_request.py
请求方法类
# -*- coding:utf-8 -*-

import requests
import json
from requests.exceptions import RequestException

class RunMethod:
    """定义一个执行接口请求的类"""

    @staticmethod
    def send_get(url, data=None, header=None):
        response = requests.get(url=url, params=data, headers=header, timeout=20)
        try:
            if response.status_code == 200:
                r = response
                return r
            else:
                return None
        except RequestException:
            print("请求失败")
            return None

    @staticmethod
    def send_post(url, data=None, header=None):
        response = requests.post(url=url, data=data, headers=header, timeout=20)
        try:
            if response.status_code == 200:
                r = response
                return r
            else:
                return None
        except RequestException:
            print("请求失败")
            return None

    def run_main(self, method, url, data=None, header=None):
        if method == "GET":
            res = self.send_get(url, data, header)
        else:
            res = self.send_post(url, data, header)
        # return json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False)
        return res

if __name__ == ‘__main__‘:
    url = "http://192.168.XXX:7001/ApprLicenseInterface/saveFile.v"
    data = {‘ATTACH_SIZE‘: "36243", ‘ATTACH_URL‘: "/mnt/MDFilesPath/APPR_STUFF_ATTACH/B2018120709470002/Rectangle.png",
             ‘ATTACH_CREATOR‘: "", ‘PARENTID‘: "-1", ‘ATTACH_NAME‘: "67d06265bb814e6aa0f8f87913ab4f4e.pdf"}
    t = RunMethod()
    print(t.run_main("GET", url, data))
    print(type(t.run_main("GET", url, data)))

2.base_data

base_data.py
基础数据,从配置文件取数据
# -*- coding:utf-8 -*-

from common_utils.read_config import ReadConfigimport os

class BaseData:    def __init__(self):        self.data = ReadConfig()

    def get_ip(self):        """从配置文件中获取固定ip"""        ip = self.data.get_host("url")        return ip

base_data = BaseData()# print(base_data.get_ip())

3.test_suits

这里面就是存放的接口测试用例了,一个文件代表一个接口,每个文件中根据实际情况存在多条用例(根据传参不同来组合)

注意:为了再后面往套件中添加用例文件,为每个用例文件都加了test_前缀;

说下遇到的一个问题:因为接口文档中每个接口都有一个编号,如下

所以开始我的命名方式是 test_5.2.1.1+接口名称,然后发现在把用例添加到测试套件时总是识别不到,后来把数字去掉才可以,至今不知道什么原因导致的。。。

一个例子
# -*- coding:utf-8 -*-

import unittest
from common_utils.send_request import RunMethod
from base_data.base_data import *
import json

run = RunMethod()
class Test(unittest.TestCase):
    """ 5.2.1.3、依职能查验用证:通过目录编码以及身份证件号码获取证照"""
    @classmethod
    def setUpClass(cls):
        cls.url = base_data.get_ip() + "/XXX/licenseList/identity.v"

    @classmethod
    def tearDownClass(cls):
        pass

    def test01(self):
        """参数正常"""
        data = {"licenseDirNum":"123456789",
                "identityNumbers":"120101198001010098"}
        r = run.run_main("GET", self.url, data)
        res = r.json()
        print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
        self.assertEqual("200", res["status"])
        self.assertNotEqual([], res["data"]["dataList"])   # 判断dataList不为空

    def test02(self):
        """licenseDirNum为空"""
        data = {"licenseDirNum":"",
                "identityNumbers":"120101198001010098"}
        r = run.run_main("GET", self.url, data)
        res = r.json()
        print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
        self.assertEqual("传入的参数:(licenseDirNum)不能为空", res["desc"])
        self.assertTrue(res["data"] is None)  # 判断返回结果的data值为空
        self.assertIsNone(res["data"])   # 判断返回结果的data值为空
        # self.assertNotEqual([], res["data"]["dataList"])

    def test03(self):
        """identityNumbers为空"""
        data = {"licenseDirNum": "123456789",
                "identityNumbers": ""}
        r = run.run_main("GET", self.url, data)
        res = r.json()
        print(json.dumps(res, indent=2, sort_keys=False, ensure_ascii=False))
        self.assertEqual("传入的参数:(identityNumbers)不能为空", res["desc"])
        self.assertTrue(res["data"] is None)  # 判断返回结果的data值为空

if __name__ == ‘__main__‘:
    suite = unittest.TestSuite()  # 调用unittest的TestSuite(),理解为管理case的一个容器(测试套件)
    suite.addTest(Test(‘test01‘))  # 向测试套件中添加用例,"TestMethod"是上面定义的类名,"test01"是用例名
    runner = unittest.TextTestRunner()
    runner.run(suite)  # 执行套件中的用例

4.run_report.py

# coding: utf-8
# author: hmk

import HTMLTestRunner
import unittest
import time, os

root_dir = os.path.dirname(os.path.abspath(__file__))  # 获取当前脚本的目录
case_dir = root_dir + ‘/test_suits‘  # 根据项目所在路径,找到用例所在的相对项目的路径
# case_dir1 = ‘E:/5.coding\电子证照库接口/test_suits\电子证照类‘
print(root_dir)
print(case_dir)

suits = unittest.defaultTestLoader.discover(case_dir, pattern=‘test_*.py‘, top_level_dir=None) # 加载用例,用例文件名最好不要有数字,否则导致识别不到

suit = unittest.TestLoader().discover(case_dir)  # 加载用例

"""
1.case_dir即测试用例所在目录
2.pattern=‘test_*.py‘ :表示用例文件名的匹配原则,“*”表示任意多个字符
3.top_level_dir=None:测试模块的顶层目录。如果没顶层目录(也就是说测试用例不是放在多级目录
中),默认为 None
"""

if __name__ == ‘__main__‘:
    now_time = time.strftime("%Y-%m-%d %H-%M-%S")
    filename = root_dir + ‘/reports/‘ + now_time + ‘_result.html‘  # 定义报告文件

    # fp = open(filename, ‘wb‘)
    # runner = HTMLTestRunner.HTMLTestRunner(stream=fp,title=‘电子证照库接口测试报告‘,description=‘测试结果如下: ‘)
    # runner.run(suit)
    # fp.close()  # 普通方式打开文件

    with open(filename, ‘wb‘) as fp:
        """使用withopen操作文件"""
        runner = HTMLTestRunner.HTMLTestRunner(stream=fp, title=‘电子证照库接口测试报告‘, description=‘测试结果如下: ‘)
        runner.run(suits)

最后执行run_report.py即可运行全部接口用例,得到测试报告

原文地址:https://www.cnblogs.com/hanmk/p/10969938.html

时间: 2024-10-16 21:12:16

使用requests+unittest进行接口测试的相关文章

python+requests+unittest API接口测试

黑熊再网上查找了下接口测试相关的资料,大都重点是以数据驱动的形式,将用例维护在文本或表格中,而没有说明怎么样去生成想要的用例, 问题: 测试接口时,比如参数a,b,c,我要先测a参数,有(不传,为空,整形,浮点,字符串,object,过短,超长,sql注入)这些情况,其中一种情况就是一条用例,同时要保证b,c的正确,确保a的测试不受b,c参数的错误影响 解决思路: 符合接口规范的参数可以手动去填写,或者准备在代码库中.那些不符合规范的参数(不传,为空,整形,浮点,字符串,object,过短,超长

集成unittest做接口测试

unittest接口测试 上篇已经讲了接口测试的做法,利用的是postman工具,工具始终是工具,它有一定的局限性,比如测试数据的存放,断言的方法以及上下接口关联使用灵活性.python对http接口封装了一个requests库可以调用接口,结合unittest单元测试框架可以完美测试. 简单实例 import unittest import requests class GetEventListTest(unittest.TestCase): """查询发布会接口测试&qu

Python+requests+unittest+excel实现接口自动化测试框架

一.框架结构:  工程目录 二.Case文件设计 三.基础包 base 3.1 封装get/post请求(runmethon.py) 1 import requests 2 import json 3 class RunMethod: 4 def post_main(self,url,data,header=None): 5 res = None 6 if header !=None: 7 res = requests.post(url=url,data=data,headers=header)

Python+requests+unittest+excel实现接口自动化测试框架(摘录)

一.框架结构:  工程目录 二.Case文件设计 三.基础包 base 3.1 封装get/post请求(runmethon.py) 1 import requests 2 import json 3 class RunMethod: 4 def post_main(self,url,data,header=None): 5 res = None 6 if header !=None: 7 res = requests.post(url=url,data=data,headers=header)

Python+Requests接口测试教程(1):Fiddler抓包工具

本书涵盖内容:fiddler.http协议.json.requests+unittest+报告.bs4.数据相关(mysql/oracle/logging)等内容.刚买须知:本书是针对零基础入门接口测试和python+requests自动化的,首先本书确实写的比较基础,对基础内容也写的很详细,所以大神绕道. 为什么要先学fiddler? 学习接口测试必学http协议,如果直接先讲协议,我估计小伙伴们更懵,为了更好的理解协议,先从抓包开始.结合抓包工具讲http协议更容易学一些. 1.1 抓fir

基于Python Requests的数据驱动的HTTP接口测试

发表于:2017-8-30 11:56  作者:顾翔   来源:51Testing软件测试网原创 http://www.51testing.com/html/69/n-3720769-2.html 1.测试金字塔 图 1软件测试金字塔 图 1是Main Cohn提出的软件测试金字塔,他认为作为一个测试工程师应该把大量的工作花在单元测试和接口测试,而其余的发在UI测试以及探索式测试.纵然,单元测试的优点很突出,它接近于代码本身,运行速度快,开发可以一边写产品代码一边写单元测试代码,一旦在单元测试中

环境、requests、unittest

一.环境 语言:Python 工具:pycharm 包:requests unittest是python自带的包,不需要安装 二.requests 请求方式有:get.post.put.delete.head.options 原文地址:https://www.cnblogs.com/yinwenbin/p/10560836.html

让http服务人类(python之requests做接口测试)

让http服务人类 最优雅的http请求库(python的http请求库有很多,比如urllib2,urllib3,httplib). requests库简介 requests库是基于urllib3库封装的第三方http请求库,在python中requests应用最广泛的应该属网络爬虫方面,对于测试来说,我们对于requests的应用主要是接口测试方面. 实例(1)创建一个请求: httpbin:这个网站专门是为了给http做测试用的. import requests #导入requests模块

Python 接口测试(五)

五:使用python进行组织编写接口测试用例 接口测试其实就是几个步骤. 拿到接口的url地址 查看接口是用什么方式发送 添加请求头,请求体 发送查看返回结果,校验返回结果是否正确 明白了接口测试的测试步骤,那么我们就可以来组织我们的代码. import requests # 接口的url url = "http://fanyi.baidu.com/v2transapi" # 接口的参数 params = { "from":"en", "