Python+Unittest+Requests实现HTTP接口测试

简介: Python的优势:语法简洁优美, 功能强大, 标准库跟第三方库灰常强大,建议大家事先了解一下Python的基础;unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。Requests 是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP 库。它比urllib 更加方便,可以节约我们大量的工作,完全满足HTTP 测试需求。

Python的优势:语法简洁优美, 功能强大, 标准库跟第三方库灰常强大,建议大家事先了解一下Python的基础;


unittest是python的标准测试库,相比于其他测试框架是python目前使用最广的测试框架。

Requests 是用Python语言编写,基于urllib,采用Apache2 Licensed开源协议的HTTP 库。它比urllib 更加方便,可以节约我们大量的工作,完全满足HTTP 测试需求。

话不多说,直接上代码,例子是一个登录接口的请求。

#coding=utf-8
import requests            #pip安装requests第三方库,然后引入
import json                #引入json标准库,美化json输出
url = 'http://account/login'
data = {
    "username":"01",
    "password":"password",
}
result = requests.post(url,data).json()
print result

调用requests库中的post方法,会给出所需要的参数,传入上面定义的url和data参数,运行.py文件就执行了post请求。

但是问题来了,这样做,代码的复用性基本不存在,所有这里我们就需要封装一下post请求的方法。执行程序时调用和这个方法就可以了。

# coding=utf-8
import requests        # pip安装requests第三方库,然后引入
import json            # 引入json标准库,美化json输出
# 定义一个方法,传入需要的参数url和data
def send_post(url=None,data=None ): 
    # 参数必须按照url、data顺序传入
    # 因为这里要封装post方法,所以这里的url和data值不能写死
    result = requests.post(url=url,data=data).json() 
    res = json.dumps(result,ensure_ascii=False,sort_keys=True,indent=2)
    print res
if __name__ == '__main__':
    url = 'http://***/account/login'
    data = {
        "username":"***01",
        "password":"password",
    }
    # 实例化send_post方法,并传入url和data值
    post = send_post(url=url,data=data)

当然http请求不止有post一种,那么常见的请求方式还有get,那么同理可以写出get请求的方法,这里就不给大家贴代码了。

思考一下,如果我们要测试一个接口,是不是要考虑他的请求方式呢?那么以后我们要做接口自动化的时候是不是也可以根据接口的请求方式让程序选择我们之前封装好的请求方法呢,答案是肯定的。所以我们这里要把所有的请求方式都封装起来,根据接口的请求方式来调用请求方法;

# coding=utf-8
import requests
import json
class RunMain:
    def send_post(self, url, data):  # 定义一个方法,传入需要的参数url和data
        # 参数必须按照url、data顺序传入
        result = requests.post(url=url, data=data).json()  # 因为这里要封装post方法,所以这里的url和data值不能写死
        res = json.dumps(result,ensure_ascii=False,sort_keys=True,indent=2)
        return res
        # print res
    def send_get(self, url, data):
        result = requests.get(url=url, data=data)
        res = json.dumps(result,ensure_ascii=False,sort_keys=True,indent=2)
        return res
    def run_main(self, method, url=None, data=None):
        result = None
        if method == 'post':
            result = self.send_post(url, data)
        elif method == 'get':
            result = self.send_get(url, data)
        else:
            print "错误"
        return result
if __name__ == '__main__':
    url = 'http://***/account/login'
    data = {
        "username": "***01",
        "password": "password"
    }

至此我们的请求方式就封装好了,可以根据不同的请求方式调用方法来得到相应的返回值了。

现在我们得到结果了,那我们怎么去验证得到的结果是否正确呢,这就用到了Python中比较主流的测试框架unittest,下边通过代码简单的写一下unittest的工作原理。

#coding=utf-8
import unittest
class TestDemo(unittest.TestCase):
    def test_01(self):
        print "这是第一个测试用例"
    def test_02(self):
        print "这是第二个测试用例"
if __name__ == '__main__':
    # unittest.main
    # unittest框架的TestSuite()类是用来创建测试套件的。
    suite = unittest.TestSuite()
    # addTest()方法是将测试用例添加到测试套件中
    suite.addTest(TestDemo('test_01'))
    suite.addTest(TestDemo('test_02'))
    #run()方法是运行测试套件的测试用例,入参为suite测试套件。
    unittest.TextTestRunner().run(suite)

现在请求方法封装好了,unittest也有了,我们是不是写case然后利用unittest的TestCase执行用例就可以了。

