forked from DxvLwRYF/apiAutoTest
1 line
76 KiB
JSON
Executable File
1 line
76 KiB
JSON
Executable File
{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Python >= 3.8 HTTP/HTTPS\u63a5\u53e3\u81ea\u52a8\u5316\u6d4b\u8bd5\u5de5\u5177\uff0c\u91c7\u7528Excel\u6765\u7ba1\u7406\u7528\u4f8b,\u586b\u8868\u683c\u5373\u53ef\u5b8c\u6210\u63a5\u53e3\u6d4b\u8bd5. \u529f\u80fd\u70b9 \u00b6 \u6d4b\u8bd5\u524d\u540e\u6570\u636e\u6e05\u6d17\u64cd\u4f5c \u4e1a\u52a1\u63a5\u53e3\u4e4b\u95f4\u7684\u6570\u636e\u4f9d\u8d56\u5904\u7406 \u7528\u4f8b\u4e2d\u81ea\u5b9a\u4e49\u51fd\u6570\u5b9a\u4e49\u53ca\u4f7f\u7528, \u5e94\u5bf9\u590d\u6742\u7684\u52a8\u6001\u53c2\u6570 \u652f\u6301\u540e\u7f6eSQL\u64cd\u4f5c(\u53ef\u591a\u6761), \u5e76\u5c06\u7ed3\u679c\u4f5c\u7528\u4e0e\u540e\u7eed\u7528\u4f8b\u4e2d \u652f\u6301\u52a8\u6001\u591a\u6570\u636e\u65ad\u8a00\u65b9\u5f0f \u652f\u6301\u6d4b\u8bd5\u62a5\u544a\u538b\u7f29,\u90ae\u4ef6\u53d1\u9001 \u53ef\u9009\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u673a\u5236 \u63a5\u53e3\u5f55\u5236,\u63d0\u5347\u7528\u4f8b\u5199\u4f5c\u6548\u7387 \u8d44\u6e90\u83b7\u53d6 \u00b6 B\u7ad9\u89c6\u9891\u89e3\u6790 master \u5206\u652f \u5f53\u4e0b\u6700\u65b0\u7248\u672c\u4ee3\u7801\u7684\u89e3\u6790\u89c6\u9891 version1.0 \u5206\u652f 2020\u5e748\u6708 \u6700\u521d\u7248\u672c\u7684\u89e3\u6790\u89c6\u9891 \u6e90\u7801\u83b7\u53d6 Gitee \u4ee3\u7801\u6700\u65b0 GitHub \u62a5\u544a\u5c55\u793a \u00b6","title":"\u4ecb\u7ecd"},{"location":"#_1","text":"\u6d4b\u8bd5\u524d\u540e\u6570\u636e\u6e05\u6d17\u64cd\u4f5c \u4e1a\u52a1\u63a5\u53e3\u4e4b\u95f4\u7684\u6570\u636e\u4f9d\u8d56\u5904\u7406 \u7528\u4f8b\u4e2d\u81ea\u5b9a\u4e49\u51fd\u6570\u5b9a\u4e49\u53ca\u4f7f\u7528, \u5e94\u5bf9\u590d\u6742\u7684\u52a8\u6001\u53c2\u6570 \u652f\u6301\u540e\u7f6eSQL\u64cd\u4f5c(\u53ef\u591a\u6761), \u5e76\u5c06\u7ed3\u679c\u4f5c\u7528\u4e0e\u540e\u7eed\u7528\u4f8b\u4e2d \u652f\u6301\u52a8\u6001\u591a\u6570\u636e\u65ad\u8a00\u65b9\u5f0f \u652f\u6301\u6d4b\u8bd5\u62a5\u544a\u538b\u7f29,\u90ae\u4ef6\u53d1\u9001 \u53ef\u9009\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u673a\u5236 \u63a5\u53e3\u5f55\u5236,\u63d0\u5347\u7528\u4f8b\u5199\u4f5c\u6548\u7387","title":"\u529f\u80fd\u70b9"},{"location":"#_2","text":"B\u7ad9\u89c6\u9891\u89e3\u6790 master \u5206\u652f \u5f53\u4e0b\u6700\u65b0\u7248\u672c\u4ee3\u7801\u7684\u89e3\u6790\u89c6\u9891 version1.0 \u5206\u652f 2020\u5e748\u6708 \u6700\u521d\u7248\u672c\u7684\u89e3\u6790\u89c6\u9891 \u6e90\u7801\u83b7\u53d6 Gitee \u4ee3\u7801\u6700\u65b0 GitHub","title":"\u8d44\u6e90\u83b7\u53d6"},{"location":"#_3","text":"","title":"\u62a5\u544a\u5c55\u793a"},{"location":"about/","text":"\u672c\u9879\u76ee\u8d44\u6e90 \u00b6 B\u7ad9\u89c6\u9891\u89e3\u6790 master \u5206\u652f \u5f53\u4e0b\u6700\u65b0\u7248\u672c\u4ee3\u7801\u7684\u89e3\u6790\u89c6\u9891 version1.0 \u5206\u652f 2020\u5e748\u6708 \u6700\u521d\u7248\u672c\u7684\u89e3\u6790\u89c6\u9891 \u6e90\u7801\u83b7\u53d6 Gitee \u4ee3\u7801\u6700\u65b0 GitHub \u524d\u7f6e\u73af\u5883 jdk \u94fe\u63a5\uff1a https://pan.baidu.com/s/1q9TIbHoOKIvoZMv1m7WA-g \u63d0\u53d6\u7801\uff1a2fbs allure \u94fe\u63a5\uff1a https://pan.baidu.com/s/1Tut7BDsusgChhA41ZSkrkg \u63d0\u53d6\u7801\uff1atlei \u8054\u7cfb \u6d4b\u8bd5\u4ea4\u6d41QQ\u7fa4: 930902996 \u535a\u5ba2\u56ed\uff1a https://cnblogs.com/zy7y B\u7ad9\uff1a https://space.bilibili.com/438858333 \u5176\u4ed6\u9879\u76ee \u00b6 watch-fastapi\uff08\u524d\u540e\u7aef\u5206\u79bb\uff09 FastAPI + Vue3 + ElementPlus + Vite2 + Vue-Router + Vuex \u7ffb\u6284\u7684 HelloFlask \u4e00\u4e66\u4e2d\u7684\u5b9e\u6218\u9879\u76ee \u914d\u5957\u8d44\u6e90 Gtihub | Gitee | B\u7ad9\u6559\u7a0b","title":"\u5173\u4e8e"},{"location":"about/#_1","text":"B\u7ad9\u89c6\u9891\u89e3\u6790 master \u5206\u652f \u5f53\u4e0b\u6700\u65b0\u7248\u672c\u4ee3\u7801\u7684\u89e3\u6790\u89c6\u9891 version1.0 \u5206\u652f 2020\u5e748\u6708 \u6700\u521d\u7248\u672c\u7684\u89e3\u6790\u89c6\u9891 \u6e90\u7801\u83b7\u53d6 Gitee \u4ee3\u7801\u6700\u65b0 GitHub \u524d\u7f6e\u73af\u5883 jdk \u94fe\u63a5\uff1a https://pan.baidu.com/s/1q9TIbHoOKIvoZMv1m7WA-g \u63d0\u53d6\u7801\uff1a2fbs allure \u94fe\u63a5\uff1a https://pan.baidu.com/s/1Tut7BDsusgChhA41ZSkrkg \u63d0\u53d6\u7801\uff1atlei \u8054\u7cfb \u6d4b\u8bd5\u4ea4\u6d41QQ\u7fa4: 930902996 \u535a\u5ba2\u56ed\uff1a https://cnblogs.com/zy7y B\u7ad9\uff1a https://space.bilibili.com/438858333","title":"\u672c\u9879\u76ee\u8d44\u6e90"},{"location":"about/#_2","text":"watch-fastapi\uff08\u524d\u540e\u7aef\u5206\u79bb\uff09 FastAPI + Vue3 + ElementPlus + Vite2 + Vue-Router + Vuex \u7ffb\u6284\u7684 HelloFlask \u4e00\u4e66\u4e2d\u7684\u5b9e\u6218\u9879\u76ee \u914d\u5957\u8d44\u6e90 Gtihub | Gitee | B\u7ad9\u6559\u7a0b","title":"\u5176\u4ed6\u9879\u76ee"},{"location":"change/","text":"2021/05/19 apiAutoTest\u5728\u7ebf\u6587\u6863\u53d1\u5e03 2021/05/20 \u7edf\u4e00\u53c2\u6570\u6c60&\u53d8\u91cf\u6c60 \u4e3a \u53c2\u6570\u53d8\u91cf\u6c60 2021/05/22 \u589e\u52a0\u63a5\u53e3\u5f55\u5236\u4f7f\u7528 2021/11/13 \u6700\u7ec8\u4fee\u8ba2","title":"\u66f4\u65b0\u65e5\u5fd7"},{"location":"license/","text":"MIT License Copyright (c) 2020 zy7y Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.","title":"\u5f00\u6e90\u534f\u8bae"},{"location":"apiAutoTest/config/","text":"\u793a\u4f8b \u00b6 # config.yaml server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea dev : http://www.ysqorz.top:8888/api/private/v1/ # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 # \u76f8\u5bf9\u4e8erun.py file_path : # \u7528\u4f8b\u6570\u636e\u8def\u5f84 test_case : data/case_data.xls # \u62a5\u544a\u751f\u6210\u8def\u5f84 report : report/ # \u65e5\u5fd7\u6587\u4ef6\u8def\u5f84 log : log/run{time}.log email : # \u53d1\u4ef6\u4eba\u90ae\u7bb1 user : 123456.com # \u53d1\u4ef6\u4eba\u90ae\u7bb1\u6388\u6743\u7801 password : ASGCSFSGS # \u90ae\u7bb1host host : smtp.163.com contents : \u89e3\u538bapiAutoReport.zip(\u63a5\u53e3\u6d4b\u8bd5\u62a5\u544a)\u540e\uff0c\u8bf7\u4f7f\u7528\u5df2\u5b89\u88c5Live Server \u63d2\u4ef6\u7684VsCode\uff0c\u6253\u5f00\u89e3\u538b\u76ee\u5f55\u4e0b\u7684index.html\u67e5\u770b\u62a5\u544a # \u6536\u4ef6\u4eba\u90ae\u7bb1 addressees : [ \"\u6536\u4ef6\u4eba\u90ae\u7bb11\" , \"\u6536\u4ef6\u4eba\u90ae\u7bb12\" ] title : \u63a5\u53e3\u81ea\u52a8\u5316\u6d4b\u8bd5\u62a5\u544a(\u89c1\u9644\u4ef6) # \u9644\u4ef6 enclosures : report.zip # \u6570\u636e\u5e93\u6821\u9a8c- mysql database : # \u6570\u636e\u5e93\u5730\u5740 host : localhost # \u6570\u636e\u5e93\u7aef\u53e3 port : 3306 # \u6570\u636e\u5e93\u7528\u6237\u540d user : root # \u4e0d\u7528''\u4f1a\u88ab\u89e3\u6790\u6210int\u7c7b\u578b\u6570\u636e\uff0c \u6570\u636e\u5e93\u5bc6\u7801 password : '123456' # \u6570\u636e\u5e93\u540d\u79f0 db_name : apiautotest # \u6570\u636e\u5e93\u7f16\u7801 charset : utf8mb4 # \u6570\u636e\u5e93\u6240\u5728\u7684\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u7528\u4e8e\u5907\u4efd/\u8fd8\u539f\u6570\u636e\u6587\u4ef6\uff0c\u8fbe\u5230\u6570\u636e\u6e05\u6d17 ssh_server : port : 22 username : root password : '123456' # \u79c1\u6709\u5bc6\u94a5\u6587\u4ef6\u8def\u5f84 private_key_file : # \u79c1\u94a5\u5bc6\u7801 privat_passowrd : # \u5982\u679c\u4f7f\u7528\u7684docker\u5bb9\u5668\u90e8\u7f72mysql\u670d\u52a1\uff0c\u9700\u8981\u4f20\u5165mysql\u7684\u5bb9\u5668id/name mysql_container : mysql8 # \u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6\u5bfc\u51fa\u7684\u672c\u5730\u8def\u5f84, \u9700\u8981\u4fdd\u8bc1\u5b58\u5728\u8be5\u6587\u4ef6\u5939 sql_data_file : backup_sqls/ server \u00b6 \u6700\u7ec8\u8bf7\u6c42\u5730\u5740 = \u57fa\u51c6\u5730\u5740 + \u7528\u4f8b\u63a5\u53e3\u5730\u5740 \u670d\u52a1\u7684\u57fa\u51c6\u5730\u5740(\u4e2a\u4eba\u7406\u89e3\u591a\u4e2a\u63a5\u53e3\u90fd\u6709\u7684\u5171\u540c\u90e8\u5206\u5185\u5bb9)\uff0c\u9ed8\u8ba4\u4f7f\u7528\u7684\u662f dev \u4fee\u6539\u73af\u5883 \u00b6 test/test_api.py \u4f20\u5165\u5173\u952e\u8bcd\u53c2\u6570 env=\u73af\u5883\u540d` ... # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases , env = 'test' ) ... request_headers \u00b6 \u6700\u7ec8\u8bf7\u6c42\u5934 = \u57fa\u51c6\u8bf7\u6c42\u5934 + \u7528\u4f8b\u4e2d\u7684\u8bf7\u6c42\u5934 \u57fa\u51c6\u8bf7\u6c42\u5934\uff0c\u5373\u4e3a\u9ed8\u8ba4\u6240\u6709\u63a5\u53e3\u90fd\u4f1a\u4f7f\u7528\u7684\u57fa\u7840\u8bf7\u6c42\u5934\u6570\u636e file_path \u00b6 \u6307\u5b9a\u7528\u4f8b\u6587\u4ef6\u5730\u5740\uff0c\u62a5\u544a\u751f\u6210\u5730\u5740\uff0clog\u4fdd\u5b58\u5730\u5740\uff0c\u6b64\u5904\u8def\u5f84\u9700\u8981\u76f8\u5bf9 run.py \u7684\u5730\u5740 email \u00b6 \u5982\u4f7f\u7528Jenkins\u96c6\u6210\u53ef\u5ffd\u7565 \u9700\u4fee\u6539 run.py \u4e0b\u5904\u4f4d\u7f6e(\u89e3\u9664\u6ce8\u91ca\u5373\u53ef) def run (): ... # \u53d1\u9001\u90ae\u4ef6\u5e26\u9644\u4ef6\u62a5\u544a EmailServe . send_email ( email , file_path [ 'report' ]) # \u5220\u9664\u672c\u5730\u9644\u4ef6 os . remove ( email [ 'enclosures' ]) if __name__ == '__main__' : run () database \u00b6 \u53ea\u652f\u6301mysql\u6570\u636e\u5e93 \u4e0d\u4f7f\u7528\u8be5\u529f\u80fd test/test_api.py \u4e2d test_main \u65b9\u6cd5, \u5982\u4e0b\u4fee\u6539 def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) ssh_server \u00b6 \u6570\u636e\u5e93\u5907\u4efd\uff0c\u8fd8\u539f \u7528\u4e8e\u8fde\u63a5\u6570\u636e\u5e93\u7684\u670d\u52a1\u5668\u8fdb\u884c\u5907\u4efd&\u8fd8\u539f\u64cd\u4f5c,\u5982\u4e0d\u9700\u8981\uff0c\u5c06 test/conftest.py \u4e2d\u7684 get_db \u65b9\u6cd5\uff0c\u5982\u4e0b\u4fee\u6539 @pytest . fixture ( scope = \"session\" ) def get_db (): \"\"\"\u5173\u4e8e\u5176\u4f5c\u7528\u57df\u8bf7\u79fb\u6b65\u67e5\u770b\u5b98\u65b9\u6587\u6863\"\"\" try : db = DB () yield db finally : db . close ()","title":"3. \u914d\u7f6e\u6587\u4ef6"},{"location":"apiAutoTest/config/#_1","text":"# config.yaml server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea dev : http://www.ysqorz.top:8888/api/private/v1/ # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 # \u76f8\u5bf9\u4e8erun.py file_path : # \u7528\u4f8b\u6570\u636e\u8def\u5f84 test_case : data/case_data.xls # \u62a5\u544a\u751f\u6210\u8def\u5f84 report : report/ # \u65e5\u5fd7\u6587\u4ef6\u8def\u5f84 log : log/run{time}.log email : # \u53d1\u4ef6\u4eba\u90ae\u7bb1 user : 123456.com # \u53d1\u4ef6\u4eba\u90ae\u7bb1\u6388\u6743\u7801 password : ASGCSFSGS # \u90ae\u7bb1host host : smtp.163.com contents : \u89e3\u538bapiAutoReport.zip(\u63a5\u53e3\u6d4b\u8bd5\u62a5\u544a)\u540e\uff0c\u8bf7\u4f7f\u7528\u5df2\u5b89\u88c5Live Server \u63d2\u4ef6\u7684VsCode\uff0c\u6253\u5f00\u89e3\u538b\u76ee\u5f55\u4e0b\u7684index.html\u67e5\u770b\u62a5\u544a # \u6536\u4ef6\u4eba\u90ae\u7bb1 addressees : [ \"\u6536\u4ef6\u4eba\u90ae\u7bb11\" , \"\u6536\u4ef6\u4eba\u90ae\u7bb12\" ] title : \u63a5\u53e3\u81ea\u52a8\u5316\u6d4b\u8bd5\u62a5\u544a(\u89c1\u9644\u4ef6) # \u9644\u4ef6 enclosures : report.zip # \u6570\u636e\u5e93\u6821\u9a8c- mysql database : # \u6570\u636e\u5e93\u5730\u5740 host : localhost # \u6570\u636e\u5e93\u7aef\u53e3 port : 3306 # \u6570\u636e\u5e93\u7528\u6237\u540d user : root # \u4e0d\u7528''\u4f1a\u88ab\u89e3\u6790\u6210int\u7c7b\u578b\u6570\u636e\uff0c \u6570\u636e\u5e93\u5bc6\u7801 password : '123456' # \u6570\u636e\u5e93\u540d\u79f0 db_name : apiautotest # \u6570\u636e\u5e93\u7f16\u7801 charset : utf8mb4 # \u6570\u636e\u5e93\u6240\u5728\u7684\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u7528\u4e8e\u5907\u4efd/\u8fd8\u539f\u6570\u636e\u6587\u4ef6\uff0c\u8fbe\u5230\u6570\u636e\u6e05\u6d17 ssh_server : port : 22 username : root password : '123456' # \u79c1\u6709\u5bc6\u94a5\u6587\u4ef6\u8def\u5f84 private_key_file : # \u79c1\u94a5\u5bc6\u7801 privat_passowrd : # \u5982\u679c\u4f7f\u7528\u7684docker\u5bb9\u5668\u90e8\u7f72mysql\u670d\u52a1\uff0c\u9700\u8981\u4f20\u5165mysql\u7684\u5bb9\u5668id/name mysql_container : mysql8 # \u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6\u5bfc\u51fa\u7684\u672c\u5730\u8def\u5f84, \u9700\u8981\u4fdd\u8bc1\u5b58\u5728\u8be5\u6587\u4ef6\u5939 sql_data_file : backup_sqls/","title":"\u793a\u4f8b"},{"location":"apiAutoTest/config/#server","text":"\u6700\u7ec8\u8bf7\u6c42\u5730\u5740 = \u57fa\u51c6\u5730\u5740 + \u7528\u4f8b\u63a5\u53e3\u5730\u5740 \u670d\u52a1\u7684\u57fa\u51c6\u5730\u5740(\u4e2a\u4eba\u7406\u89e3\u591a\u4e2a\u63a5\u53e3\u90fd\u6709\u7684\u5171\u540c\u90e8\u5206\u5185\u5bb9)\uff0c\u9ed8\u8ba4\u4f7f\u7528\u7684\u662f dev","title":"server"},{"location":"apiAutoTest/config/#_2","text":"test/test_api.py \u4f20\u5165\u5173\u952e\u8bcd\u53c2\u6570 env=\u73af\u5883\u540d` ... # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases , env = 'test' ) ...","title":"\u4fee\u6539\u73af\u5883"},{"location":"apiAutoTest/config/#request_headers","text":"\u6700\u7ec8\u8bf7\u6c42\u5934 = \u57fa\u51c6\u8bf7\u6c42\u5934 + \u7528\u4f8b\u4e2d\u7684\u8bf7\u6c42\u5934 \u57fa\u51c6\u8bf7\u6c42\u5934\uff0c\u5373\u4e3a\u9ed8\u8ba4\u6240\u6709\u63a5\u53e3\u90fd\u4f1a\u4f7f\u7528\u7684\u57fa\u7840\u8bf7\u6c42\u5934\u6570\u636e","title":"request_headers"},{"location":"apiAutoTest/config/#file_path","text":"\u6307\u5b9a\u7528\u4f8b\u6587\u4ef6\u5730\u5740\uff0c\u62a5\u544a\u751f\u6210\u5730\u5740\uff0clog\u4fdd\u5b58\u5730\u5740\uff0c\u6b64\u5904\u8def\u5f84\u9700\u8981\u76f8\u5bf9 run.py \u7684\u5730\u5740","title":"file_path"},{"location":"apiAutoTest/config/#email","text":"\u5982\u4f7f\u7528Jenkins\u96c6\u6210\u53ef\u5ffd\u7565 \u9700\u4fee\u6539 run.py \u4e0b\u5904\u4f4d\u7f6e(\u89e3\u9664\u6ce8\u91ca\u5373\u53ef) def run (): ... # \u53d1\u9001\u90ae\u4ef6\u5e26\u9644\u4ef6\u62a5\u544a EmailServe . send_email ( email , file_path [ 'report' ]) # \u5220\u9664\u672c\u5730\u9644\u4ef6 os . remove ( email [ 'enclosures' ]) if __name__ == '__main__' : run ()","title":"email"},{"location":"apiAutoTest/config/#database","text":"\u53ea\u652f\u6301mysql\u6570\u636e\u5e93 \u4e0d\u4f7f\u7528\u8be5\u529f\u80fd test/test_api.py \u4e2d test_main \u65b9\u6cd5, \u5982\u4e0b\u4fee\u6539 def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect )","title":"database"},{"location":"apiAutoTest/config/#ssh_server","text":"\u6570\u636e\u5e93\u5907\u4efd\uff0c\u8fd8\u539f \u7528\u4e8e\u8fde\u63a5\u6570\u636e\u5e93\u7684\u670d\u52a1\u5668\u8fdb\u884c\u5907\u4efd&\u8fd8\u539f\u64cd\u4f5c,\u5982\u4e0d\u9700\u8981\uff0c\u5c06 test/conftest.py \u4e2d\u7684 get_db \u65b9\u6cd5\uff0c\u5982\u4e0b\u4fee\u6539 @pytest . fixture ( scope = \"session\" ) def get_db (): \"\"\"\u5173\u4e8e\u5176\u4f5c\u7528\u57df\u8bf7\u79fb\u6b65\u67e5\u770b\u5b98\u65b9\u6587\u6863\"\"\" try : db = DB () yield db finally : db . close ()","title":"ssh_server"},{"location":"apiAutoTest/hooks/","text":"\u673a\u5236 \u00b6 \u6709\u4e9b\u7279\u6b8a\u53c2\u6570\u751f\u6210\u89c4\u5219, \u5982md5\u52a0\u89e3\u5bc6\u7b49, \u5219\u53ef\u5728\u6b64\u5904\u5b9a\u4e49 \u5b9a\u4e49\u4e4b\u540e\u4f7f\u7528 ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u65e0\u53c2\u51fd\u6570, ${\u65b9\u6cd5\u540d(\u53c2\u6570\u540d)} \u8c03\u7528\u6709\u53c2\u51fd\u6570 \u793a\u4f8b \u00b6 \u5b9a\u4e49\u51fd\u6570 \u00b6 tools/hooks.py # hooks.py #!/usr/bin/env python # _*_ coding: utf-8 _*_ \"\"\" @project: apiAutoTest @file: hooks.py @author: zy7y @time: 2021/2/27 @site: https://cnblogs.com/zy7y @github: https://github.com/zy7y @gitee: https://gitee.com/zy7y @desc: \u6269\u5c55\u65b9\u6cd5, 2021/02/27 \u5173\u4e8eexec\u6267\u884cpython\u4ee3\u7801\u53ef\u67e5\u9605\u8d44\u6599\uff1ahttps://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p23_executing_code_with_local_side_effects.html \"\"\" import time def get_current_highest (): \"\"\"\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\"\"\" return int ( time . time ()) def set_token ( token : str ): \"\"\"\u8bbe\u7f6etoken\uff0c\u76f4\u63a5\u8fd4\u56de\u5b57\u5178\"\"\" return { \"Authorization\" : token } def sum_data ( a , b ): \"\"\"\u8ba1\u7b97\u51fd\u6570\"\"\" return a + b \u8bf7\u6c42\u8def\u5f84\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"timer\": \"${get_current_highest()}\"} login/${get_current_highest()} \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bf7\u6c42\u6570\u636e\u5904\u7406: \u5047\u8bbe\u57fa\u51c6\u5730\u5740\u4f7f\u7528\u7684\u662f dev : http://www.ysqorz.top:8888/api/private/v1/ \u5047\u8bbe\u5f53\u524d\u65f6\u95f4\u6233\u4e3a: 1621422609 \u6700\u7ec8\u8bf7\u6c42\u5730\u5740\u4e3a: http://www.ysqorz.top:8888/api/private/v1/login/1621422609 \u8bf7\u6c42\u6570\u636e\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570 \u00b6 \u8bf7\u6c42\u6570\u636e \u8bf7\u6c42\u5934\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570 \u00b6 \u8bf7\u6c42\u5934\u6570\u636e\u5904\u7406: config/config.yaml \u4e2d request_header \u914d\u7f6e\u5982\u4e0b: # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 \u6700\u7ec8\u8bf7\u6c42\u5934\u6570\u636e\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"timer\" : \"1621422609\" }","title":"5. \u81ea\u5b9a\u4e49\u51fd\u6570"},{"location":"apiAutoTest/hooks/#_1","text":"\u6709\u4e9b\u7279\u6b8a\u53c2\u6570\u751f\u6210\u89c4\u5219, \u5982md5\u52a0\u89e3\u5bc6\u7b49, \u5219\u53ef\u5728\u6b64\u5904\u5b9a\u4e49 \u5b9a\u4e49\u4e4b\u540e\u4f7f\u7528 ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u65e0\u53c2\u51fd\u6570, ${\u65b9\u6cd5\u540d(\u53c2\u6570\u540d)} \u8c03\u7528\u6709\u53c2\u51fd\u6570","title":"\u673a\u5236"},{"location":"apiAutoTest/hooks/#_2","text":"","title":"\u793a\u4f8b"},{"location":"apiAutoTest/hooks/#_3","text":"tools/hooks.py # hooks.py #!/usr/bin/env python # _*_ coding: utf-8 _*_ \"\"\" @project: apiAutoTest @file: hooks.py @author: zy7y @time: 2021/2/27 @site: https://cnblogs.com/zy7y @github: https://github.com/zy7y @gitee: https://gitee.com/zy7y @desc: \u6269\u5c55\u65b9\u6cd5, 2021/02/27 \u5173\u4e8eexec\u6267\u884cpython\u4ee3\u7801\u53ef\u67e5\u9605\u8d44\u6599\uff1ahttps://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p23_executing_code_with_local_side_effects.html \"\"\" import time def get_current_highest (): \"\"\"\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\"\"\" return int ( time . time ()) def set_token ( token : str ): \"\"\"\u8bbe\u7f6etoken\uff0c\u76f4\u63a5\u8fd4\u56de\u5b57\u5178\"\"\" return { \"Authorization\" : token } def sum_data ( a , b ): \"\"\"\u8ba1\u7b97\u51fd\u6570\"\"\" return a + b","title":"\u5b9a\u4e49\u51fd\u6570"},{"location":"apiAutoTest/hooks/#_4","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"timer\": \"${get_current_highest()}\"} login/${get_current_highest()} \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bf7\u6c42\u6570\u636e\u5904\u7406: \u5047\u8bbe\u57fa\u51c6\u5730\u5740\u4f7f\u7528\u7684\u662f dev : http://www.ysqorz.top:8888/api/private/v1/ \u5047\u8bbe\u5f53\u524d\u65f6\u95f4\u6233\u4e3a: 1621422609 \u6700\u7ec8\u8bf7\u6c42\u5730\u5740\u4e3a: http://www.ysqorz.top:8888/api/private/v1/login/1621422609","title":"\u8bf7\u6c42\u8def\u5f84\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570"},{"location":"apiAutoTest/hooks/#_5","text":"\u8bf7\u6c42\u6570\u636e","title":"\u8bf7\u6c42\u6570\u636e\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570"},{"location":"apiAutoTest/hooks/#_6","text":"\u8bf7\u6c42\u5934\u6570\u636e\u5904\u7406: config/config.yaml \u4e2d request_header \u914d\u7f6e\u5982\u4e0b: # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 \u6700\u7ec8\u8bf7\u6c42\u5934\u6570\u636e\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"timer\" : \"1621422609\" }","title":"\u8bf7\u6c42\u5934\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570"},{"location":"apiAutoTest/jenkins/","text":"\u8d44\u6599 \u00b6 apiAutoTest\u96c6\u6210Jenkins","title":"6. Jenkins\u96c6\u6210"},{"location":"apiAutoTest/jenkins/#_1","text":"apiAutoTest\u96c6\u6210Jenkins","title":"\u8d44\u6599"},{"location":"apiAutoTest/recording/","text":"\u673a\u5236 \u00b6 \u57fa\u4e8emitmproxy, \u6293\u5305\u5fae\u4fe1\u5c0f\u7a0b\u5e8f \u4f7f\u7528\u5176\u63d0\u4f9b\u7684\u6269\u5c55API, \u901a\u8fc7mitmproxy \u5b9e\u73b0\u4ee3\u7406\u4e4b\u540e\u6355\u83b7\u5230HTTP/HTTPS\u8bf7\u6c42,\u5e76\u628a\u8bf7\u6c42\u5df2\u8ffd\u52a0\u7684\u5f62\u5f0f\u6dfb\u52a0\u5230excel\u4e2d\uff0c\u5f53\u5f55\u5236\u5b8c\u6210\u52a1\u5fc5\u4f7f\u7528ctrl + c \u5173\u95ed\u5f55\u5236\uff0c\u5c06\u751f\u6210\u4e00\u4e2a\u5b8c\u6210\u7684\u7528\u4f8b\u6570\u636e\u6587\u4ef6 \u53ef\u6307\u5b9a\u5f55\u5236\u5305\u542b\u8bf7\u6c42\u5730\u5740\u7684\u63a5\u53e3 \u5982\u4f55\u5f55\u5236 \u00b6 \u524d\u7f6e\u6761\u4ef6: https://www.cnblogs.com/zy7y/p/14798151.html \u6253\u5f00\u672c\u673a\u4ee3\u7406 \u4fee\u6539 tools\\recording.py \u4e2d\u914d\u7f6e\u6293\u5305\u8bf7\u6c42\u5730\u5740, \u7528\u4f8b\u751f\u6210\u8def\u5f84 apiAutoTest \u6839\u76ee\u5f55\u4e0b\u6267\u884c mitmweb -s tools \\r ecording.py \u6b63\u5e38\u53bb\u4f7f\u7528\u5c31\u884c\u4e86\uff0c\u5f53\u4e0d\u9700\u8981\u5f55\u5236\u7684\u65f6\u5019 \u5728\u4e0a\u9762\u8fd9\u4e2a\u7a97\u53e3 Ctrl + C \u505c\u6b62\u5f55\u5236\uff0c\u7136\u540e\u5173\u95ed\u672c\u673a\u4ee3\u7406 \u5f55\u5236\u7684\u7528\u4f8b \u00b6 **\u56e0\u4e3a\u9ed8\u8ba4\u5f55\u5236\u7684url\u662f\u5b8c\u6574\u7684url,\u6240\u4ee5\u5982\u679c\u76f4\u63a5\u7528\u8fd9\u4e2a\u6587\u4ef6,\u8bf7\u628a config/config.yaml \u4e2d\u7684 serve dev \u57fa\u51c6\u5730\u5740\u6362\u6210 \"\" , \u56e0\u4e3a\u6761\u4ef6\u6709\u9650\u6ca1\u6cd5\u8986\u76d6\u6d4b\u8bd5\u5f88\u591a\u5185\u5bb9\u8fd9\u5feb\u529f\u80fd\u53ef\u80fd\u4f1a\u6709 Bug \uff0c \u76ee\u524d\u4e2a\u4eba\u6d4b\u8bd5\u4e86 Graphql **\u89c4\u8303\u63a5\u53e3\u7684\u5f55\u5236, RestFul \u89c4\u8303\u63a5\u53e3\u5f55\u5236, \u4e0d\u6392\u9664\u5176\u4ed6\u7684\u65e0\u6cd5\u5b8c\u6574\u7684\u751f\u6210\u7528\u4f8b\u6587\u4ef6 \u9700\u8981\u6ce8\u610fExcel \u5355\u5143\u683c\u5b57\u7b26\u6570\u9650\u5236\u95ee\u9898, Graphql\u89c4\u8303\u63a5\u53e3\u975e\u5e38\u5bb9\u6613\u51fa\u73b0\u4e0d\u53ef\u5199\u5165\u7684\u60c5\u51b5, \u5355\u4ece\u4e1a\u52a1\u63a5\u53e3\u6765\u8bf4\u5e94\u8be5\u4e0d\u5bb9\u6613\u51fa\u73b0\u6b64\u7c7b\u95ee\u9898 \u4f7f\u7528\u5f55\u5236\u7684\u7528\u4f8b \u00b6 config/config.yaml \u4fee\u6539\u57fa\u51c6\u5730\u5740 dev \u4e3a \"\" ,\u6307\u5b9a\u4f7f\u7528\u5f55\u5236\u7684\u7528\u4f8b\u6587\u4ef6 server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea # dev: http://www.ysqorz.top:8888/api/private/v1/ dev : '' # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : {} file_path : test_case : data/case_data1.xls # \u6307\u5b9a\u4f7f\u7528\u90a3\u4e2a\u7528\u4f8b\uff0c\u8fd9\u91cc\u4f7f\u7528\u4e86\u5f55\u5236\u7684\u7528\u4f8b report : report/ log : log/run{time}.log .... \u6267\u884c\u7ed3\u679c \u00b6","title":"7. \u63a5\u53e3\u5f55\u5236"},{"location":"apiAutoTest/recording/#_1","text":"\u57fa\u4e8emitmproxy, \u6293\u5305\u5fae\u4fe1\u5c0f\u7a0b\u5e8f \u4f7f\u7528\u5176\u63d0\u4f9b\u7684\u6269\u5c55API, \u901a\u8fc7mitmproxy \u5b9e\u73b0\u4ee3\u7406\u4e4b\u540e\u6355\u83b7\u5230HTTP/HTTPS\u8bf7\u6c42,\u5e76\u628a\u8bf7\u6c42\u5df2\u8ffd\u52a0\u7684\u5f62\u5f0f\u6dfb\u52a0\u5230excel\u4e2d\uff0c\u5f53\u5f55\u5236\u5b8c\u6210\u52a1\u5fc5\u4f7f\u7528ctrl + c \u5173\u95ed\u5f55\u5236\uff0c\u5c06\u751f\u6210\u4e00\u4e2a\u5b8c\u6210\u7684\u7528\u4f8b\u6570\u636e\u6587\u4ef6 \u53ef\u6307\u5b9a\u5f55\u5236\u5305\u542b\u8bf7\u6c42\u5730\u5740\u7684\u63a5\u53e3","title":"\u673a\u5236"},{"location":"apiAutoTest/recording/#_2","text":"\u524d\u7f6e\u6761\u4ef6: https://www.cnblogs.com/zy7y/p/14798151.html \u6253\u5f00\u672c\u673a\u4ee3\u7406 \u4fee\u6539 tools\\recording.py \u4e2d\u914d\u7f6e\u6293\u5305\u8bf7\u6c42\u5730\u5740, \u7528\u4f8b\u751f\u6210\u8def\u5f84 apiAutoTest \u6839\u76ee\u5f55\u4e0b\u6267\u884c mitmweb -s tools \\r ecording.py \u6b63\u5e38\u53bb\u4f7f\u7528\u5c31\u884c\u4e86\uff0c\u5f53\u4e0d\u9700\u8981\u5f55\u5236\u7684\u65f6\u5019 \u5728\u4e0a\u9762\u8fd9\u4e2a\u7a97\u53e3 Ctrl + C \u505c\u6b62\u5f55\u5236\uff0c\u7136\u540e\u5173\u95ed\u672c\u673a\u4ee3\u7406","title":"\u5982\u4f55\u5f55\u5236"},{"location":"apiAutoTest/recording/#_3","text":"**\u56e0\u4e3a\u9ed8\u8ba4\u5f55\u5236\u7684url\u662f\u5b8c\u6574\u7684url,\u6240\u4ee5\u5982\u679c\u76f4\u63a5\u7528\u8fd9\u4e2a\u6587\u4ef6,\u8bf7\u628a config/config.yaml \u4e2d\u7684 serve dev \u57fa\u51c6\u5730\u5740\u6362\u6210 \"\" , \u56e0\u4e3a\u6761\u4ef6\u6709\u9650\u6ca1\u6cd5\u8986\u76d6\u6d4b\u8bd5\u5f88\u591a\u5185\u5bb9\u8fd9\u5feb\u529f\u80fd\u53ef\u80fd\u4f1a\u6709 Bug \uff0c \u76ee\u524d\u4e2a\u4eba\u6d4b\u8bd5\u4e86 Graphql **\u89c4\u8303\u63a5\u53e3\u7684\u5f55\u5236, RestFul \u89c4\u8303\u63a5\u53e3\u5f55\u5236, \u4e0d\u6392\u9664\u5176\u4ed6\u7684\u65e0\u6cd5\u5b8c\u6574\u7684\u751f\u6210\u7528\u4f8b\u6587\u4ef6 \u9700\u8981\u6ce8\u610fExcel \u5355\u5143\u683c\u5b57\u7b26\u6570\u9650\u5236\u95ee\u9898, Graphql\u89c4\u8303\u63a5\u53e3\u975e\u5e38\u5bb9\u6613\u51fa\u73b0\u4e0d\u53ef\u5199\u5165\u7684\u60c5\u51b5, \u5355\u4ece\u4e1a\u52a1\u63a5\u53e3\u6765\u8bf4\u5e94\u8be5\u4e0d\u5bb9\u6613\u51fa\u73b0\u6b64\u7c7b\u95ee\u9898","title":"\u5f55\u5236\u7684\u7528\u4f8b"},{"location":"apiAutoTest/recording/#_4","text":"config/config.yaml \u4fee\u6539\u57fa\u51c6\u5730\u5740 dev \u4e3a \"\" ,\u6307\u5b9a\u4f7f\u7528\u5f55\u5236\u7684\u7528\u4f8b\u6587\u4ef6 server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea # dev: http://www.ysqorz.top:8888/api/private/v1/ dev : '' # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : {} file_path : test_case : data/case_data1.xls # \u6307\u5b9a\u4f7f\u7528\u90a3\u4e2a\u7528\u4f8b\uff0c\u8fd9\u91cc\u4f7f\u7528\u4e86\u5f55\u5236\u7684\u7528\u4f8b report : report/ log : log/run{time}.log ....","title":"\u4f7f\u7528\u5f55\u5236\u7684\u7528\u4f8b"},{"location":"apiAutoTest/recording/#_5","text":"","title":"\u6267\u884c\u7ed3\u679c"},{"location":"apiAutoTest/structure/","text":"\u251c\u2500api \u2502 \u251c\u2500client.py # \u65b0\u7248\u8bf7\u6c42\u5c01\u88c5 \u2502 \u2514\u2500base_requests.py # \u8bf7\u6c42\u5c01\u88c5 \u251c\u2500backup_sqls \u2502 \u2514\u2500xxx.sql # \u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6 \u251c\u2500config \u2502 \u2514\u2500config.yaml # \u914d\u7f6e\u6587\u4ef6 \u251c\u2500data \u2502 \u2514\u2500test_data.xlsx # \u7528\u4f8b\u6587\u4ef6 \u251c\u2500log \u2502 \u2514\u2500run...x.log # \u65e5\u5fd7\u6587\u4ef6 \u251c\u2500report \u2502 \u251c\u2500data \u2502 \u2514\u2500html # allure\u62a5\u544a \u251c\u2500test \u2502 \u251c\u2500conftest.py # \u4f9d\u8d56\u5bf9\u8c61\u521d\u59cb\u5316 \u2502 \u2514\u2500test_api.py # \u6d4b\u8bd5\u6587\u4ef6 \u251c\u2500tools # \u5de5\u5177\u5305 \u2502 \u251c\u2500__init__.py # \u5e38\u7528\u65b9\u6cd5\u5c01\u88c5 \u2502 \u251c\u2500data_clearing.py # \u6570\u636e\u9694\u79bb \u2502 \u251c\u2500data_process.py # \u4f9d\u8d56\u6570\u636e\u5904\u7406 \u2502 \u251c\u2500db.py # \u6570\u636e\u5e93\u8fde\u63a5\u5bf9\u8c61 \u2502 \u251c\u2500hooks.py # \u81ea\u5b9a\u4e49\u6269\u5c55\u65b9\u6cd5(\u53ef\u7528\u4e8e\u7528\u4f8b)\u6587\u4ef6 \u2502 \u251c\u2500read_file.py # \u7528\u4f8b\u3001\u914d\u7f6e\u9879\u8bfb\u53d6 \u2502 \u251c\u2500recording.py # \u63a5\u53e3\u5f55\u5236,\u5199\u5165\u7528\u4f8b\u6587\u4ef6 \u2502 \u2514\u2500send_email.py # \u90ae\u4ef6\u53d1\u9001\u3001\u62a5\u544a\u538b\u7f29 \u251c\u2500\u9879\u76ee\u5b9e\u6218\u63a5\u53e3\u6587\u6863.md # \u914d\u5957\u9879\u76ee\u76f8\u5173\u63a5\u53e3\u6587\u6863 \u251c\u2500requirements.txt # \u9879\u76ee\u4f9d\u8d56\u5e93\u6587\u4ef6 \u2514\u2500run.py # \u4e3b\u542f\u52a8\u6587\u4ef6","title":"2. \u76ee\u5f55\u7ed3\u6784"},{"location":"apiAutoTest/use/","text":"\u73af\u5883\u51c6\u5907 \u00b6 java jdk\u4e0b\u8f7d\uff1a \u94fe\u63a5\uff1a https://pan.baidu.com/s/1q9TIbHoOKIvoZMv1m7WA-g \u63d0\u53d6\u7801\uff1a2fbs \u73af\u5883\u642d\u5efa: https://www.cnblogs.com/zy7y/p/13345421.html allure \u94fe\u63a5\uff1a https://pan.baidu.com/s/1Tut7BDsusgChhA41ZSkrkg \u63d0\u53d6\u7801\uff1atlei python \u7248\u672c >= 3.8 git clone https://gitee.com/zy7y/apiAutoTest.git git clone https://github.com/zy7y/apiAutoTest.git \u4f53\u9a8c \u00b6 \u754c\u9762\u64cd\u4f5c \u4f7f\u7528Pycharm\u6253\u5f00 apiAutoTest \u9879\u76ee \u65b0\u5efa\u865a\u62df\u73af\u5883 \u5b89\u88c5\u4f9d\u8d56 \u8fd0\u884c \u67e5\u770b\u62a5\u544a \u00b6 \u8def\u5f84\u5730\u5740: report/html \u547d\u4ee4\u884c\u64cd\u4f5c \u00b6 \u4f7f\u7528Pycharm\u6253\u5f00 apiAutoTest \u9879\u76ee \u65b0\u5efa\u865a\u62df\u73af\u5883 # \u547d\u4ee4\u884c\u4f7f\u7528 python -m venv venv # mac/linux python3 -m venv venv \u6fc0\u6d3b\u865a\u62df\u73af\u5883 # windows venv \\S cripts \\a ctivate # mac/linux source venv/bin/activate \u5b89\u88c5\u4f9d\u8d56 # windows pip install -r requirements.txt # mac / linux pip3 install -r requirements.txt \u8fd0\u884c # windows python run.py # mac/linux python3 run.py","title":"1. \u8fdb\u884c\u4f53\u9a8c"},{"location":"apiAutoTest/use/#_1","text":"java jdk\u4e0b\u8f7d\uff1a \u94fe\u63a5\uff1a https://pan.baidu.com/s/1q9TIbHoOKIvoZMv1m7WA-g \u63d0\u53d6\u7801\uff1a2fbs \u73af\u5883\u642d\u5efa: https://www.cnblogs.com/zy7y/p/13345421.html allure \u94fe\u63a5\uff1a https://pan.baidu.com/s/1Tut7BDsusgChhA41ZSkrkg \u63d0\u53d6\u7801\uff1atlei python \u7248\u672c >= 3.8 git clone https://gitee.com/zy7y/apiAutoTest.git git clone https://github.com/zy7y/apiAutoTest.git","title":"\u73af\u5883\u51c6\u5907"},{"location":"apiAutoTest/use/#_2","text":"\u754c\u9762\u64cd\u4f5c \u4f7f\u7528Pycharm\u6253\u5f00 apiAutoTest \u9879\u76ee \u65b0\u5efa\u865a\u62df\u73af\u5883 \u5b89\u88c5\u4f9d\u8d56 \u8fd0\u884c","title":"\u4f53\u9a8c"},{"location":"apiAutoTest/use/#_3","text":"\u8def\u5f84\u5730\u5740: report/html","title":"\u67e5\u770b\u62a5\u544a"},{"location":"apiAutoTest/use/#_4","text":"\u4f7f\u7528Pycharm\u6253\u5f00 apiAutoTest \u9879\u76ee \u65b0\u5efa\u865a\u62df\u73af\u5883 # \u547d\u4ee4\u884c\u4f7f\u7528 python -m venv venv # mac/linux python3 -m venv venv \u6fc0\u6d3b\u865a\u62df\u73af\u5883 # windows venv \\S cripts \\a ctivate # mac/linux source venv/bin/activate \u5b89\u88c5\u4f9d\u8d56 # windows pip install -r requirements.txt # mac / linux pip3 install -r requirements.txt \u8fd0\u884c # windows python run.py # mac/linux python3 run.py","title":"\u547d\u4ee4\u884c\u64cd\u4f5c"},{"location":"apiAutoTest/case/assert/","text":"\u673a\u5236 \u00b6 \u7edd\u5bf9\u76f8\u7b49\u7684\u65ad\u8a00\u5f62\u5f0f, \u591a\u4e2a\u65ad\u8a00\u65f6,\u4e00\u4e2a\u65ad\u8a00\u4e0d\u901a\u8fc7\u5219\u8be5\u7528\u4f8b\u4e0d\u901a\u8fc7 \u5b9e\u9645\u7ed3\u679c\u53ef\u52a8\u6001\u4ece\u5f53\u5f3a\u54cd\u5e94\u4e2d\u63d0\u53d6, \u9884\u671f\u7ed3\u679c\u53ef\u4ee5\u4f7f\u7528 ${} \u8bed\u6cd5 \u793a\u4f8b \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; select * from cases {\"$.meta.status\":400} \u4e0a\u8ff0\u63a5\u53e3\u6b63\u5e38\u8bf7\u6c42,\u4e14\u8fd4\u56de,\u54cd\u5e94\u5927\u81f4\u5982\u4e0b: { \"data\" : null , \"meta\" : { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" , \"status\" : 400 } } \u9884\u671f\u7ed3\u679c\u5185\u5bb9\u5982\u4e0b: { \"$.meta.code\" : 400 } $.meta.code \u4e3a\u5b9e\u9645\u7ed3\u679c,\u4ece\u5f53\u524d\u54cd\u5e94\u63d0\u53d6\u5f97\u5230\u7ed3\u679c\u4e3a: 400 \u4e0a\u8ff0 $.meta.code \u7684value 400 \u4e3a\u9884\u671f\u7ed3\u679c \u5bf9\u5e94\u65ad\u8a00\u7ed3\u679c\u4e3a: \"\u5b9e\u9645\u7ed3\u679c:400 = \u9884\u671f\u7ed3\u679c:400\" \u591a\u65ad\u8a00\u793a\u4f8b: { \"$.meta.status\" : 400 , \"$.meata.msg\" : \"\u767b\u5f55\u6210\u529f\" }","title":"4.8 \u9884\u671f\u7ed3\u679c"},{"location":"apiAutoTest/case/assert/#_1","text":"\u7edd\u5bf9\u76f8\u7b49\u7684\u65ad\u8a00\u5f62\u5f0f, \u591a\u4e2a\u65ad\u8a00\u65f6,\u4e00\u4e2a\u65ad\u8a00\u4e0d\u901a\u8fc7\u5219\u8be5\u7528\u4f8b\u4e0d\u901a\u8fc7 \u5b9e\u9645\u7ed3\u679c\u53ef\u52a8\u6001\u4ece\u5f53\u5f3a\u54cd\u5e94\u4e2d\u63d0\u53d6, \u9884\u671f\u7ed3\u679c\u53ef\u4ee5\u4f7f\u7528 ${} \u8bed\u6cd5","title":"\u673a\u5236"},{"location":"apiAutoTest/case/assert/#_2","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; select * from cases {\"$.meta.status\":400} \u4e0a\u8ff0\u63a5\u53e3\u6b63\u5e38\u8bf7\u6c42,\u4e14\u8fd4\u56de,\u54cd\u5e94\u5927\u81f4\u5982\u4e0b: { \"data\" : null , \"meta\" : { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" , \"status\" : 400 } } \u9884\u671f\u7ed3\u679c\u5185\u5bb9\u5982\u4e0b: { \"$.meta.code\" : 400 } $.meta.code \u4e3a\u5b9e\u9645\u7ed3\u679c,\u4ece\u5f53\u524d\u54cd\u5e94\u63d0\u53d6\u5f97\u5230\u7ed3\u679c\u4e3a: 400 \u4e0a\u8ff0 $.meta.code \u7684value 400 \u4e3a\u9884\u671f\u7ed3\u679c \u5bf9\u5e94\u65ad\u8a00\u7ed3\u679c\u4e3a: \"\u5b9e\u9645\u7ed3\u679c:400 = \u9884\u671f\u7ed3\u679c:400\" \u591a\u65ad\u8a00\u793a\u4f8b: { \"$.meta.status\" : 400 , \"$.meata.msg\" : \"\u767b\u5f55\u6210\u529f\" }","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/base/","text":"\u7528\u4f8b\u4e00\u89c8 \u00b6 \u82e5\u770b\u4e0d\u6e05\uff0c\u8bf7\u81ea\u884c\u6253\u5f00 data/case_data.xls \u7528\u4f8b\u7f16\u53f7 \u00b6 \u7528\u4f8b\u7f16\u53f7, \u4e0e\u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\u4e00\u81f4\u53ea\u662f\u4e2a\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u00b6 \u7528\u4f8b\u6807\u9898\uff0c\u7b80\u8ff0\u8be5\u7528\u4f8b\u505a\u7684\u4e8b\u60c5\uff0c\u5c06\u4f53\u73b0\u5728 allure\u62a5\u544a \u4e2d \u662f\u5426\u6267\u884c \u00b6 \u5f53\u5176\u4e3a \u5426 \u65f6\uff0c\u8be5\u7528\u4f8b\u4e0d\u4f1a\u88ab\u8fd0\u884c \u8bf7\u6c42\u65b9\u5f0f \u00b6 1. get 2. post 3. put 4. delete ... \u5165\u53c2\u5173\u952e\u5b57 \u00b6 1. params\uff1a\u7c7b\u4f3c\u8fd9\u79cd\uff1aurl?\u53c2\u6570\u540d=\u53c2\u6570\u503c&\u53c2\u6570\u540d1=\u53c2\u6570\u503c1 2. data\uff1a\u8bf7\u6c42\u5934content-type\u662ffrom\u8868\u5355\u7c7b\u578b\u3002 3. json\uff1a\u8bf7\u6c42\u5934content-type\uff1aapplication/json\u3002","title":"4.1 \u57fa\u672c\u4ecb\u7ecd"},{"location":"apiAutoTest/case/base/#_1","text":"\u82e5\u770b\u4e0d\u6e05\uff0c\u8bf7\u81ea\u884c\u6253\u5f00 data/case_data.xls","title":"\u7528\u4f8b\u4e00\u89c8"},{"location":"apiAutoTest/case/base/#_2","text":"\u7528\u4f8b\u7f16\u53f7, \u4e0e\u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\u4e00\u81f4\u53ea\u662f\u4e2a\u7528\u4f8b\u7f16\u53f7","title":"\u7528\u4f8b\u7f16\u53f7"},{"location":"apiAutoTest/case/base/#_3","text":"\u7528\u4f8b\u6807\u9898\uff0c\u7b80\u8ff0\u8be5\u7528\u4f8b\u505a\u7684\u4e8b\u60c5\uff0c\u5c06\u4f53\u73b0\u5728 allure\u62a5\u544a \u4e2d","title":"\u7528\u4f8b\u6807\u9898"},{"location":"apiAutoTest/case/base/#_4","text":"\u5f53\u5176\u4e3a \u5426 \u65f6\uff0c\u8be5\u7528\u4f8b\u4e0d\u4f1a\u88ab\u8fd0\u884c","title":"\u662f\u5426\u6267\u884c"},{"location":"apiAutoTest/case/base/#_5","text":"1. get 2. post 3. put 4. delete ...","title":"\u8bf7\u6c42\u65b9\u5f0f"},{"location":"apiAutoTest/case/base/#_6","text":"1. params\uff1a\u7c7b\u4f3c\u8fd9\u79cd\uff1aurl?\u53c2\u6570\u540d=\u53c2\u6570\u503c&\u53c2\u6570\u540d1=\u53c2\u6570\u503c1 2. data\uff1a\u8bf7\u6c42\u5934content-type\u662ffrom\u8868\u5355\u7c7b\u578b\u3002 3. json\uff1a\u8bf7\u6c42\u5934content-type\uff1aapplication/json\u3002","title":"\u5165\u53c2\u5173\u952e\u5b57"},{"location":"apiAutoTest/case/data/","text":"\u524d\u7f6e\u5904\u7406 \u4f7f\u7528\u53d8\u91cf \u6765\u6e90\uff1a \u54cd\u5e94\u63d0\u53d6 \uff0c \u540e\u7f6eSQL\u7ed3\u679c \u4f7f\u7528 $\u53d8\u91cf\u540d \u6216\u8005 ${\u53d8\u91cf\u540d} \u7684\u65b9\u5f0f\u6765\u5f15\u7528\u53d8\u91cf \u4f7f\u7528\u51fd\u6570 \u6765\u6e90\uff1a tools/hooks.py \u5b9a\u4e49\u7684\u51fd\u6570 \u8c03\u7528\u65e0\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u6709\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d(\u53c2\u6570)} \u7ecf\u8fc7\u4e0a\u9762\u4e24\u9053\u5de5\u5e8f\u5904\u7406\u4e4b\u540e\uff0c\u8fd4\u56de\u7684 data \u88ab\u8f6c\u4e3a dict \u3002 \u7c7bjson \u7c7b\u4f3cjson/dict\u7684\u5199\u6cd5\uff0c\u81ea\u5df1\u7684\u7b80\u5355\u53eb\u6cd5\uff0c\u4e0d\u8981\u88ab\u8bef\u5bfc\uff0c\u6709\u65f6\u5019\u6211\u4eec\u7684\u8bf7\u6c42\u6570\u636e\u53ef\u80fd\u9700\u8981\u8fd9\u6837 { \"username\" : \"tery\" , \"password\" : $ { ge t _curre nt _highes t () }} \u89e3\u6790 \u6b64\u5904\u5176\u5b9e\u4f7f\u7528\u4e86 ${} \u81ea\u5b9a\u4e49\u51fd\u6570,\u6709\u4e2a\u8fd4\u56de\u503c, \u8fd9\u79cd\u5199\u6cd5\u660e\u663e\u662f \u4e0d\u7b26\u5408json/dict \u683c\u5f0f\u7684 \u4f46\u5728\u6700\u7ec8\u53d1\u8d77\u8bf7\u6c42\u524d, \u8fd9\u4e9b\u6570\u636e\u4f1a\u88ab\u8f6c\u6210\u7b26\u5408\u683c\u5f0f\u7684json/dict\u7c7b\u578b\u6570\u636e \u793a\u4f8b \u00b6 \u4e0d\u4f7f\u7528\u81ea\u5b9a\u4e49\u65b9\u6cd5&\u53c2\u6570\u53d8\u91cf \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c2 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u4f7f\u7528\u53c2\u6570\u53d8\u91cf \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c3 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"${password}\", \"age\": $age} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1a\u53d8\u91cf\u6c60 { \"password\" : 123456 , \"age\" : 18 } \u89e3\u6790\u8fc7\u7a0b ${password} -> \u53d8\u91cf\u6c60[\"password\"] -> 123456 $age -> \u53d8\u91cf\u6c60[\"age\"] -> 18 \u5219\uff1a \u6700\u7ec8\u8bf7\u6c42\u6570\u636e { \"username\" : \"admin\" , \"password\" : \"123456\" , \"age\" : 18 } \u4f7f\u7528\u81ea\u5b9a\u4e49\u65b9\u6cd5 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c4 \u767b\u5f55 {set_token( {set_token( {token})} login \u662f post data {\"username\": \"${get_current_highest()}\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1atools/hooks.py # hooks.py \u81ea\u5b9a\u4e49\u51fd\u6570\u5185\u5bb9\u5982\u4e0b import time def get_current_highest (): \"\"\"\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\"\"\" return int ( time . time ()) def set_token ( token : str ): \"\"\"\u8bbe\u7f6etoken\uff0c\u76f4\u63a5\u8fd4\u56de\u5b57\u5178\"\"\" return { \"Authorization\" : token } \u8bbe\uff1a\u53d8\u91cf\u6c60 { \"token\" : \"123789token123\" } \u89e3\u6790\u8fc7\u7a0b ${token} -> \u53d8\u91cf\u6c60[\"token\"] -> \"123789token123\" ${get_current_highest()} -> \u6267\u884chooks.py\u4e2d\u7684get_current_highest() -> \"1621415799\" ${set_token(${token})} -> \u6267\u884chooks.py\u4e2d\u7684set_token(\"123789token123\") -> {\"Authorization\": \"123789token123\"} \u6700\u7ec8\u8bf7\u6c42\u6570\u636e \u8bf7\u6c42\u5934\uff08\u542b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u57fa\u51c6header\uff09 { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"Authorization\" : \"123789token123\" } \u8bf7\u6c42\u6570\u636e { \"username\" : \"1621415799\" , \"password\" : \"123456\" } \u81ea\u5b9a\u4e49\u51fd\u6570\u7ed3\u679c \u6267\u884c\u540e\u8fd4\u56de\u7ed3\u679c\u7c7b\u578b\u6700\u7ec8\u90fd\u4f1a\u88ab\u8f6c\u6210 str \u7c7b\u578b \u7528\u4f8b\u4e2d\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570\u7684\u53ea\u6709 \u8bf7\u6c42\u5730\u5740 , \u8bf7\u6c42\u5934 , \u8bf7\u6c42\u6570\u636e , \u540e\u7f6eSQL , \u9884\u671f\u7ed3\u679c","title":"4.5 \u8bf7\u6c42\u6570\u636e"},{"location":"apiAutoTest/case/data/#_1","text":"","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/data/#_2","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c2 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400}","title":"\u4e0d\u4f7f\u7528\u81ea\u5b9a\u4e49\u65b9\u6cd5&\u53c2\u6570\u53d8\u91cf"},{"location":"apiAutoTest/case/data/#_3","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c3 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"${password}\", \"age\": $age} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1a\u53d8\u91cf\u6c60 { \"password\" : 123456 , \"age\" : 18 } \u89e3\u6790\u8fc7\u7a0b ${password} -> \u53d8\u91cf\u6c60[\"password\"] -> 123456 $age -> \u53d8\u91cf\u6c60[\"age\"] -> 18 \u5219\uff1a \u6700\u7ec8\u8bf7\u6c42\u6570\u636e { \"username\" : \"admin\" , \"password\" : \"123456\" , \"age\" : 18 }","title":"\u4f7f\u7528\u53c2\u6570\u53d8\u91cf"},{"location":"apiAutoTest/case/data/#_4","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c4 \u767b\u5f55 {set_token( {set_token( {token})} login \u662f post data {\"username\": \"${get_current_highest()}\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1atools/hooks.py # hooks.py \u81ea\u5b9a\u4e49\u51fd\u6570\u5185\u5bb9\u5982\u4e0b import time def get_current_highest (): \"\"\"\u83b7\u53d6\u5f53\u524d\u65f6\u95f4\u6233\"\"\" return int ( time . time ()) def set_token ( token : str ): \"\"\"\u8bbe\u7f6etoken\uff0c\u76f4\u63a5\u8fd4\u56de\u5b57\u5178\"\"\" return { \"Authorization\" : token } \u8bbe\uff1a\u53d8\u91cf\u6c60 { \"token\" : \"123789token123\" } \u89e3\u6790\u8fc7\u7a0b ${token} -> \u53d8\u91cf\u6c60[\"token\"] -> \"123789token123\" ${get_current_highest()} -> \u6267\u884chooks.py\u4e2d\u7684get_current_highest() -> \"1621415799\" ${set_token(${token})} -> \u6267\u884chooks.py\u4e2d\u7684set_token(\"123789token123\") -> {\"Authorization\": \"123789token123\"} \u6700\u7ec8\u8bf7\u6c42\u6570\u636e \u8bf7\u6c42\u5934\uff08\u542b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u57fa\u51c6header\uff09 { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"Authorization\" : \"123789token123\" } \u8bf7\u6c42\u6570\u636e { \"username\" : \"1621415799\" , \"password\" : \"123456\" } \u81ea\u5b9a\u4e49\u51fd\u6570\u7ed3\u679c \u6267\u884c\u540e\u8fd4\u56de\u7ed3\u679c\u7c7b\u578b\u6700\u7ec8\u90fd\u4f1a\u88ab\u8f6c\u6210 str \u7c7b\u578b \u7528\u4f8b\u4e2d\u53ef\u4ee5\u4f7f\u7528\u81ea\u5b9a\u4e49\u51fd\u6570\u7684\u53ea\u6709 \u8bf7\u6c42\u5730\u5740 , \u8bf7\u6c42\u5934 , \u8bf7\u6c42\u6570\u636e , \u540e\u7f6eSQL , \u9884\u671f\u7ed3\u679c","title":"\u4f7f\u7528\u81ea\u5b9a\u4e49\u65b9\u6cd5"},{"location":"apiAutoTest/case/extra/","text":"\u63d0\u53d6\u53d8\u91cf {\u53d8\u91cf\u540d: jsonpath\u8bed\u6cd5} \u4ece\u5f53\u524d\u7528\u4f8b\u7684\u54cd\u5e94\u7ed3\u679c\u4e2d\u63d0\u53d6\u503c\uff0c\u4ee5\u952e\u503c\u5bf9\u7684\u65b9\u5f0f,\u5c06\u5176\u52a0\u5165\u53c2\u6570\u53d8\u91cf\u6c60 \u5b57\u5178\u4e2d key \u4e0d\u80fd\u91cd\u590d\uff0c\u91cd\u590d\u65f6\u540e\u6dfb\u52a0\u7684 key - value \uff0c\u8986\u76d6\u4e4b\u524d\u7684 \u793a\u4f8b \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c2 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1a\u54cd\u5e94\u7ed3\u679c { \"data\" : { \"id\" : 500 , \"rid\" : 0 , \"username\" : \"admin\" , \"mobile\" : \"13761351161\" , \"email\" : \"adsfad@qq.com\" , \"token\" : \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjUwMCwicmlkIjowLCJpYXQiOjE2MjE0MTYyODMsImV4cCI6MTYyMTUwMjY4M30.7k9GP4XvECPiseneGTADNBGqXdHGJA1JrbCV1wS57ss\" }, \"meta\" : { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } } \u89e3\u6790\u63d0\u53d6\u53c2\u6570\u680f { \"msg\" : \"\u767b\u5f55\u6210\u529f\" } $.meta.msg \u505a\u4e86\u4ec0\u4e48\u4e8b\u60c5\u5462? $ \u4ee3\u8868\u7740\u54cd\u5e94\u5185\u5bb9\u7684\u6839\u76ee\u5f55\uff0c\u5219\u7406\u89e3\u4e3a\u6574\u4e2a { \"data\" : { \"id\" : 500 , \"rid\" : 0 , \"username\" : \"admin\" , \"mobile\" : \"13761351161\" , \"email\" : \"adsfad@qq.com\" , \"token\" : \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjUwMCwicmlkIjowLCJpYXQiOjE2MjE0MTYyODMsImV4cCI6MTYyMTUwMjY4M30.7k9GP4XvECPiseneGTADNBGqXdHGJA1JrbCV1wS57ss\" }, \"meta\" : { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } } $.meta , \u4ee3\u8868\u627e\u5230\u6839\u76ee\u5f55\u4e0bkey\u4e3a meta \u7684value { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } $.meta.msg , \u5219\u610f\u4e3a\u627e\u5230 \u6839\u76ee\u5f55 -> meta -> msg \u7684value \"\u767b\u5f55\u6210\u529f\" \u5f53\u524d\u53d8\u91cf\u6c60 { \"msg\" : \"\u767b\u5f55\u6210\u529f\" } \u63d0\u53d6\u591a\u4e2a: { \"\u53d8\u91cf\u540d1\" : \"jsonpath1\" , \"\u53d8\u91cf\u540d2\" : \"jsonpath2\" } \u62a5\u544a\u4e2d\u7684\u53c2\u6570\u53d8\u91cf\u6c60 \u00b6","title":"4.6 \u63d0\u53d6\u53c2\u6570"},{"location":"apiAutoTest/case/extra/#_1","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c2 \u767b\u5f55 login \u662f post data {\"username\": \"admin\", \"password\": \"123456\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u8bbe\uff1a\u54cd\u5e94\u7ed3\u679c { \"data\" : { \"id\" : 500 , \"rid\" : 0 , \"username\" : \"admin\" , \"mobile\" : \"13761351161\" , \"email\" : \"adsfad@qq.com\" , \"token\" : \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjUwMCwicmlkIjowLCJpYXQiOjE2MjE0MTYyODMsImV4cCI6MTYyMTUwMjY4M30.7k9GP4XvECPiseneGTADNBGqXdHGJA1JrbCV1wS57ss\" }, \"meta\" : { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } } \u89e3\u6790\u63d0\u53d6\u53c2\u6570\u680f { \"msg\" : \"\u767b\u5f55\u6210\u529f\" } $.meta.msg \u505a\u4e86\u4ec0\u4e48\u4e8b\u60c5\u5462? $ \u4ee3\u8868\u7740\u54cd\u5e94\u5185\u5bb9\u7684\u6839\u76ee\u5f55\uff0c\u5219\u7406\u89e3\u4e3a\u6574\u4e2a { \"data\" : { \"id\" : 500 , \"rid\" : 0 , \"username\" : \"admin\" , \"mobile\" : \"13761351161\" , \"email\" : \"adsfad@qq.com\" , \"token\" : \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1aWQiOjUwMCwicmlkIjowLCJpYXQiOjE2MjE0MTYyODMsImV4cCI6MTYyMTUwMjY4M30.7k9GP4XvECPiseneGTADNBGqXdHGJA1JrbCV1wS57ss\" }, \"meta\" : { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } } $.meta , \u4ee3\u8868\u627e\u5230\u6839\u76ee\u5f55\u4e0bkey\u4e3a meta \u7684value { \"msg\" : \"\u767b\u5f55\u6210\u529f\" , \"status\" : 200 } $.meta.msg , \u5219\u610f\u4e3a\u627e\u5230 \u6839\u76ee\u5f55 -> meta -> msg \u7684value \"\u767b\u5f55\u6210\u529f\" \u5f53\u524d\u53d8\u91cf\u6c60 { \"msg\" : \"\u767b\u5f55\u6210\u529f\" } \u63d0\u53d6\u591a\u4e2a: { \"\u53d8\u91cf\u540d1\" : \"jsonpath1\" , \"\u53d8\u91cf\u540d2\" : \"jsonpath2\" }","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/extra/#_2","text":"","title":"\u62a5\u544a\u4e2d\u7684\u53c2\u6570\u53d8\u91cf\u6c60"},{"location":"apiAutoTest/case/files/","text":"\u63d0\u793a \u5185\u90e8\u5c06\u4f7f\u7528\u4e8c\u8fdb\u5236\u6d41\u65b9\u5f0f\u6253\u5f00\u672c\u5730\u6587\u4ef6\u5e76\u4e0a\u4f20\u5230\u63a5\u53e3\u5f53\u4e2d windows\u4e2d\u8def\u5f84\u4e2d\u76f4\u63a5\u4f7f\u7528 \\ , \u4f1a\u88ab\u8f6c\u4e49 \u793a\u4f8b \u00b6 # \u672c\u5730\u51c6\u5907\u4e00\u4e2a\u4e0a\u4f20\u6587\u4ef6\u670d\u52a1 #!/usr/bin/env/ python3 # -*- coding:utf-8 -*- \"\"\" @Project: apiAutoTest @File :serve.py @Author:zy7y @Date :2021/5/19 @Desc : \"\"\" from typing import List from fastapi import FastAPI , File , UploadFile , Form app = FastAPI () @app . post ( \"/upload_file/\" , name = '\u4e0a\u4f20\u5355\u6587\u4ef6\u63a5\u53e3' ) async def create_upload_file ( file : UploadFile = File ( ... )): # \u5355\u6587\u4ef6\u4e0a\u4f20\u63a5\u53e3\uff0c\u5e76\u5c06\u6587\u4ef6\u5199\u5230\u670d\u52a1\u5668\u5730\u5740\uff0c \u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u53c2\u6570 \u662f file # \u8bfb\u53d6\u6587\u4ef6 contents = await file . read () # \u4fdd\u5b58\u672c\u5730 with open ( file . filename , \"wb\" ) as f : f . write ( contents ) return { 'msg' : '\u64cd\u4f5c\u6210\u529f' , \"filename\" : file . filename , \"meta\" : { \"msg\" : \"ok\" }, \"code\" : 200 } @app . post ( \"/upload_files/\" , name = '\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6' ) async def create_upload_files ( files : List [ UploadFile ] = File ( ... ), username : str = Form ( ... ), password : str = Form ( ... )): # \u591a\u6587\u4ef6\u4e0a\u4f20\u63a5\u53e3\uff0c\u5e76\u5c06\u6587\u4ef6\u5199\u5230\u670d\u52a1\u5668, \u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u53c2\u6570 \u662f files for file in files : # \u8bfb\u53d6\u6587\u4ef6 contents = await file . read () # \u4fdd\u5b58\u672c\u5730 with open ( file . filename , \"wb\" ) as f : f . write ( contents ) return { \"filenames\" : [ file . filename for file in files ], \"meta\" : { \"msg\" : \"ok\" }, \"code\" : 200 , \"username\" : username , \"password\" : password } if __name__ == '__main__' : # \u542f\u52a8\u9879\u76ee\u540e \u8bbf\u95ee http://127.0.0.1:8888/docs \u53ef\u67e5\u770b\u63a5\u53e3\u6587\u6863 import uvicorn uvicorn . run ( 'serve:app' , reload = True , port = 8888 ) # pip install fastapi uvicorn python-multipart test/test_api.py test_main \u51fd\u6570\uff0c\u4fee\u6539 env='test' : def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases , env = 'test' ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) \u65e0\u6587\u4ef6 \u00b6 \u4e0a\u4f20\u6587\u4ef6\u680f\u4e0d\u586b\u5199\u5373\u53ef \u5355\u6587\u4ef6 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c9 \u4e0a\u4f20\u5355\u6587\u4ef6 uploadfile \u662f post data {\"file\":\"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\"} {\"code\":\"$.code\"} {\"$.code\":200} \u6839\u636e\u63a5\u53e3\u6587\u6863\u6216\u8005\u4e0a\u8ff0\u63a5\u53e3\u53ef\u770b\u5230\u8fd9\u91cc\u7684 file \u662f\u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u5165\u53c2 { \"file\" : \"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\" } \u591a\u6587\u4ef6 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c10 \u4e0a\u4f20\u591a\u6587\u4ef6 uploadfiles \u662f post data {\"files\":[\"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\", \"D:/FastAPIProjects/apiAutoTestDocs/demo/docs/index.md\"]} {\"username\": \"admin\", \"password\": \"\"} {\"$.code\":200} { \"files\" :[ \"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\" , \"D:/FastAPIProjects/apiAutoTestDocs/demo/docs/index.md\" ]} \u6839\u636e\u63a5\u53e3\u6587\u6863\u6216\u8005\u4e0a\u8ff0\u63a5\u53e3\u53ef\u770b\u5230\u8fd9\u91cc\u7684 files \u662f\u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u5217\u8868\u7684\u5165\u53c2 \u670d\u52a1\u7aef","title":"4.4 \u4e0a\u4f20\u6587\u4ef6"},{"location":"apiAutoTest/case/files/#_1","text":"# \u672c\u5730\u51c6\u5907\u4e00\u4e2a\u4e0a\u4f20\u6587\u4ef6\u670d\u52a1 #!/usr/bin/env/ python3 # -*- coding:utf-8 -*- \"\"\" @Project: apiAutoTest @File :serve.py @Author:zy7y @Date :2021/5/19 @Desc : \"\"\" from typing import List from fastapi import FastAPI , File , UploadFile , Form app = FastAPI () @app . post ( \"/upload_file/\" , name = '\u4e0a\u4f20\u5355\u6587\u4ef6\u63a5\u53e3' ) async def create_upload_file ( file : UploadFile = File ( ... )): # \u5355\u6587\u4ef6\u4e0a\u4f20\u63a5\u53e3\uff0c\u5e76\u5c06\u6587\u4ef6\u5199\u5230\u670d\u52a1\u5668\u5730\u5740\uff0c \u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u53c2\u6570 \u662f file # \u8bfb\u53d6\u6587\u4ef6 contents = await file . read () # \u4fdd\u5b58\u672c\u5730 with open ( file . filename , \"wb\" ) as f : f . write ( contents ) return { 'msg' : '\u64cd\u4f5c\u6210\u529f' , \"filename\" : file . filename , \"meta\" : { \"msg\" : \"ok\" }, \"code\" : 200 } @app . post ( \"/upload_files/\" , name = '\u4e0a\u4f20\u591a\u4e2a\u6587\u4ef6' ) async def create_upload_files ( files : List [ UploadFile ] = File ( ... ), username : str = Form ( ... ), password : str = Form ( ... )): # \u591a\u6587\u4ef6\u4e0a\u4f20\u63a5\u53e3\uff0c\u5e76\u5c06\u6587\u4ef6\u5199\u5230\u670d\u52a1\u5668, \u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u53c2\u6570 \u662f files for file in files : # \u8bfb\u53d6\u6587\u4ef6 contents = await file . read () # \u4fdd\u5b58\u672c\u5730 with open ( file . filename , \"wb\" ) as f : f . write ( contents ) return { \"filenames\" : [ file . filename for file in files ], \"meta\" : { \"msg\" : \"ok\" }, \"code\" : 200 , \"username\" : username , \"password\" : password } if __name__ == '__main__' : # \u542f\u52a8\u9879\u76ee\u540e \u8bbf\u95ee http://127.0.0.1:8888/docs \u53ef\u67e5\u770b\u63a5\u53e3\u6587\u6863 import uvicorn uvicorn . run ( 'serve:app' , reload = True , port = 8888 ) # pip install fastapi uvicorn python-multipart test/test_api.py test_main \u51fd\u6570\uff0c\u4fee\u6539 env='test' : def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . action ( cases , env = 'test' ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect )","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/files/#_2","text":"\u4e0a\u4f20\u6587\u4ef6\u680f\u4e0d\u586b\u5199\u5373\u53ef","title":"\u65e0\u6587\u4ef6"},{"location":"apiAutoTest/case/files/#_3","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c9 \u4e0a\u4f20\u5355\u6587\u4ef6 uploadfile \u662f post data {\"file\":\"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\"} {\"code\":\"$.code\"} {\"$.code\":200} \u6839\u636e\u63a5\u53e3\u6587\u6863\u6216\u8005\u4e0a\u8ff0\u63a5\u53e3\u53ef\u770b\u5230\u8fd9\u91cc\u7684 file \u662f\u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u7684\u5165\u53c2 { \"file\" : \"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\" }","title":"\u5355\u6587\u4ef6"},{"location":"apiAutoTest/case/files/#_4","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c10 \u4e0a\u4f20\u591a\u6587\u4ef6 uploadfiles \u662f post data {\"files\":[\"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\", \"D:/FastAPIProjects/apiAutoTestDocs/demo/docs/index.md\"]} {\"username\": \"admin\", \"password\": \"\"} {\"$.code\":200} { \"files\" :[ \"D:/FastAPIProjects/apiAutoTestDocs/demo/mkdocs.yml\" , \"D:/FastAPIProjects/apiAutoTestDocs/demo/docs/index.md\" ]} \u6839\u636e\u63a5\u53e3\u6587\u6863\u6216\u8005\u4e0a\u8ff0\u63a5\u53e3\u53ef\u770b\u5230\u8fd9\u91cc\u7684 files \u662f\u63a5\u6536\u6587\u4ef6\u5bf9\u8c61\u5217\u8868\u7684\u5165\u53c2 \u670d\u52a1\u7aef","title":"\u591a\u6587\u4ef6"},{"location":"apiAutoTest/case/header/","text":"\u524d\u7f6e\u5904\u7406 \u4f7f\u7528\u53d8\u91cf \u6765\u6e90\uff1a \u54cd\u5e94\u63d0\u53d6 \uff0c \u540e\u7f6eSQL\u7ed3\u679c \u4f7f\u7528 $\u53d8\u91cf\u540d \u6216\u8005 ${\u53d8\u91cf\u540d} \u7684\u65b9\u5f0f\u6765\u5f15\u7528\u53d8\u91cf \u4f7f\u7528\u51fd\u6570 \u6765\u6e90\uff1a tools/hooks.py \u5b9a\u4e49\u7684\u51fd\u6570 \u8c03\u7528\u65e0\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u6709\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d(\u53c2\u6570)} \u7ecf\u8fc7\u4e0a\u9762\u4e24\u9053\u5de5\u5e8f\u5904\u7406\u4e4b\u540e\uff0c\u8fd4\u56de\u7684 header \u5b57\u5178\uff0c\u5c06\u548c \u57fa\u51c6header \u5408\u5e76\u3002 \u793a\u4f8b \u00b6 config/config.yaml \u4e2d request_header \u914d\u7f6e\u5982\u4e0b: # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 \u6709\u8bf7\u6c42\u5934 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"c1\": \"\u4e3ac1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\"} login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} c1 \u7528\u4f8b\u4e2d \u8bf7\u6c42\u5934\u4e00\u680f\u914d\u7f6e\u5982\u4e0b : { \"c1\" : \"c1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\" } \u5219 \u6700\u7ec8\u8bf7\u6c42\u65f6 ,\u8bf7\u6c42\u5934\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"c1\" : \"c1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\" } \u65e0\u8bf7\u6c42\u5934 \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} c1 \u7528\u4f8b\u4e2d \u8bf7\u6c42\u5934\u4e00\u680f\u914d\u7f6e\u5982\u4e0a \u65e0\u5185\u5bb9`: \u5219 \u6700\u7ec8\u8bf7\u6c42\u65f6 ,\u8bf7\u6c42\u5934\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , }","title":"4.2 \u8bf7\u6c42\u5934"},{"location":"apiAutoTest/case/header/#_1","text":"config/config.yaml \u4e2d request_header \u914d\u7f6e\u5982\u4e0b: # \u57fa\u51c6\u7684\u8bf7\u6c42\u5934\u4fe1\u606f request_headers : Accept-Encoding : gzip, deflate Accept-Language : zh-CN,zh;q=0.9 User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/header/#_2","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"c1\": \"\u4e3ac1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\"} login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} c1 \u7528\u4f8b\u4e2d \u8bf7\u6c42\u5934\u4e00\u680f\u914d\u7f6e\u5982\u4e0b : { \"c1\" : \"c1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\" } \u5219 \u6700\u7ec8\u8bf7\u6c42\u65f6 ,\u8bf7\u6c42\u5934\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , \"c1\" : \"c1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\" }","title":"\u6709\u8bf7\u6c42\u5934"},{"location":"apiAutoTest/case/header/#_3","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} c1 \u7528\u4f8b\u4e2d \u8bf7\u6c42\u5934\u4e00\u680f\u914d\u7f6e\u5982\u4e0a \u65e0\u5185\u5bb9`: \u5219 \u6700\u7ec8\u8bf7\u6c42\u65f6 ,\u8bf7\u6c42\u5934\u5982\u4e0b: { \"Accept-Encoding\" : \"gzip, deflate\" , \"Accept-Language\" : \"zh-CN,zh;q=0.9\" , \"User-Agent\" : \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" , }","title":"\u65e0\u8bf7\u6c42\u5934"},{"location":"apiAutoTest/case/sql/","text":"\u524d\u7f6e\u5904\u7406 \u4f7f\u7528\u53d8\u91cf \u6765\u6e90\uff1a \u54cd\u5e94\u63d0\u53d6 \uff0c \u540e\u7f6eSQL\u7ed3\u679c \u4f7f\u7528 $\u53d8\u91cf\u540d \u6216\u8005 ${\u53d8\u91cf\u540d} \u7684\u65b9\u5f0f\u6765\u5f15\u7528\u53d8\u91cf \u4f7f\u7528\u51fd\u6570 \u6765\u6e90\uff1a tools/hooks.py \u5b9a\u4e49\u7684\u51fd\u6570 \u8c03\u7528\u65e0\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u6709\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d(\u53c2\u6570)} \u7ecf\u8fc7\u4e0a\u9762\u4e24\u9053\u5de5\u5e8f\u5904\u7406\u4e4b\u540e\uff0c\u8fd4\u56de sql \uff0c\u518d\u6267\u884c\u3002 \u6267\u884c\u65f6\u673a \u53d1\u9001\u8bf7\u6c42\u4e4b\u540e\uff0c\u6267\u884cSQL\uff0c\u5e76\u628a\u7ed3\u679c\u52a0\u5165\u5230\u53c2\u6570\u6c60\u4e2d \u5b58\u5728 ${} \u8bed\u6cd5\u5c06\u5904\u7406\u540e\u518d\u53bb\u6267\u884cSQL\u8bed\u53e5 \u53ea\u652f\u6301mysql\uff0c\u5176\u4ed6\u9700\u8981\u7528\u6237\u81ea\u5df1\u6269\u5c55 \u793a\u4f8b \u00b6 test/conftest.py get_db \u51fd\u6570\u4fee\u6539\u5982\u4e0b @pytest . fixture ( scope = \"session\" ) def get_db (): \"\"\"\u5173\u4e8e\u5176\u4f5c\u7528\u57df\u8bf7\u79fb\u6b65\u67e5\u770b\u5b98\u65b9\u6587\u6863\"\"\" try : db = DB () yield db finally : db . close () config/config.yaml database \u5982\u4e0b # \u6570\u636e\u5e93\u6821\u9a8c- mysql database : host : localhost port : 3306 user : root # \u4e0d\u7528''\u4f1a\u88ab\u89e3\u6790\u6210int\u7c7b\u578b\u6570\u636e password : '123456' db_name : apiautotest charset : utf8mb4 # \u6570\u636e\u5e93\u6240\u5728\u7684\u670d\u52a1\u5668\u914d\u7f6e ssh_server : port : 22 username : root password : '123456' # \u79c1\u6709\u5bc6\u94a5\u6587\u4ef6\u8def\u5f84 private_key_file : # \u79c1\u94a5\u5bc6\u7801 privat_passowrd : # \u5982\u679c\u4f7f\u7528\u7684docker\u5bb9\u5668\u90e8\u7f72mysql\u670d\u52a1\uff0c\u9700\u8981\u4f20\u5165mysql\u7684\u5bb9\u5668id/name mysql_container : mysql8 # \u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6\u5bfc\u51fa\u7684\u672c\u5730\u8def\u5f84, \u9700\u8981\u4fdd\u8bc1\u5b58\u5728\u8be5\u6587\u4ef6\u5939 sql_data_file : backup_sqls/ test/test_api.py test_main \u51fd\u6570,\u4fee\u6539\u5982\u4e0b: def test_main ( cases , get_db ): # \u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd(\u5305\u542bsql\u67e5\u8be2\uff0c\u6570\u636e\u5907\u4efd\uff0c\u6570\u636e\u6062\u590d) # \u6b64\u5904\u7684cases\u5165\u53c2\u6765\u81ea\u4e0e conftest.py \u6587\u4ef6\u4e2d cases\u51fd\u6570\uff0c\u4e0e\u76f4\u63a5\u4f7f\u7528 @pytest.mark.parametrize # \u6709\u7740\u5dee\u4e0d\u591a\u7684\u6548\u679c # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . aciton ( cases ) # \u6267\u884csql DataProcess . handle_sql ( sql , get_db ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) apis \u8868\u6570\u636e\u5982\u4e0b: cases \u8868\u6570\u636e\u5982\u4e0b: \u5355\u6761sql \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; {\"$.meta.status\":400} \u6267\u884c\u53c2\u6570\u5b57\u5178\u4e3a: { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" } sql\u6267\u884c\u7ed3\u679c\u4e3a: null \u591a\u6761sql \u00b6 \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; select * from cases {\"$.meta.status\":400} \u6267\u884c\u540e\u53c2\u6570\u5b57\u5178\u4e3a: { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" , \"id\" : 1 , \"name\" : \"updatehahaha\" , \"path\" : null , \"body\" : null , \"expected\" : \"{\\\"msg\\\": \\\"\u4f60\u597d\\\"}\" , \"api_id\" : 1 , \"create_at\" : \"2021-05-17 17:23:54\" , \"update_at\" : \"2021-05-17 17:23:54\" } sql\u6267\u884c\u7ed3\u679c\u4e3a: { \"id\" : 1 , \"name\" : \"updatehahaha\" , \"path\" : null , \"body\" : null , \"expected\" : \"{\\\"msg\\\": \\\"\u4f60\u597d\\\"}\" , \"api_id\" : 1 , \"create_at\" : \"2021-05-17 17:23:54\" , \"update_at\" : \"2021-05-17 17:23:54\" }","title":"4.7 \u540e\u7f6esql"},{"location":"apiAutoTest/case/sql/#_1","text":"test/conftest.py get_db \u51fd\u6570\u4fee\u6539\u5982\u4e0b @pytest . fixture ( scope = \"session\" ) def get_db (): \"\"\"\u5173\u4e8e\u5176\u4f5c\u7528\u57df\u8bf7\u79fb\u6b65\u67e5\u770b\u5b98\u65b9\u6587\u6863\"\"\" try : db = DB () yield db finally : db . close () config/config.yaml database \u5982\u4e0b # \u6570\u636e\u5e93\u6821\u9a8c- mysql database : host : localhost port : 3306 user : root # \u4e0d\u7528''\u4f1a\u88ab\u89e3\u6790\u6210int\u7c7b\u578b\u6570\u636e password : '123456' db_name : apiautotest charset : utf8mb4 # \u6570\u636e\u5e93\u6240\u5728\u7684\u670d\u52a1\u5668\u914d\u7f6e ssh_server : port : 22 username : root password : '123456' # \u79c1\u6709\u5bc6\u94a5\u6587\u4ef6\u8def\u5f84 private_key_file : # \u79c1\u94a5\u5bc6\u7801 privat_passowrd : # \u5982\u679c\u4f7f\u7528\u7684docker\u5bb9\u5668\u90e8\u7f72mysql\u670d\u52a1\uff0c\u9700\u8981\u4f20\u5165mysql\u7684\u5bb9\u5668id/name mysql_container : mysql8 # \u6570\u636e\u5e93\u5907\u4efd\u6587\u4ef6\u5bfc\u51fa\u7684\u672c\u5730\u8def\u5f84, \u9700\u8981\u4fdd\u8bc1\u5b58\u5728\u8be5\u6587\u4ef6\u5939 sql_data_file : backup_sqls/ test/test_api.py test_main \u51fd\u6570,\u4fee\u6539\u5982\u4e0b: def test_main ( cases , get_db ): # \u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd(\u5305\u542bsql\u67e5\u8be2\uff0c\u6570\u636e\u5907\u4efd\uff0c\u6570\u636e\u6062\u590d) # \u6b64\u5904\u7684cases\u5165\u53c2\u6765\u81ea\u4e0e conftest.py \u6587\u4ef6\u4e2d cases\u51fd\u6570\uff0c\u4e0e\u76f4\u63a5\u4f7f\u7528 @pytest.mark.parametrize # \u6709\u7740\u5dee\u4e0d\u591a\u7684\u6548\u679c # \u53d1\u9001\u8bf7\u6c42 response , expect , sql = client . aciton ( cases ) # \u6267\u884csql DataProcess . handle_sql ( sql , get_db ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) apis \u8868\u6570\u636e\u5982\u4e0b: cases \u8868\u6570\u636e\u5982\u4e0b:","title":"\u793a\u4f8b"},{"location":"apiAutoTest/case/sql/#sql","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; {\"$.meta.status\":400} \u6267\u884c\u53c2\u6570\u5b57\u5178\u4e3a: { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" } sql\u6267\u884c\u7ed3\u679c\u4e3a: null","title":"\u5355\u6761sql"},{"location":"apiAutoTest/case/sql/#sql_1","text":"\u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} select * from apis; select * from cases {\"$.meta.status\":400} \u6267\u884c\u540e\u53c2\u6570\u5b57\u5178\u4e3a: { \"msg\" : \"\u53c2\u6570\u9519\u8bef\" , \"id\" : 1 , \"name\" : \"updatehahaha\" , \"path\" : null , \"body\" : null , \"expected\" : \"{\\\"msg\\\": \\\"\u4f60\u597d\\\"}\" , \"api_id\" : 1 , \"create_at\" : \"2021-05-17 17:23:54\" , \"update_at\" : \"2021-05-17 17:23:54\" } sql\u6267\u884c\u7ed3\u679c\u4e3a: { \"id\" : 1 , \"name\" : \"updatehahaha\" , \"path\" : null , \"body\" : null , \"expected\" : \"{\\\"msg\\\": \\\"\u4f60\u597d\\\"}\" , \"api_id\" : 1 , \"create_at\" : \"2021-05-17 17:23:54\" , \"update_at\" : \"2021-05-17 17:23:54\" }","title":"\u591a\u6761sql"},{"location":"apiAutoTest/case/url/","text":"\u524d\u7f6e\u5904\u7406 \u4f7f\u7528\u53d8\u91cf \u6765\u6e90\uff1a \u54cd\u5e94\u63d0\u53d6 \uff0c \u540e\u7f6eSQL\u7ed3\u679c \u4f7f\u7528 $\u53d8\u91cf\u540d \u6216\u8005 ${\u53d8\u91cf\u540d} \u7684\u65b9\u5f0f\u6765\u5f15\u7528\u53d8\u91cf \u4f7f\u7528\u51fd\u6570 \u6765\u6e90\uff1a tools/hooks.py \u5b9a\u4e49\u7684\u51fd\u6570 \u8c03\u7528\u65e0\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d()} \u8c03\u7528\u6709\u53c2\u65b9\u6cd5\uff1a ${\u65b9\u6cd5\u540d(\u53c2\u6570)} \u7ecf\u8fc7\u4e0a\u9762\u4e24\u9053\u5de5\u5e8f\u5904\u7406\u4e4b\u540e\uff0c\u8fd4\u56de\u7684 url \u5c06\u88ab\u8ffd\u52a0\u5230 \u73af\u5883url\u672b\u5c3e \u793a\u4f8b \u00b6 config/config.yaml \u4e2d server \u914d\u7f6e\u5982\u4e0b: server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea dev : http://www.ysqorz.top:8888/api/private/v1/ test/test_api.py \u5982\u4e0b def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42, \u4e0d\u4f20env \u5173\u952e\u5b57\u53c2\u6570\u9ed8\u8ba4\u4f7f\u7528 dev\u73af\u5883 response , expect , sql = client . action ( cases ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"c1\": \"\u4e3ac1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\"} login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u5219 c1 \u6700\u7ec8\u8bf7\u6c42\u5730\u5740\u5982\u4e0b: http://www.ysqorz.top:8888/api/private/v1/login","title":"4.3 \u63a5\u53e3\u5730\u5740"},{"location":"apiAutoTest/case/url/#_1","text":"config/config.yaml \u4e2d server \u914d\u7f6e\u5982\u4e0b: server : # \u672c\u5730\u63a5\u53e3\u670d\u52a1 test : http://127.0.0.1:8888/ # https://space.bilibili.com/283273603 \u6f14\u793a\u9879\u76ee\u540e\u7aef\u670d\u52a1\u6765\u81ea dev : http://www.ysqorz.top:8888/api/private/v1/ test/test_api.py \u5982\u4e0b def test_main ( cases ): # \u4e0d\u4f7f\u7528\u6570\u636e\u5e93\u529f\u80fd # \u53d1\u9001\u8bf7\u6c42, \u4e0d\u4f20env \u5173\u952e\u5b57\u53c2\u6570\u9ed8\u8ba4\u4f7f\u7528 dev\u73af\u5883 response , expect , sql = client . action ( cases ) # \u65ad\u8a00\u64cd\u4f5c DataProcess . assert_result ( response , expect ) \u7528\u4f8b\u7f16\u53f7 \u7528\u4f8b\u6807\u9898 \u8bf7\u6c42\u5934 \u8def\u5f84 \u662f\u5426\u6267\u884c \u8bf7\u6c42\u65b9\u5f0f \u5165\u53c2\u5173\u952e\u5b57 \u4e0a\u4f20\u6587\u4ef6 \u8bf7\u6c42\u6570\u636e \u63d0\u53d6\u53c2\u6570 \u540e\u7f6eSQL \u9884\u671f\u7ed3\u679c c1 get\u767b\u5f55 {\"c1\": \"\u4e3ac1\u6dfb\u52a0\u7684\u8bf7\u6c42\u5934\"} login \u662f get params {\"username\": \"admin\", \"password\": \"\"} {\"msg\":\"$.meta.msg\"} {\"$.meta.status\":400} \u5219 c1 \u6700\u7ec8\u8bf7\u6c42\u5730\u5740\u5982\u4e0b: http://www.ysqorz.top:8888/api/private/v1/login","title":"\u793a\u4f8b"}]} |