接⼝对象封装的思想及实现

解决的问题

  • 代码冗余度⾼(有⼤量重复代码)
  • 代码耦合度⾼
  • 代码维护成本⾼

核⼼思想:代码分层

图片[1] - 接⼝对象封装的思想及实现 - 三酷猫
  • 分层思想:
    • 将 普通⽅法实现的 ,分为 接⼝对象层 和 测试脚本层。
  • 接⼝对象层:
    • 对 接⼝ 进⾏封装。封装好之后,给 测试⽤例层 调⽤!
    • ⾯向对象 类 封装 实现。
  • 测试⽤例层:
    • 调⽤ 接⼝对象层 封装的⽅法,拿到 响应结果,断⾔进⾏接⼝测试!
    • 借助 unittest 框架实现

案例

Tpshop商城登录接口测试

1.普通⽅式实现

import unittest
import requests


class TestTpshopLogin(unittest.TestCase):
    # 测试 登录成功
    def test01_login_ok(self):
        # 创建 session 实例
        session = requests.Session()

        # 使用实例,调用get 发送获取验证码请求
        session.get(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify&r=0.21519623710645064")

        # 使用实例,调用post 发送登录请求
        resp = session.post(
            url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login&t=0.7094195931397276",
            data={"username": "13012345678", "password": "123456", "verify_code": "8888"})

        print("响应结果 =", resp.json())

        # 断言:
        self.assertEqual(200, resp.status_code)
        self.assertEqual(1, resp.json().get("status"))
        self.assertEqual("登陆成功", resp.json().get("msg"))

    # 测试 手机号不存在
    def test02_tel_not_exists(self):
        # 创建 session 实例
        session = requests.Session()

        # 使用实例,调用get 发送获取验证码请求
        session.get(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify&r=0.21519623710645064")

        # 使用实例,调用post 发送登录请求
        resp = session.post(
            url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login&t=0.7094195931397276",
            data={"username": "13847834701", "password": "123456", "verify_code": "8888"})


        print("响应结果 =", resp.json())

        # 断言:
        self.assertEqual(200, resp.status_code)
        self.assertEqual(-1, resp.json().get("status"))
        self.assertEqual("账号不存在!", resp.json().get("msg"))

    # 测试 密码错误
    def test03_pwd_err(self):
        # 创建 session 实例
        session = requests.Session()

        # 使用实例,调用get 发送获取验证码请求
        session.get(url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=verify&r=0.21519623710645064")

        # 使用实例,调用post 发送登录请求
        resp = session.post(
            url="http://tpshop-test.itheima.net/index.php?m=Home&c=User&a=do_login&t=0.7094195931397276",
            data={"username": "13012345678", "password": "123456890", "verify_code": "8888"})

        print("响应结果 =", resp.json())

        # 断言:
        self.assertEqual(200, resp.status_code)
        self.assertEqual(-2, resp.json().get("status"))
        self.assertEqual("密码错误!", resp.json().get("msg"))

2.登录接⼝封装

封装思想:

  • 将动态变化的数据,设计到⽅法的参数。
  • 将固定不变的,直接写成⽅法实现。
  • 将响应结果,通过返回值传出。

分析:

图片[2] - 接⼝对象封装的思想及实现 - 三酷猫

封装实现:

图片[3] - 接⼝对象封装的思想及实现 - 三酷猫

3.登录测试⽤例封装(断言)

登录接口优化后:

图片[4] - 接⼝对象封装的思想及实现 - 三酷猫

可以看到:对于断言,也有很多重复的,同时这里的测试数据abc也可以使用数据代码分离的方式,写到专门的json文件中去。

图片[5] - 接⼝对象封装的思想及实现 - 三酷猫

4.参数化

经过接口封装、和断言封装后。代码如下:

图片[6] - 接⼝对象封装的思想及实现 - 三酷猫

可以看出:三个测试用例,结构都是相同的,只是传入的参数不同。因此可以考虑使用参数化

提取每个测试⽤例 使⽤的 测试数据 和 断⾔数据。

图片[7] - 接⼝对象封装的思想及实现 - 三酷猫

封装函数,将 数据 转换为 元组列表。

图片[8] - 接⼝对象封装的思想及实现 - 三酷猫

5.最终优化的代码:

图片[9] - 接⼝对象封装的思想及实现 - 三酷猫
© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享