文章目录
- [2. 创建代码](#2. 创建代码)
-
- [2.5 配置登录测试用例](#2.5 配置登录测试用例)
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'])
运行:
