使用教程
环境名称:自定义名称
headers:键值对字典格式,注意写法格式
http:协议http://或这https://

Environment:框架测试环境配置,使用之前自定义的环境的名称
log_path:日志这里用自己电脑的文件路径
exclude_dir:执行用例要排除的case下的二级目录,例:‘bd’
exclude_file:执行用例要排除的case下的文件 例:‘case/mb.yaml’
raw_case_path:当前用例原始文件总目录
MYSQL_CONFIG:MYSQL_CONFIG_1,MYSQL_CONFIG_2数据库配置,使用数据库操作时使用,需要几个就写几个
submodule_list:子模块,用于数据统计,就是case目录下的所有二级目录(暂时无用)
case_amount_sum,case_amount_execute:数据统计需要无需修改


使用请严格按照格式编写用例
#用例(名称)标题,需要参数依赖的全部设置字符格式,后期解析成字典列表等格式
用例标题0:
#接口地址,也支持参数依赖,没写
path: /test/${id}
#请求方法
method: post
#有值就用这个,没用就使用默认配置的,有header里面使用参数依赖的场景
headers: '{"token":"${token}"}'
# 是否运行
is_run: False
# 前置sql:sql有2大类,一个是查询有返回值,一个是增删改无返回值,前置sql为无返回值类型
# precondition_sql:
# - UPDATE case_test SET title = '标题2', ex = '44' WHERE id = 2
# - UPDATE case_test SET title = '标题3', ex = '55' WHERE id = 3
#请求参数较多,这里就使用原始字典格式,除了提取表达式,其他的都带上引号,预防出错,random_time()随机函数使用
data:
'{
"id":${id},
"projectNo": "320SF000206004",
"name": ${name},
"time": ${random_int()},
}'
#上传文件,文件名路径必须是英文
file:
'[
("file", ("bug.xlsx", open("C:/Users/Cassie/Desktop/bug.xlsx", "rb"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
]'
#参数类型 json 或者 form表单
data_type: json
#从接口返回结果提取哪些字段和提取表达式,比如从返回数据提取用户id和name
extract_key:
id: $.id
name: $.name
#断言表达式
# 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)
# 断言sql为有返回值查询
assert_expression:
#判断响应码是否和预期一致
code: 200
#判断预期值是否在返回值里面(用值是否在接口返回的内容里面判断)
body: 内容包含
#判断json提取值是否和预期一致(用键和值比较等于,大于小于或者in判断)
json:
id: $.id
name: $.name
1: $.int
#判断sql查询值是否和预期一致(用键和值作判断,规则和上面一致)
sql:
#外层一个大列表,里面没个小列表就是一个sql断言
#小列表断言元素1是数据库名,第二个是比较值,第三个是逻辑运算符,第四个是sql
[["db_test2","$.book_jg","<","SELECT book_name FROM book where book_name=${book_name}"],
["db_test","$.title","==","SELECT title FROM case where id=${id}"]]
参数依赖可以写在path,headers,data里面
参数池{‘id’:1,‘name’:‘kk’,‘info’:{‘wo’:2}}
${id}: 相当于在参数池子里面取id的值也就是1
${info.wo}: 相当于在参数池子里面取wo的值也就是2
${random_int()}:使用函数里面的这个方法

data:使用引号包起来的字典,作为接口表单格式参数发送(复制data里面的数据在外面加上引号)
file:使用引号包起来的python文件对象,作为接口文件格式参数发送(复制file里面的数据在外面加上引号)
调试代码
data_type: 设置为form
import requests
url = "https://xx/file"
data= {'uid': '78axx90011',
'file_name': 'bug.xlsx',
'file_type': 'proof_of_address'}
files = [
('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
]
headers = {
'Authorization': 'Bearer eyJ0xxxe',
'Accept': 'application/json'}
response = requests.request("POST", url, headers=headers, data=data, files=files)
print(response.text)
用例写法
data:
"
{'uid': '78asdf99890011',
'file_name': 'bug.xlsx',
'file_type': 'proof_of_address'}
"
file:
"
[
('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
]
"
data_type: form
data:使用引号包起来的字典,作为接口json格式参数发送(复制data里面的数据在外面加上引号)
file:不填
data_type: 设置为 json
data:
'
{
"waybill_no":"${waybill_no}",
"lu_dan_ren":"${cc1}",
"aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(2)}"}}]
}
'
file:
data_type: json
都填空,不写
data:
file:
data_type:
需要填写预期接口返回码,完全相等就是断言成功
code: 200
填写预期接口返回的内容,该内容在接口返回数据里面就是断言成功
body: 520
运单创建成功,301是预期结果,$.msg,$.book_jg是预期结果表达式(可以写多个),当预期结果和预期结果表达式从接口返回提取的值相等时就是断言成功
运单创建成功: $.msg
301: $.book_jg
格式是一个大列表嵌套一个或者多个小列表,几条sql断言就几个小列表
sql断言第一个值: db_test2,数据库对象,需要先在config.py配置里面写上数据库连接数据,然后去mysql_.py里面生成数据库对象,然后把对象名写在db_list=[‘db_test’,‘db_test2’]上。只有在db_list里面的数据库才可以进行断言使用
sql断言第二个值:预期结果,可以写明确的值,也可以去写$.book_jg去接口返回值里面拿数据作为预期结果
sql断言第三个值:逻辑运算符 < > ==
sql断言第四个值:sql语句,可以在sql语句里面使用${case_id}去接口返回里面拿值来用,和参数依赖一样都是使用jsonpath去提取的写法。


[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
assert_expression:
code: 201
body: 520
json:
运单创建成功: $.msg
301: $.book_jg
sql:
[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
配置邮箱的发送邮箱,和授权码(指定163邮箱和该邮箱的授权码)
收件人支持其他邮箱,填写格式如下
# 邮箱的地址
addresser = "xxn@163.com"
# 授权码
authorization_code = "xxxxxTN"
# 收件人
recipients=['xxxxx@gmail.com', 'lxxx@163.com']

可以自定义前置干什么后置干什么,我这边只写了后置数据统计和邮件发送

1、启动mock接口

2、配置环境,配置mock接口的协议和域名

3、配置环境名称和用例执行目录配置,最多支持2级目录,一般一个目录一个模块

4、用例编写
获取运单号:
path: /get_waybill_no
method: get
headers: '{"token": "${token}"}'
is_run: True
data:
file:
data_type:
extract_key:
waybill_no: $.waybill_no
assert_expression:
code: 200
body: 520
json:
lj520: $.waybill_no
sql:
[
['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}'],
['db_test', '$.title', '==', 'SELECT title FROM case_t where case_id=${case_id}'],
['db_test', '唤醒不了', '==', 'SELECT title FROM case_t where case_id=2']
]
录单:
path: /lu_dan?aa=${cc1}
method: post
headers: '{"token": "em123dca666333"}'
is_run: True
data:
'
{
"waybill_no":"${waybill_no}",
"lu_dan_ren":"${random_int(21)}",
"aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(21)}"}}]
}
'
file:
data_type: json
extract_key:
assert_expression:
code: 201
body: 520
json:
运单创建成功: $.msg
301: $.book_jg
sql:
[['db_test2', '$.book_jg', '<', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
5、执行测试

6.邮箱配置和报告查看
记得先配置邮箱哦
邮箱报告,这里面的一个报告连接就是allure报告的地址

allure报告


我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po