# coding=utf-8
import unittest
import json
from requests_demo.demo04 import RunMain
class TestRun(unittest.TestCase):
    def setUp(self):
        self.run_main1 = RunMain()
    # 测试用例必须以test开头
    def test_01(self):
        url = 'http://***/account/login'
        data = {
            "username": "***01",
            "password": "password",
        }
        res = self.run_main1.run_main('post', url, data)
        #打印得到的结果
        print res
        #看返回值的类型,必须是字典dict才能取到报文中的字段值
        print type(res)
        #调试的时候看下得到的字段是是否正确
        print res['status']
        #unittest的断言方式,判断a,b是否一致
        #assertEqual(a,b,msg)
        self.assertEqual(res['status'], 0, "测试通过")
if __name__ == '__main__':
    #实例化TestSuite创建测试套件
    suite = unittest.TestSuite
    #把用例test_01添加到测试套件中
    suite.addTest(TestRun('test_01'))
    #run()方法是运行测试套件的测试用例,入参为suite测试套件。
    unittest.TextTestRunner().run(suite) 

我们还可以利用HTMLTestRunner输出测试报告,HTMLTestRunner是Python 标准库的unittest 模块的一个扩展,它可以生成HTML的测试报告。

# coding=utf-8
import unittest
import HTMLTestRunner
from requests_demo.demo04 import RunMain
class TestRun(unittest.TestCase):
    def setUp(self):
        self.run_main1 = RunMain()
    # 测试用例必须以test开头
    def test_01(self):
        url = 'http://***/account/login'
        data = {
            "username": "***01",
            "password": "password",
        }
        res = self.run_main1.run_main('post', url, data)
        # 打印得到的结果
        print(res)
        # 看返回值的类型,必须是字典dict才能取到报文中的字段值
        print(type(res))
        # 调试的时候看下得到的字段是是否正确
        print(res['status'])
        # unittest的断言方式,判断a,b是否一致
        # assertEqual(a,b,msg)
        self.assertEqual(res['status'], 0, "测试通过")
if __name__ == '__main__':
    # 实例化TestSuite创建测试套件
    suite = unittest.TestSuite
    # 把用例test_01添加到测试套件中
    suite.addTest(TestRun('test_01'))
    # run()方法是运行测试套件的测试用例,入参为suite测试套件。
    # unittest.TextTestRunner().run(suite)
    file_path = "../report/test_report.html"
    fp = file(file_path, 'wb')
    reportRunner = HTMLTestRunner.HTMLTestRunner(stream=fp, title='***系统', description='测试报告')
    reportRunner.run(suite)
    fp.close()

至此一个简单的利用Python+request+unittest的接口测试示例就结束了。留给大家一个问题,如果这样维护用例每次都要改代码是不是违背了做自动化的初衷呢?那我们如何利用这套框架来实现接口测试自动化呢?








目录
相关文章
|
19天前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
29 4
|
1月前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
84 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
8天前
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
2月前
|
数据采集 前端开发 算法
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
本文介绍了如何使用 Python 的 `requests` 库应对复杂的 HTTP 请求场景,包括 Spider Trap(蜘蛛陷阱)、SESSION 访问限制和请求频率限制。通过代理、CSS 类链接数控制、多账号切换和限流算法等技术手段,提高爬虫的稳定性和效率,增强在反爬虫环境中的生存能力。文中提供了详细的代码示例,帮助读者掌握这些高级用法。
104 1
Python Requests 的高级使用技巧:应对复杂 HTTP 请求场景
|
25天前
|
JSON API 数据格式
Python中获取HTTP请求响应体的详解
本文介绍了如何使用Python的`requests`和`urllib`库发送HTTP请求并处理响应体。`requests`库简化了HTTP请求过程,适合快速开发;`urllib`库则更为底层,适用于性能要求较高的场景。文章详细演示了发送GET请求、处理JSON响应等常见操作。
38 3
|
1月前
|
数据采集 JSON 测试技术
Python爬虫神器requests库的使用
在现代编程中,网络请求是必不可少的部分。本文详细介绍 Python 的 requests 库,一个功能强大且易用的 HTTP 请求库。内容涵盖安装、基本功能(如发送 GET 和 POST 请求、设置请求头、处理响应)、高级功能(如会话管理和文件上传)以及实际应用场景。通过本文,你将全面掌握 requests 库的使用方法。🚀🌟
58 7
|
1月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
55 3
|
1月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
47 1
|
1月前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
3月前
|
监控 安全 搜索推荐
设置 HTTPS 协议以确保数据传输的安全性
设置 HTTPS 协议以确保数据传输的安全性