Package: lemon-easytest
easytesteasytest是一个接口自动化框架。功能特点：支持http接口测试支持json，html,xml格式的响应断言支持数据库断言支持用例标记筛选支持用例失败重运行支持多线程安装pip install lemon_easytest快速使用不需要写任何代码，所有你需要做的就是按照规则编写用例文档，然后运行命令easytest。easytest支持yaml格式和excel格式的用例文档。在任意目录下创建文件singe_test.yaml,内容如下：test:# 表名这是单个测试用例title:一个简单的测试# 用例名称url:http://httpbin.org/get# urlmethod:get# 请求方法request:# 请求参数字段headers:# 请求头CustomerHeader:lemonban# 头信息params:# url参数search:lemonban# url参数键值对res_type:json# 响应数据类型status_code:200# 状态码assertion:# 断言表达式--lemonban# 期望值-eq# 相等-$..Customerheader# 结果提取表达式--lemonban-eq-$..search然后在命令行运行easytest yourpath/single_test.yamlINFO2021-10-3014:53:26,081:==========single_test测试开始============INFO2021-10-3014:53:26,081:用例【一个简单的测试】开始测试>>>>>>>>
INFO2021-10-3014:53:26,591:用例【一个简单的测试】测试结束<<<<<<<<<INFO2021-10-3014:53:26,591:==========single_test测试结束============用例总数:1,成功:1个,跳过:0,失败:0个,错误:0个通过python代码调用easytest可以直接通过python调用easytestimporteasytesteasytest.main()也可传递参数easytest.main(['test_dir','--debug','--logfile','test.log'])编写用例测试用例easytest中编写单条测试用例可以使用yaml格式，也可以使用excel文件。excel格式使用excel文件编写单条测试用例非常简单，例如将上面的案例编写到excel文件中格式如下：当用excel文件编写用例时保持数据的整洁，其他单元格不要有任何数据，以免加载用例数据失败。easytest会根据excel文件的sheetname来组织用例，所以单条用例请删除其他的表。yaml格式当使用yaml文件编写单条测试用例时最外层键必须为test,因为easytest根据它来确定一个yaml文件中的数据是单条测试用例。test:# 表名这是单个测试用例title:一个简单的测试# 用例名称url:http://httpbin.org/get# urlmethod:get# 请求方法request:# 请求参数字段headers:# 请求头CustomerHeader:lemonban# 头信息params:# url参数search:lemonban# url参数键值对res_type:json# 响应数据类型status_code:200# 状态码assertion:# 断言表达式--lemonban# 期望值-eq# 相等-$..Customerheader# 结果提取表达式--lemonban-eq-$..search测试套件easytest中测试套件表示一组有顺序的测试用例，当启动多线程时，以测试套件为单位交给线程去按照套件中的顺序执行测试用例。注意套件和套件间的执行顺序是不固定的。单个测试用例也会被套上一层测试套件的壳子,yaml格式的单测试用例会被封装到以yaml文件名为名字的测试套件中，excel格式的单测试用例会被封装到以表名为名字的测试套件中。excel格式excel文件中编写测试套件与单测试用例没有区别，按照执行顺序从上往下依次编写即可,例如：在单个excel文件中可以编写多个测试套件，一个表即为一个测试套件，所以非测试用例或者项目设置的表请删除。yaml格式在yaml文件中编写测试套件，最外层的key必须为test_suit，因为easytest根据它来确定一个yaml文件中的数据是一个测试套件。注意和excel不同，yaml格式不支持在一个文件中编写多个测试套件，因为多层级的嵌套缩进将是噩梦。test_suit:-title:一个简单的测试url:http://httpbin.org/postmethod:poststatus_code:200res_type:jsonrequest:json:username:xinlanpassword:123456assertion:-[xinlan,eq,$..username]-[xinlan,eq,$..password]-title:一个不简单的测试url:http://httpbin.org/postmethod:poststatus_code:200res_type:jsonrequest:json:username:xinlanpassword:123456assertion:-[xinlan,eq,$..username]-[xinlan,eq,$..password]用例收集规则easytest命令后接受一个位置参数file_or_dir,它可以是一个用例文件，也可以是一个目录。当传入一个用例文件时，它必须是上一节提到的符合格式的excel或者yaml文件，excel文件只支持.xlsx后缀的格式，yaml文件支持.yaml或者.yml后缀。当传入一个目录时，easytest会递归的去这个目录下搜索所有符合规则的用例文件(excel、yaml)，并从中提取用例，当遇到格式错误时，程序会中断，所以不要把无关的Excel文件和yaml文件放在用例目录下。注意：easytest采用流式的读取用例数据。用例字段说明title必须字段字符串，用例标题url必须字段字符串，请求的url，支持完整url，例如https://httpbin.org/get,也支持项目配置中的接口对应的key。例如：registermethod必须字段字符串，http请求方法requestjson对象，http请求携带的参数，请求头，cookie等。底层调用python的requests库，参数名完全一致。paramsjson对象，http请求携带的url参数。例如request:params:search:pythondatajson对象，http请求携带的表单参数。例如request:data:username:xinlanpassword:123456jsonjson对象，http请求携带的json参数。例如request:json:username:xinlanpassword:123456headersjson对象，http请求携带的header。例如request:headers:X-Lemonban-Media-Type:lemonban.v1cookiejson对象，http请求携带的cookie信息。例如request:cookies:key:valueres_type字符串，http响应类型，可选值有：json,xml,htmlstatus_code必须字段整数，http断言响应状态码。assertion数组对象，响应结果断言表达式。格式为:[[期望结果1,条件符号1,提取表达式1],[期望结果2,条件符号2,提取表达式2],...],例如：assertion:-[xinlan,eq,$..username]-[123456,eq,$..password]条件符号支持：eq: 相等neq: 不相等gt: 大于gte:大于等于lt: 小于lte:小于等于in:在其中nin:不在其中提取表达式支持：正则表达式jsonpath表达式xpath(开发中)db_assertion数组对象，数据库断言表达式。格式为:[[期望结果1,条件符号1,sql语句1],[期望结果2,条件符号2,sql语句2],...],例如：db_assertion:-[0,eq,select leave_amount from member where id=#invest1_id#]-[38,eq,select id from invest where member_id=#invest1_id# and loan_id=#loan_id# and amount=5000]-[111,eq,select id from financelog where pay_member_id=#invest1_id# and amount=5000 and pay_member_money=0 and status=1]条件符号支持：eq: 相等neq: 不相等gt: 大于gte:大于等于lt: 小于lte:小于等于in:在其中nin:不在其中extract数组对象，响应结果提取表达式。格式为[[变量名,提取表达式],[变量名2，提取表达式2],...]例如：exract:-[mobile_phone,$..mobile_phone]-[token,$..token]底层easytest会将提取出的值绑定到用例类的变量名属性上，供后面的用例依赖。提取表达式支持：jsonpath正则表达式xpath表达式(开发中)marks字符串，用例标记，运行参数中可以筛选出匹配的标记用例项目配置easytest命令会从当前目录下读取名为easytest.ini的配置文件，下面是一个完整配置文件的例子：# 项目配置段[project]# 项目名称name=xxx项目# 项目接口根地址host=http://some.api.root.com# 数据库配置[db_config]# 数据库主机host=dbhost# 数据库用户user=root# 数据库密码password=123456# 数据库名db=somedb# 字符编码charset=utf8# 端口port=3306# 接口地址[interfaces]# 注册接口对应地址register:/member/register# 登录接口对应地址login:/member/loginwithdraw:/member/withdrawrecharge:/member/rechargeadd:/loan/addaudit:/loan/auditinvest:/member/invest# 运行时参数[run]# 开启调试模式debug=true# 日志文件logfile=a.log# 筛选标记 success,login表示标记为success或login的用例会被执行marks=success,login# 启动线程数量thread_num=10# 失败重跑次数retry=3# 报告文件(开发中)report=result.jsonprojectproject段，支持name和hostname 项目名称host 项目接口根地址，注意不要以/结尾db_configdb_config段，数据库配置，目前仅支持mysqlhost 数据库主机user 数据库用户名password 数据密码db 数据库名port 端口charset 字符串编码interfacesinterfaces段，接口名称配置，格式：key=value，key是接口名称字符串，value是去掉主机后的接口地址以/开头，在用例中url字段可以填写key，easytest内部会使用项目host+接口地址进行拼接。runrun字段，运行时的参数。debug 调试模式，默认为falselogfile 生成日志文件，可以是绝对路径或者是相对路径marks 需要筛选的标记，多个标记使用逗号隔开，例如：success,login，表示会筛选被标记了success和login的用例。thread_num 启动线程的数量，默认为0表示单线程执行retry 用例失败后重跑的次数，默认为0表示不重跑report 生成报告的文件名，根据后缀自动生成对应报告，暂只支持json格式。注意：命令行参数会覆盖项目配置。生成模拟测试数据在测试过程中有时需要动态的生成测试数据，例如手机号码，人名等。easytest通过Faker模块来生产模拟数据，暂时只支持简体中文语言下的接口，详情见Faker简体中文providers。用例中支持生产模拟测试数据的字段有，url,request。使用格式为$生成数据接口名$。例如在Faker中生成手机号码的方法名为phone_number,那么在用例中使用$phone_number$表示动态生成手机号码。test:# 表名这是单个测试用例title:一个简单的测试# 用例名称url:http://httpbin.org/get# urlmethod:get# 请求方法request:# 请求参数字段headers:# 请求头CustomerHeader:lemonban# 头信息params:# url参数search:lemonban# url参数键值对phone:$phone_number$上面这个用例表示url参数phone是一个动态生成的手机号码。接口依赖的处理easytest中，同一个测试套件下，前一个用例返回的数据可以通过变量传递给下一个用例。例如登录成功后将返回的token值传递给下一个需要token的用例。传递步骤如下：在登录用例中添加extract字段提取响应回的token值,并绑定到你定义的变量名admin_token上在后面的用例中，在需要使用到token的数据部分就可以使用#admin_token#,来表示，easytest会在自动进行替换所有你需要做的，只是按照规则编写用例，剩下的交给easytest。支持#变量名#进行替换的字段有,url,request,assertion, db_assertion。因为参数提取是在数据库断言之前进行的，所以db_assertion中可以直接引用本条用例中的提取数据。其他字段引用之前响应数据断言成功的用例提取的数据。提取数据会根据提取表达式和响应类型进行提取，并支持通过jsonpath表达式在请求头中提取。当res_type的值不为json时，如果提取表达式是jsonpath格式，那么easytest会从请求头中提取数据。当rest_type的值为json,如果提取表达式的格式为jsonpath格式，那么easytest会先尝试从响应数据中提取数据，如果提取不到再尝试从响应头中提取数据。所有格式的表达式提取数据时，如果只有一个匹配的值，会返回值本身，如果有多个匹配会返回列表。这在断言条件in的时候很有用。命令行参数说明file_or_dir字符串，项目路径，或者需要执行的用例文件--debug开启日志调试模式--logfile字符串，日志文件路径--marks​		字符串，运行时选择的标记--thread_num整数，运行时启动线程的数量，默认为0表示单线程执行--report字符串，测试报告文件路径，按照文件后缀生成对应的格式的报告(开发中)--auto整数，默认为1，表示运行命令easytest后会自动运行用例，当用代码执行，需要获取json结果时可以设置为其他值，然后调用run返回结果。res=easytest.main([...,'--auto','0']).run()