接口自动化测试
基于pytest和allure构建接口自动化测试框架构与项目。
框架目录结构
我们要构建一个自动化测试框架,就要以项目的概念来对项目中所有的代码文件进行划分目录和文件结构,不同的代码功能不一样,所以我们需要设计一个合理的目录结构,以方便与测试开发团队的其他人员进行测试功能的开发与测试,也方便将来的项目代码维护。
根目录/
 ├─ config.py    # 项目代码配置文件 ├─ pytest.ini # pytest模块配置文件 ├─ main.py # 主程序,执行入口 ├─ api/ # 封装被测试项目的api接口存放目录[用于mock测试、冒烟测试] ├─ data/ # 测试数据/测试用例的存放目录 ├─ results/ # 测试报告结果生成目录 ├─ reports/ # HTML测试报告生成目录 ├─ tests/ # 测试用例脚本存放目录 ├─ libs/ # 第三方工具类的存放目录[开源模块,不是当前项目封装的模块] └─ utils/ # 自定义工具类的存放目录[当前项目自己封装的模块] 配置文件,config.py,代码:
import pathlib # 路径操作模块,替代 os.path模块,os.path采用字符串来操作路径,pathlib采用面向对象来操作路径 # 项目目录的主目录路径[字符串路徑] BASE_DIR_STR = pathlib.Path(__file__).parent.resolve().as_posix() # 基本操作系统转换路径的分隔符 as_posix # 項目目录的主目录路径[路径对象] BASE_DIR = pathlib.Path(BASE_DIR_STR) # 项目名 WEB_NAME = "路飞自动化接口测试框架" # 测试自动化项目的运行端口与IP地址 HOST = "127.0.0.1" PORT = 8088 入口文件,main.py,代码:
import pytest import os import sys import config if __name__ == '__main__': os.system(f"rd /s /q results") os.system(f"rd /s /q reports") # 让python解释器,追加3个项目中的核心目录为导包路径 sys.path.insert(0, str(config.BASE_DIR / "api")) sys.path.insert(0, str(config.BASE_DIR / "tests")) sys.path.insert(0, str(config.BASE_DIR / "utils")) # 启动pytest框架 pytest.main() # 生成报告html文件 os.system('allure generate ./results -o ./reports') # 基于http协议打开HTML测试报告 os.system(f'allure open ./reports -h {config.HOST} -p {config.PORT}') 在根目录下创建pytest配置文件pytest.ini,内容如下:
[pytest] addopts =-s -v --alluredir=./results testpaths = ./ python_files = test_*.py python_classes = Test* python_functions = test_* OK,完成了上面操作以后,我们就可以写一个测试用例来测试下现在我们的基本框架是否能正常运行了。
tests/users/test_login.py,代码:
import allure import config @allure.epic(config.WEB_NAME) @allure.feature("用户模块") @allure.story("登录") class TestLogin(object):  @allure.severity(allure.severity_level.CRITICAL) def test_username_by_empty(self,): allure.dynamic.title("用户名为空,登陆失败") allure.dynamic.description("测试用户名为空的登陆结果") allure.attach('附件内容', '附件名字') def test_password_by_empty(self,): allure.dynamic.title("密码为空,登陆失败") allure.dynamic.description("测试密码为空的登陆结果") allure.attach('附件内容', '附件名字') 运行框架,效果:


当然自动化接口框架的构建开发过程肯定不是一夜之间就能完成的,所以我们需要长期构建,不断完善的准备。所以需要使用git代码版本管理工具把代码推送到git仓库中进行代码版本的管理(在企业中一般我们会使用公司内部构建的gitlab平台来管理内部项目,但现在我们处于学习阶段,所以可以先把代码提交到gitee码云上)。
代码托管
注意:公司内部的代码不要私自自己往gitee(码云),github去推。
gitee官网地址:https://gitee.com/
准备工作
需要提前在当前开发机子上安装git代码版本管理工具。
windows下载地址:https://git-scm.com/
创建仓库

