【接口自动化测试项目】3.配置登录测试用例

文章目录


2. 创建代码

2.5 配置登录测试用例

请求方法文件:request_util.py

python 复制代码
import requests

from utils.logger_util import logger

host = "http://111.228.59.53:9090/"


class Request:
    log = logger.getlog()

    def get(self, url, **kwargs):
        self.log.info("准备发起get请求,url:"+url)
        self.log.info(f"接口信息:{kwargs}")

        r = requests.get(url=url,**kwargs)

        self.log.info(f"接口响应状态码:{r.status_code}")
        self.log.info(f"接口响应内容:{r.json()}")

        return r

    def post(self, url, **kwargs):
        self.log.info("准备发起post请求,url:"+url)
        self.log.info(f"接口信息:{kwargs}")

        r = requests.post(url=url,**kwargs)

        self.log.info(f"接口响应状态码:{r.status_code}")
        self.log.info(f"接口响应内容:{r.json()}")

        return r

日志文件配置:logger_util.py

python 复制代码
import logging
import os
import sys
import time

# 过滤INFO级别日志
class infoFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.INFO

# 过滤ERROR级别日志
class errFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR

class logger:
    # 获取日志对象---定义类方法@classmethod,类方法和普通方法有区别
    # 普通方法 绑定到实例(能读/写实例属性)。
    # 类方法 绑定到类(能读/写类属性,不能操作实例属性)。
    @classmethod
    def getlog(cls):
        # 创建日志对象
        cls.logger = logging.getLogger(__name__)
        cls.logger.setLevel(logging.DEBUG)

        # 保证logs文件夹必须创建好了
        LOG_PATH = "./logs/"
        if not os.path.exists(LOG_PATH):
            os.mkdir(LOG_PATH)

        # 将日志输出到日志文件中
        '''
        logs
            ./logs/2026-1-1.log
            ./logs/2026-1-1-info.log
            ./logs/2026-1-1-err.log
        '''
        now = time.strftime("%Y-%m-%d")
        log_name = LOG_PATH + now + ".log"
        info_log_name = LOG_PATH + now + "-info.log"
        err_log_name = LOG_PATH + now + "-err.log"

        # 创建文件处理器
        all_handler = logging.FileHandler(log_name, encoding="utf-8")
        info_handler = logging.FileHandler(info_log_name, encoding="utf-8")
        err_handler = logging.FileHandler(err_log_name, encoding="utf-8")

        # 创建流处理器,将日志输出到控制台
        streamHandle = logging.StreamHandler()

        # 设置日志格式
        formatter = logging.Formatter(
            "%(asctime)s %(levelname)s [%(name)s] [%(filename)s (%(funcName)s:%(lineno)d)] - %(message)s"
        )

        # 设置格式
        all_handler.setFormatter(formatter)
        info_handler.setFormatter(formatter)
        err_handler.setFormatter(formatter)
        streamHandle.setFormatter(formatter)

        # 添加过滤器
        info_handler.addFilter(infoFilter())
        err_handler.addFilter(errFilter())

        # 把三个处理器加到logger对象里面
        cls.logger.addHandler(all_handler)
        cls.logger.addHandler(info_handler)
        cls.logger.addHandler(err_handler)
        cls.logger.addHandler(streamHandle)

        return cls.logger

登录博客的测试⽤例:test_login.py

异常登录在正常登录前是为了防止已经正常登录后,正常登录的用户态会被异常登录重置,这个是有可能的(某些系统会这样)

python 复制代码
'''
# 针对登录接口设计测试用例
url = "http://111.228.59.53:9090/user/login" POST
form-data = {"username":"zhangsan","password":"123456"}
'''
import re

import pytest
from jsonschema.validators import validate

from utils.request_util import host, Request


class TestLogin:
    url = host + "user/login"
    schema = {
        "type": "object",
        "required": ["code", "errMsg", "data"],
        "additionalProperties": False,
        "properties": {
            "code": {
                "type": "string"
            },
            "errMsg": {
                "type": "string"
            },
            "data": {
                "type": ["string", "null"]
            }
        }
    }

    # 异常登录
    @pytest.mark.parametrize("login", [
        # 错误的账号和密码
        {
            "username": "zhang",
            "password": "123",
            "errMsg": "用户不存在"
        },
        # 错误的账号正确的密码
        {
            "username": "lisi1",
            "password": "123456",
            "errMsg": "用户不存在"
        },
        # 正确的账号错误的密码
        {
            "username": "lisi",
            "password": "123",
            "errMsg": "密码错误"
        },
        # 不存在的账号
        {
            "username": "bite",
            "password": "xxx",
            "errMsg": "用户不存在"
        },
        # 账号和密码都为空
        {
            "username": "",
            "password": "",
            "errMsg": "账号或密码不能为空"
        },
        # 过长的账号
        {
            "username": "很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号很长的账号",
            "password": "123456",
            "errMsg": "用户不存在"
        },
        # 过长的密码
        {
            "username": "zhangsan",
            "password": "123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456123456",
            "errMsg": "密码错误"
        }
    ])
    def test_login_fail(self, login):
        data = {
            "username": login["username"],
            "password": login["password"]
        }
        r = Request().post(url=self.url, data=data)

        validate(instance=r.json(), schema=self.schema)

        assert r.json()["code"] == "FAIL"

        assert r.json()['errMsg'] == login["errMsg"]

    # 正常登录
    @pytest.mark.parametrize("login",[
        {
            "username":"zhangsan",
            "password":"123456"
        },
        {
            "username": "lisi",
            "password": "123456"
        }
    ])
    def test_login_success(self, login):
        data = {
            "username":login["username"],
            "password":login["password"]
        }
        r = Request().post(url = self.url, data=data)

        validate(instance=r.json(),schema=self.schema)

        assert r.json()["code"] == "SUCCESS"
        # 添加正则表达式的校验
        assert re.match(r'\S{100,}', r.json()['data'])

运行:

相关推荐
测试者家园3 小时前
测试用例智能生成:是效率革命,还是“垃圾进,垃圾出”的新挑战?
人工智能·职场和发展·测试用例·测试策略·质量效能·智能化测试·用例设计
程序员小远4 小时前
使用Postman进行一次完整的接口测试
自动化测试·软件测试·python·测试工具·测试用例·接口测试·postman
卓码软件测评1 天前
第三方软件课题验收测试【使用Docker容器部署LoadRunner负载生成器以实现弹性压测 】
测试工具·docker·容器·性能优化·单元测试·测试用例
耿小洋1 天前
如何借助AI完成测试用例的生成?实测高效落地指南
人工智能·测试用例
程序员三藏2 天前
selenium测试框架快速搭建
自动化测试·软件测试·python·selenium·测试工具·职场和发展·测试用例
卓码软件测评2 天前
第三方移动应用测试机构:【移动应用性能测试:使用LoadRunner的Mobile Application - HTTP/HTML协议】
测试工具·ci/cd·性能优化·单元测试·测试用例
程序员杰哥2 天前
如何写出高效的测试用例?
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
月明长歌2 天前
性能测试概念篇:从“能用”到“抗打”,把指标、拐点与测试类型一次讲透
软件测试·测试开发·测试用例
程序员三藏2 天前
自动化测试步骤详解
自动化测试·软件测试·python·测试工具·程序人生·职场和发展·测试用例