前言
-
本章节以 用户注册->登录(注销)->用户中心的三个模块为例进行的单元测试
-
会用到很多 第二章节的知识,建议翻看了解第二章
-
有任何问题随时评论区提问
Django项目登录功能测试
Prepare-测试前的准备
一、基础资料/环境准备
- 接口文档->实际工作中,为了保证无效沟通,接口文档更新一定即时邮件传递!
- 测试服务器->数据库
- 测试用例编写->执行
- 生成测试报告->可以通过类似禅道的项目管理软件上报BUG以及测试报告
二、软件环境准备
-
测试的框架目录搭建
-
目的:方便管理、提升测试代码效率
-
目录结构说明
-
-
目录中文件代码准备
-
pytest.ini 配置文件修改
[pytest] # 1.给 pytest 传参数 三个插件的配置文件中写写法如下 # -s 输出测试用例中的print内容 # --html 插件 将测试结果输出为报告网页 # --rerun碰见测试报错重新测试几遍 addopts = -s --html=./a.html --reruns 3 # 2.指定 测试脚本的 路径 指定到scripts文件夹下 testpaths = ./scripts # 3.指定 测试文件的 名字 python_files = test_*.py # 4.指定 测试文件类的 名字 当前的目录下有指定名称文件才会执行 python_classes = Test* # 5.指定 测试文件函数的 名字 python_functions = test_*
-
base文件夹1 发送请求代码(因为我们每个单元测试都是要向后端发送请求)
import requests # get 请求方式 url必传项 params一般传递字典类似于向后端发送请求携带数据 def method_get(url, params=None, **kwargs): response = requests.get(url, params=params, **kwargs) return response # post请求方式 url必传项 data-表单数据 json-json格式数据 def method_post(url, data=None, json=None, **kwargs): response = requests.post(url, data=data, json=json, **kwargs) return response
-
base文件夹2 测试代码向后端发送请求携带数据 把数据统一存储到yaml文件中方便维护
# 文件读取涉及到文件路径问题 需要使用python自带的os模块进行文件路径的查找 # ======几个常用文件路径函数说明====== os.path.dirname() ../ 上级目录 os.path.abspath() 绝对路径 os.getcwd() ./ 获取当前目录(文件夹路径) os.sep === '/' 字符串/ 用于路径拼接 # =================================== import os import yaml class ReadData: def __init__(self, file_name): """ # =============方法1=============== # 1. 当前目录的绝对路径 的上级目录的上级目录 xxx/data/data.yaml print(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) # 2. 路径作为属性传递给 filepath self.filepath=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + '/data/' + file_name """ #===========方法2============ # 执行路径 在子目录中 # self.filepath = os.path.dirname(os.getcwd()) + os.sep + 'data' + os.sep + file_name # 执行路径 在测试文件根目录 self.filepath = os.getcwd() + os.sep + 'data' + os.sep + file_name print('当前文件夹路径:', os.getcwd()) def read_data(self): # 读的方式打开 f = open(self.filepath, 'r') # yaml自带load读取后转化为python中的dict形式 data = yaml.load(f, Loader=yaml.FullLoader) # 返回字典数据 return data
-
Register-注册单元测试
以下测试用例通用流程
- 测试需要的测试数据准备到yaml文件中(如用户名密码等)
- 测试用例中读取数据
- pytest.mark.parametrize(‘key’, [value]) 将测试数据传递到测试用例中
- 编写测试用例具体代码
- 执行测试函数
- 如需要数据库参与 开启mysql/redis等
RepeJudg-用户名+手机号重复判断
一、判断用户名是否重复
-
测试数据准备
# 1. 用户名是否重复 数据准备 url username 第1、4名字在数据库中存在 RepeJudg_username: url: "http://127.0.0.:8000/usernames/{username}/count/" usernames: ['python3', 'dreba', 'nazha', 'python3']
-
测试代码
from base.data_read import ReadData from base.response import method_get import pytest # ====测试数据读取函数==== def data_read(): # 1. 将yaml文件读取 data_dict = ReadData('data.yaml').read_data() # 2. 从字典中取数据 url usernames url = data_dict['RepeJudg_username']['url'] usernames = data_dict['RepeJudg_username']['usernames'] # 3. 返回数据 供测试用例调用 return url, usernames class Test_username(): # ===parametrize() 方式传递给测试用例参数=== # pytest.mark.parametrize('key', [value]) @pytest.mark.parametrize('url,usernames', [data_read()]) def test_username(self, url, usernames): while len(usernames) != 0: # 0.获取用户名 用pop删除并获取 name = usernames.pop() # 1.拼接完整的路由 username_count_url = url.format(username=name) print('\n', username_count_url) # 2.发送get请求 response = method_get(username_count_url) # 3.断言--可能访问失败 assert response.status_code == 200, '访问失败!' # print(username_count_url) # print(response.content.decode()) # 4. 根据对返回数据库username数量查询 count!=0重复 count=0不重复 count = response.json().get('count') if count == 1: print('{}重复了..'.format(name)) assert count == 1 else: print('{}不重复..'.format(name)) assert count == 0 # ============测试结果================ scripts/test_username.py http