接口自动化测试学习使用

接口自动化测试介绍

1、概念

接口测试:是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,

                  以及相互逻辑依赖关系。

自动化测试:是把以人为驱动的测试行为转化为机器执行的一种过程。

接口自动化测试:是让程序或工具代替人工自动的完成对接口进行测试的一种过程。

2、 实现方式

  • 使用接口测试工具来实现,比如:JMeter、Postman等
  • 通过编写代码来实现(使用requests、session)

3、接口测试工具的不足

  • 测试数据不好控制
  • 不方便测试加密接口
  • 拓展性差

Requests库

1、什么是 requests 库

1.1 介绍

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

2.2 安装

pip install requests

2、发送请求

使用 requests 发送网络请求非常简单,只需要调用HTTP请求类型所对应的方法即可。

常见的HTTP请求方式:GET、POST、PUT、DELETE、HEAD、OPTIONS

2.1 GET请求

import requests

response = requests.get("http://www.baidu.com")

请求方法的返回值response为 Response 对象,我们可以从这个对象中获取所有我们想要的响应 信息。

扫描二维码关注公众号,回复: 16024269 查看本文章

2.2 POST请求

response = requests.post(url, data=None, json=None)
    """
    :param url: 请求的URL
    :param data: (可选) 要发送到请求体中的字典、元组、字节或文件对象
    :param json: (可选) 要发送到请求体中的JSON数据
    :rtype: requests.Response
    """

import requests

response = requests.post("http://www.baidu.com", data={"key": "value"})

扩展data与json区别:
data:字典对象
json:json字符串
提示:
      1. 在python中字典对象和json字符串长的一样,但是后台格式是有区别的
如何将字典对象转为json字符串?
      1. 导入 json
      2. json.dumps(字典对象) # 转换json字符串


响应数据 json()与text区别:
        json():返回类型字典,可以通过键名来获取响应的值
        text:返回的类型为字符串,无法通过键名来获取响应的值
        提示:共同点长得都像字典 

2.3 其他请求类型

其他 HTTP 请求类型,比如:PUT、DELETE、HEAD 以及 OPTIONS。

import requests

response = requests.put("http://www.baidu.com", data={"key": "value"})
response = requests.delete("http://www.baidu.com")
response = requests.head("http://www.baidu.com")
response = requests.options("http://www.baidu.com")

3、传递URL参数

如果需要在URL的查询字符串中传递数据,可以使用params参数来定义,params传递的参数可以 是字符串或字典。

import requests

response = requests.get("http://www.baidu.com", params="kw=python")
print(response.url) # http://www.baidu.com/?kw=python

params = {"k1": "v1", "k2": ["v2", "v3"]}
response = requests.get("http://www.baidu.com", params=params)
print(response.url) # http://www.baidu.com/?k1=v1&k2=v2&k2=v3

4、响应内容

请求方法的返回值response为 Response 对象,我们可以从这个对象中获取所有我们想要的响应 信息。

response.status_code     状态码
response.url             请求url
response.encoding        查看响应头部字符编码
response.headers         头信息
response.cookies         cookie信息
response.text            文本形式的响应内容
response.content         字节形式的响应内容
response.json()          JSON形式的响应内容

JSON响应内容

如果请求响应的内容为JSON格式的数据,则可以直接调用response.json()方法获取数据,因为 requests中内置了JSON解码器,帮助我们处理JSON数据。

response = requests.get("http://www.baidu.com")
json_data = response.json()

如果 JSON 解码失败,response.json() 就会抛出一个异常

5、定制请求头

如果需要为请求添加请求头数据,只需要传递一个字典类型的数据给 headers 参数就可以了。

headers = {"key": "value"}
response = requests.get("http://www.baidu.com", headers=headers)

6、Cookie

作用:区分同一请求客户端

获取响应信息中cookie数据:

response = requests.get("http://www.baidu.com")
print(response.cookies)

发送请求时添加cookie数据,可以使用 cookies 参数:

requests.get("http://www.baidu.com", cookies={"c1": "v1"})

原理:

7、Session

作用:session可以自动保存服务器产生的cookies信息,并且自动在下一条请求时附加。

在 requests 里,session对象是一个非常常用的对象,这个对象代表一次用户会话:从客户端浏览 器连接服务器开始,到客户端浏览器与服务器断开。

创建session对象

session = requests.Session()

得到session对象后,就可以调用该对象中的方法来发送请求

session.get()
session.post()
session.delete()
session.put()

集成UnitTest

将接口测试脚本集成到UnitTest单元测试框架中,利用UnitTest的功能来运行接口测试用例。

框架搭建:

import unittest
import requests


# 新建类 继承unittest.TestCase
class TPShopLogin(unittest.TestCase):
    # setUp
    def setUp(self):
        pass

    # tearDown
    def tearDown(self):
        pass

    # 测试方法
    def test(self):
        pass



if __name__ == '__main__':
    unittest.main()

案例分析:

需求:使用人力资源管理项目完成对登录功能的接口测试

网址:http://ihrm2-test.itheima.net

用例设计:

 代码实现:

# 导包 unittest_test requests
import unittest
import requests


# 新建类 继承unittest.TestCase
class TPShopLogin(unittest.TestCase):
    def setUp(self):
        # 获取session对象
        self.session = requests.session()
        # 登陆url
        self.url_login = "http://ihrm2-test.itheima.net/api/sys/login"

    def tearDown(self):
        # 关闭session
        self.session.close()

    # 测试方法 登陆成功
    def test_login_success(self):
        # 请求头
        headers = {"Content-Type": "application/json"}
        # 请求登陆(为了过审把password加了s)
        json_data = {"mobile": "13800000002", "passwords": "123456"}    
        r = self.session.post(self.url_login, json=json_data, headers=headers)
        # 断言判断是否登录成功
        try:
            self.assertEqual(r.json()["message"], "操作成功!")
        except AssertionError as e:
            print(e)

    # 测试方法,用户名错误
    def test_login_error_mobile_err(self):
        # 请求头
        headers = {"Content-Type": "application/json"}
        # 请求登陆(为了过审把password加了s)
        json_data = {"mobile": "", "passwords": "123456"}
        r = self.session.post(self.url_login, json=json_data, headers=headers)
        # 断言判断是否登录失败
        try:
            self.assertEqual(r.json()["message"], "用户名或密码错误")
        except AssertionError as e:
            print(e)

    # 测试方法,密码错误
    def test_login_error_password_err(self):
        # 请求头
        headers = {"Content-Type": "application/json"}
        # 请求登陆(为了过审把password加了s)
        json_data = {"mobile": "13800000002", "passwords": ""}
        r = self.session.post(self.url_login, json=json_data, headers=headers)
        # 断言判断是否登录失败
        try:
            self.assertEqual(r.json()["message"], "用户名或密码错误")
        except AssertionError as e:
            print(e)


if __name__ == '__main__':
    unittest.main()

猜你喜欢

转载自blog.csdn.net/ouihsiad/article/details/127664563