python学习——接口测试框架

目录

  • 接口测试框架开发
  • 1.框架结构
  • 2.框架目录结构
  • 3.封装被测试系统接口
  • 4.定义接口测试用例
  • 5生成测试报告
    • 定义项目的配置信息
  • 6.DB数据
    • 初始化
    • 参数化
  • 7.封装断言

接口测试框架开发

1.框架结构

  • API封装被测系统的接口
  • TestCase 将一个或者多个接口封装成测试用例,并使用UnitTest管理测试用例
  • TestCase 可以调用数据库进行数据校验
  • 为了方便维护测试数据,可以把测试脚本和测试数据分离开
  • 通过UnitTest断言接口返回的数据,并生成测试报告

2.框架目录结构

  • apiTestFramework #项目名称

    • api #定义封装被测系统的接口
    • script #定义测试用例脚本
    • data #存放测试数据
    • report #存放生成的测试报告
    • lib #存放第三方的文件
    • app.py #定义项目的配置信息
    • utils.py #定义工具类
    • run_suite.py #执行测试套件的入口

3.封装被测试系统接口

  • 导包

  • 定义类

  • 创建URL(初始化方法

  • 测试接口的方法

    '''
    被测试系统的接口封装
    获取验证码http://localhost/index.php?m=Home&c=User&a=verify
    登录http://localhost/index.php?m=Home&c=User&a=do_login
    api目录下
    '''
    # 导包
    
    
    # 定义类
    class LoginApi:
        def __init__(self):
            # 设置URL
            self.url_verify = "http://localhost/index.php?m=Home&c=User&a=verify"
            self.url_login = "http://localhost/index.php?m=Home&c=User&a=do_login"
    
        # 获取验证码
        # 使用session 实例化session:不需要每一条单独设置cookies
        def get_verify_code(self, session):
            response = session.get(self.url_verify)
            return response
    
        # 登录
        def login_shop(self, session, username, password, verify_code):
            login_data = {
                "username": username,
                "password": password,
                "verify_code": verify_code
            }
            response = session.post(self.url_login, data=login_data)
            return response
    
    

    api内模块命名规则:

    ​ class XxxApi / def xxx_xxx_xxx…()

    script内模块命名规则:

    ​ class TestXxxxx(): / def test01_xxx_xxx…()

4.定义接口测试用例

  1. 导包
  2. 创建测试类
    1. 前置处理
      • 创建api对象
      • session实例化
    2. 后置处理
      • 关闭session
    3. 创建测试方法
'''
定义接口测试用例
使用unittest
1.导包
2.创建测试类
    2.1前置处理
    2.2后置处理
    2.3创建测试方法
script目录下
读取data内的文件信息
'''
import json
import unittest
import requests
from api.login import LoginApi
from parameterized import parameterized


# 导入包 parameterized
# 构造测试数据
def built_data():
    test_data = []
    file = "../data/login_data.json"
    with open(file, "r", encoding="utf-8") as f:
        # 把数据加入到json_data
        json_data = json.load(f)
        for case_data in json_data:
            username = case_data.get("username")
            password = case_data.get("password")
            verify_code = case_data.get("verify_code")
            content_type = case_data.get("content_type")
            status_code = case_data.get("status_code")
            status = case_data.get("status")
            msg = case_data.get("msg")
            test_data.append(username, password, verify_code, content_type, status_code, status, msg)
        return test_data


class TestLogin(unittest.TestCase):
    # 前置处理
    def setUp(self):
        self.login_api = LoginApi()
        self.session = requests.session()

    # 后置处理
    def tearDown(self):
        if self.session:
            self.session.close()

    @parameterized.expand(built_data())
    # 创建测试用例
    def test01_login(self,username, password, verify_code, content_type, status_code, status, msg):
        # 调用验证码接口获取验证,并且进行断言
        response = self.login_api.get_verify_code(self.session)
        self.assertEqual(status, response.status_code)
        self.assertIn(content_type, response.headers.get("Content-Type"))

        # 调用登录接口,获取登录信息,并进行断言
        response1 = self.login_api.login_shop(self.session, username ,password, verify_code)
        self.assertEqual(status_code, response1.status_code)
        self.assertEqual(status, response1.json().get("status"))
        self.assertIn(msg, response1.json().get("msg"))

5生成测试报告

'''
导包
封装测试套件
指定测试报告路径
文件流的形式打开文件
    创建HTMLTestRunner的运行器
    执行测试套件
 tun_suite.py 内
 文件生成在report内
'''
import time
import unittest
from lib.HTMLTestRunner import HTMLTestRunner
from script.test01_login import TestLogin

suite = unittest.TestSuite()
suite.addTest(unittest.makeSuite(TestLogin))

report = "report/report-{}.html".format(time.strftime("%Y%m%d"))
with open(report, "wb") as f:
    runner = HTMLTestRunner(stream=f, title="开发框架的TPShop测试报告")
    runner.run(suite)

定义项目的配置信息

app.py配置地址信息

# 当前文件的绝对路径os.path.abspath(__file__)
# 当前文件的目录os.path.dirname(os.path.abspath(__file__))
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
'''
使用App.BASE_DIR获取文件的绝对目录
'''

token/hearders 的信息存放(多个模块使用

6.DB数据

初始化

  • 导入DBUtil
  • 更改__get_conn内的数据库链接
  • 使用exe_sql()方法获取数据

参数化

  • 构造测试数据 导包
    • parameterized
    • DBUtil
  • 获取数据链接
  • 使用DBUtil 的。exe_sql方法获取数据
  • 将数据写入需要传递的参数内
  • 返回数据给测试用例

获取数据库内测试数据https://gitee.com/yiyinyan/TPShopApi/blob/master/scripts/testLogin.py

7.封装断言

可以放在util.py 内

def common_assert(case, response, status_code=200, success=True, code=10000, message="操作成功"):
    case.assertEqual(status_code, response.status_code)
    case.assertEqual(success, response.json().get("success"))
    case.assertEqual(code, response.json().get("code"))
    case.assertIn(message, response.json().get("message"))

你可能感兴趣的:(python)