Package: yamlpy
yamlpyyamlpy接口测试框架工程主页readthedocs：https://yamlpy-docs.readthedocs.io/zh_CN/latest/pypi：https://pypi.org/project/yamlpy/github：https://github.com/yjlch1016/yamlpyyamlpy即为yaml文件+pytest单元测试框架的缩写可看作是一个脚手架工具可快速生成项目的各个目录与文件支持MySQL、PgSQL与MongoDB等数据库的增删改查支持Jenkins、Docker等CI/CD工具支持飞书、钉钉、企业微信等机器人只需维护一份或者多份yaml（或者json）文件即可与yamlapi接口测试框架对比，整体结构仍然保持不变，yaml文件（或者json文件）格式仍然保持不变，可以通用，抛弃了python自带的unittest单元测试框架、ddt数据驱动第三方库、BeautifulReport测试报告第三方库，修改了测试类文件，传参方式由ddt的@ddt.ddt、@ddt.data()改为pytest的@pytest.mark.parametrize()，删掉了tool工具包里面的beautiful_report_run.py文件，其他文件保持不变。pip install yamlpy安装yamlpy -h（或yamlpy --help）查看参数信息yamlpy -v（或yamlpy --version）查看版本号pip install -U yamlpy安装最新版yamlpy create --p=项目名称创建项目例如在某个路径下执行命令：yamlpy create --p=demo_projectyamlpy run --c=环境缩写运行项目例如在项目的根目录下面执行命令：yamlpy run --c=testyamlpy clean清理测试报告与日志目录下的所有文件类似于mvn cleanpip uninstall yamlpy卸载一、思路1、采用requests+PyMySQL+DBUtils+psycopg2-binary+pymongo+influxdb+demjson+loguru+
PyYAML+ruamel.yaml+pytest+pytest-html+allure-pytest+pytest-reportlog+pytest-assume+pytest-rerunfailures+pytest-instafail+pytest-sugar+pytest-timeout+pytest-parallel+tablib2、requests是发起HTTP请求的第三方库3、PyMySQL是连接MySQL的第三方库4、DBUtils是数据库连接池的第三方库5、psycopg2-binary是连接PgSQL的第三方库6、pymongo是连接Mongo的第三方库7、influxdb是连接influxDB的第三方库8、demjson是解析非标格式json的第三方库9、loguru是记录日志的第三方库10、PyYAML与ruamel.yaml是读写yaml文件的第三方库11、pytest是单元测试的第三方库12、pytest-html是生成html测试报告的插件13、allure-pytest是生成allure测试报告的插件14、pytest-reportlog是替换--resultlog选项的插件15、pytest-assume是多重断言的插件16、pytest-rerunfailures是失败重跑的插件17、pytest-instafail是实时显示错误信息的插件18、pytest-sugar是显示进度的插件19、pytest-timeout是设置超时时间的插件20、pytest-parallel是多线程的插件21、tablib是导出多种格式数据的第三方库二、目录结构1、case是测试用例包2、report_log是测试报告和日志的目录3、resource是yaml（或者json文件）文件的目录4、setting是工程的配置文件包5、tool是常用方法的封装包6、.dockerignore是在传递给docker引擎时需要忽略掉的文件7、.gitignore是.ignore插件需要排除的文件8、conftest.py是全局钩子文件9、Dockerfile是构建镜像的文件10、Jenkinsfile是Jenkins Pipeline文件11、pytest.ini是pytest的配置文件12、requirements.txt是第三方依赖库三、yaml、json文件说明yaml文件-case_name:用例名称step:-step_name:步骤名称mysql:---pgsql:---mongo:---request_mode:POSTapi:/api/testfile:---body:{"key_1":"value_1","key_2":"value_2"}headers:{"Content-Type":"application/json"}query_string:{"key_3":"value_3","key_4":"value_4"}expected_time:3expected_code:200expected_result:{"code":1,"message":"成功"}regular:variable:-name_1-name_2expression:-'"response_1":"(.+?)"'-'"response_2":"(.+?)"'json文件[{"case_name":"用例名称","step":[{"step_name":"步骤名称","mysql":[],"pgsql":[],"mongo":[],"request_mode":"POST","api":"/api/test","file":[],"body":"{\"key_1\":\"value_1\",\"key_2\":\"value_2\"}","headers":"{'Content-Type': 'application/json'}","query_string":"{'key_3':'value_3','key_4':'value_4'}","expected_time":3,"expected_code":200,"expected_result":"{\"code\":1,\"message\":\"成功\"}","regular":{"variable":["name_1","name_2"],"expression":["\"response_1\":\"(.+?)\"","\"response_2\":\"(.+?)\""]}}]}]1、外层有2个字段，内层有16个字段命名和格式不可修改，顺序可以修改字段中文名称是否必填格式注解case_name用例名称是step步骤是-列表格式1条用例可以有1个或者N个步骤，全部的步骤通过，本条用例才算通过step_name步骤名称是mysqlMySQL语句否-列表格式顺序不可修改pgsqlPgSQL语句否-列表格式顺序不可修改mongoMongo语句否-列表格式顺序不可修改request_mode请求方式是api接口路径是file文件否-列表格式顺序不可修改body请求体否缩进字典格式或者json格式headers请求头否缩进字典格式或者json格式query_string请求参数否缩进字典格式或者json格式expected_time预期的响应时间否expected_code预期的响应代码是expected_result预期的响应结果是-列表格式、缩进字典格式或者json格式regular正则否缩进字典格式variable变量名否-列表格式expression表达式否-列表格式2、mysql字段说明mysql： MySQL语句，-列表格式，顺序不可修改，选填位置索引作用是否必填格式注解第一行mysql[0]增删改否字符串增、删、改语句第二行mysql[1]查否字符串查语句（动态传参）第三行mysql[2]查否字符串查语句（数据库双重断言）第一行：mysql[0]第二行：mysql[1]第三行：mysql[2]第一行为增、删、改语句，第二行为查语句（动态传参），第三行为查语句（数据库双重断言）第一行是发起请求之前的动作，没有返回结果第二行是发起请求之前的动作，有返回结果，是为了动态传参第三行是发起请求之后的动作，有返回结果，但是不可用于动态传参，是为了断言实际的响应结果当不需要增删改查和双重断言时，可以不写mysql字段，或者三行都为空当只需要增删改时，第一行为增删改语句，第二行为空，第三行为空当只需要查时，第一行为空，第二行为查语句，第三行为空当只需要双重断言时，第一行为空，第二行为空，第三行为查语句3、pgsql字段说明pgsql： PgSQL语句，-列表格式，顺序不可修改，选填位置索引作用是否必填格式注解第一行pgsql[0]增删改否字符串增、删、改语句第二行pgsql[1]查否字符串查语句（动态传参）第三行pgsql[2]查否字符串查语句（数据库双重断言）第一行：pgsql[0]第二行：pgsql[1]第三行：pgsql[2]第一行为增、删、改语句，第二行为查语句（动态传参），第三行为查语句（数据库双重断言）第一行是发起请求之前的动作，没有返回结果第二行是发起请求之前的动作，有返回结果，是为了动态传参第三行是发起请求之后的动作，有返回结果，但是不可用于动态传参，是为了断言实际的响应结果当不需要增删改查和双重断言时，可以不写pgsql字段，或者三行都为空当只需要增删改时，第一行为增删改语句，第二行为空，第三行为空当只需要查时，第一行为空，第二行为查语句，第三行为空当只需要双重断言时，第一行为空，第二行为空，第三行为查语句4、mongo字段说明（参考mysql字段）mongo： Mongo语句，-列表格式，顺序不可修改，选填位置索引作用是否必填格式注解第一行mongo[0]增删改否-列表格式第一个元素为集合名，第二个元素为增删改，第三个元素为增删改参数第二行mongo[1]查否-列表格式第一个元素为集合名，第二个元素为查参数第三行mongo[2]查否-列表格式第一个元素为集合名，第二个元素为查参数第一行：mongo[0]第二行：mongo[1]第三行：mongo[2]第一行为增、删、改，第二行为查（动态传参），第三行为查（数据库双重断言）第一行是发起请求之前的动作，没有返回结果第二行是发起请求之前的动作，有返回结果，是为了动态传参第三行是发起请求之后的动作，有返回结果，但是不可用于动态传参，是为了断言实际的响应结果当不需要增删改查和双重断言时，可以不写mongo字段，或者三行都为空当只需要增删改时，第一行为增、删、改，第二行为空，第三行为空当只需要查时，第一行为空，第二行为查，第三行为空当只需要双重断言时，第一行为空，第二行为空，第三行为查5、file字段说明file： 文件参数，-列表格式，顺序不可修改，选填位置类型是否必填格式注解第一行文件类型否字符串例如：file第二行文件名称否字符串例如：demo_excel.xlsx第三行MIME类型否字符串例如：application/octet-stream6、函数助手函数名称写法作用域数量限制正则表达式提取的结果${变量名}全局不限MySQL查询语句返回的结果{__SQL索引}本条用例不限PgSQL查询语句返回的结果{__PGSQL索引}本条用例不限Mongo查询语句返回的结果{__MONGO索引}本条用例不限随机数字{__RN位数}本条用例不限随机英文字母{__RL位数}本条用例不限随机手机号码{__MP}本条用例不限随机日期时间字符串{__RD开始年份,结束年份}本条用例不限正则表达式提取的结果用${变量名}匹配，一条用例里面可以有多个MySQL查询语句返回的结果，即第二行mysql[1]返回的结果，用{__SQL索引}匹配即{__SQL0}、{__SQL1}、{__SQL2}、{__SQL3}。。。。。。一条用例里面可以有多个PgSQL查询语句返回的结果，即第二行pgsql[1]返回的结果，用{__PGSQL索引}匹配即{__PGSQL0}、{__PGSQL1}、{__PGSQL2}、{__PGSQL3}。。。。。。一条用例里面可以有多个Mongo查询语句返回的结果，即第二行mongo[1]返回的结果，用{__MONGO索引}匹配即{__MONGO0}、{__MONGO1}、{__MONGO2}、{__MONGO3}。。。。。。一条用例里面可以有多个随机数字用{__RN位数}，如{__RN15}，一条用例里面可以有多个随机英文字母用{__RL位数}，如{__RL10}，一条用例里面可以有多个随机手机号码用{__MP}，一条用例里面可以有多个随机日期时间字符串用{__RD开始年份,结束年份}，如{__RD2019,2020}，一条用例里面可以有多个以上8种类型在一条用例里面可以混合使用${变量名}的作用域是全局的，其它7种的作用域仅限该条用例四、运行1、pytest模式：pytest+--cmd=环境缩写pytest --cmd=dev开发环境pytest --cmd=test测试环境pytest --cmd=pre预生产环境pytest --cmd=formal生产环境2、yamlpy模式：yamlpy+run+--c=环境缩写yamlpy run --c=dev开发环境yamlpy run --c=test测试环境yamlpy run --c=pre预生产环境yamlpy run --c=formal生产环境3、运行结果：会在report_log目录下生成以下文件allure-reportlog年月日.logreport.htmlreport.xmltest_case.csvtest_case.htmltest_case.jsontest_case.xlsxtest_case.yaml五、打包镜像，运行容器docker pull registry.cn-hangzhou.aliyuncs.com/yangjianliang/yamlapi:0.0.8从阿里云镜像仓库拉取yamlapi镜像docker build -t demo_image .docker build -t 镜像名称 .本地打包，demo_image为镜像名称，随便取docker run -e cmd="环境缩写" 镜像名称:latestdocker run -e cmd="dev" demo_image:latest开发环境docker run -e cmd="test" demo_image:latest测试环境docker run -e cmd="pre" demo_image:latest预生产环境docker run -e cmd="formal" demo_image:latest生产环境