我们是学习,所以我这创建项目库名luffytest。项目库名建议是英文的。

选择git-flow自定义分支模型。

所谓的分支,其实就是一个项目的代码的不同流程版本。

git-flow分支命名规范:
| 分支前缀 | 描述 | 
|---|---|
| master | 生产环境分支,将来可以部署到生产环境(公司的外网服务器)的代码 | 
| release | 预发布环境分支,将来可以部署到预发布环境的代码,也可以是rel | 
| develop | 开发环境分支,也可以是dev | 
| feature | 新功能,新增业务分支,也可以是feat | 
| hotfix | 修复bug问题、漏洞分支,也可以是fix | 
| test | 测试相关分支 | 
补充说明:
release/feature/xxx   # 表示待发布分支下的xxx业务功能相关代码 develop/feature/xxx # 表示开发分支下的xxx业务的新功能代码 develop/test/xxx # 表示开发分支下的正在测试的xxx业务功能的代码 develop/hotfix/xxx # 表示开发分支下的修复xxx业务相关功能的bug # 当然,分支名称并不是固定的,只要能让开发人员一目了然,名字都可以换,所以也可以这样: release/xxx # 表示待发布的xxx业务新功能代码 feature/xxx # 表示正在开发的xxx业务功能代码 test/xxx # 表示正在测试的xxx业务功能代码 hotfix/user # 表示正在修复bug的xxx业务功能的代码 创建私有空仓库以后的界面:

免密提交代码
接下来,我们可以使用ssh连接远程的git仓库,需要先在本地电脑下生成ssh秘钥对。
# 例如我的码云账号是 649641514@qq.com,那么该账号生成ssh秘钥对(基于rsa加密算法生成的秘钥对,公钥和私钥) ssh-keygen -t rsa -C "649641514@qq.com" 
复制终端下出现的公钥信息,复制到码云上面。
# 查看生成的秘钥对中的公钥(私钥id_rsa保存在自己电脑不要乱动,公钥id_rsa.pub需要复制文件内容到码云平台) cat C:\Users\Administrator/.ssh/id_rsa.pub # 把公钥进行复制到码云平台上 https://gitee.com/profile/sshkeys 
在浏览器打开https://gitee.com/profile/sshkeys,保存公钥。

切换项目的仓库地址,设置线上仓库
git config --global user.name "mooluo" git config --global user.email "649641514@qq.com" # 在项目根目录下初始化git仓库 cd luffytest/ # 具体的路径根据自己的设置而定 git init # git remote remove origin # 删除仓库地址,origin可以理解是一个变量,因为当前时一个新仓库,所以不需要执行这段。 git remote add origin git@gitee.com:mooluo_admin/luffytest.git # 新仓库地址,等同于origin= git..../luffycity.git 分支管理,git提交代码版本并同步到远程服务器。
git branch    # 查看分支 # 刚执行git init 初始化时,会没有分支,因此我们需要进行第一次的代码提交。 git add . git commit -m "feature: 项目初始化" # 经过上面的命令操作,本地的git就会自动生成一个master分支 # git branch <分支名称> # 新建分支 # git branch test # 例如:创建一个test分支 # git checkout <分支名称> # 切换分支 # git checkout test # 例如:切换到test分支,检出分支代码 # git branch -d <分支名称> # 删除分支 # git branch -d test # git push <远程仓库别名> --delete <分支名称> # 删除远程服务器分支 # git push origin --delete test # 例如:删除远程仓库origin中的test # 推送代码记录到远程服务器的代码仓库 git push origin master # 推送的过程中,如果本地有该分支,但是线上没有这个分支,则git会自动在远程中创建该分支,默认的空仓库是一个分支都没有的。 使用.gitignore可以在git上传或下载代码时,把一些不必要记录的垃圾文件/目录过滤掉。
注意:必须保证.git目录 和.gitignore在同一级目录下,才能生效。

.gitignore编写参考地址:https://github.com/github/gitignore
.gitignore文件内容:
# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ cover/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy

 









没有回复内容