目录
自定义:(放在Pre-request Script中,要设置为全局变量)
Home 主页
Workspace 工作空间
Collections 项目集合
Apis api文档
Environments 环境变量
Mock Servers 虚拟服务器
Monitors 监听器
History 历史记录
1、New,在这里创建新的请求、集合或环境;还可以创建更高级的文档、Mock Server 和 Monitor以及API。
2、Import,这用于导入集合或环境。有一些选项,例如从文件,文件夹导入,链接或粘贴原始文本。
3、Runner,可以通过Collection Runner执行自动化测试。后续介绍。
4、Open New,打开一个新的标签,Postman窗口或Runner窗口。
5、My Workspace - 可以单独或以团队的形式创建新的工作区。
6、Invite - 通过邀请团队成员在工作空间上进行协同工作。
7、History - 所有秦秋的历史记录,这样可以很容易地跟踪你所做的操作。
8、Collections - 通过创建集合来组织你的测试套件。每个集合可能有子文件夹和多个请求。请求或文件夹也可以被复制。
9、Request tab - 这将显示您正在处理的请求的标题。默认对于没有标题的请求会显示“Untitled Request”。
10、HTTP Request - 单击它将显示不同请求的下拉列表,例如 GET, POST, COPY, DELETE, etc. 在测试中,最常用的请求是GET和POST。
11、Request URL - 也称为端点,显示API的URL。.
12、Save - 如果对请求进行了更改,必须单击save,这样新更改才不会丢失或覆盖。
13、Params - 在这里将编写请求所需的参数,比如Key - Value。
14、Authorization - 为了访问api,需要适当的授权。它可以是Username、Password、Token等形式。
15、Headers - 请求头信息
16、Body - 请求体信息,一般在POST中才会使用到
17、Pre-request Script - 请求之前 先执行脚本,使用设置环境的预请求脚本来确保在正确的环境中运行测试。
18、Tests - 这些脚本是在请求期间执行的。进行测试非常重要,因为它设置检查点来验证响应状态是否正常、检索的数据是否符合预期以及其他测试。
19、Settings - 最新版本的有设置,一般用不到。
Params url方式传参,
Authorzation 鉴权
Headers 请求头
Body 用于post 请求传参
None 代表没有参数
Form-date 既可以传键值对参数,也可以传文件
X-www-form-urlencoded 只能传键值对
Raw:
Text JavaScript Json HTML XML
Binary 文件以二进制传参
Pre-request Script 请求之前的脚本
Tests 请求之后的断言
Setting 设置
Body 接口返回的数据
Pretty 以Json、html 、xml..不同的格式查看返回的数据
Raw 表示以文本的形式查看
Preview 以网页的形式查看返回的数据
Cookies 响应的cookies 信息
Headers 响应头
Test Results 断言的结果
// 获取状态码
var code=responseCode.code;
// 打印
tests[code]=true;
//获取状态码名称
var codename=responseCode.name;
tests[codename]=true;
//获取响应时间
var time=responseTime;
tests[time]=true;
//获取响应头
var header=postman.getResponseHeader;
tests[header]=true;
//获取响应体
var body=responseBody
tests[body]=true
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
| 状态码 | 状态码英文名称 | 中文描述 |
| 100 | Continue | 继续。客户端应继续其请求 |
| 101 | Switching Protocols | 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 |
| 200 | OK | 请求成功。一般用于GET与POST请求 |
| 201 | Created | 已创建。成功请求并创建了新的资源 |
| 202 | Accepted | 已接受。已经接受请求,但未处理完成 |
| 203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
| 204 | No Content | 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 |
| 205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
| 206 | Partial Content | 部分内容。服务器成功处理了部分GET请求 |
| 300 | Multiple Choices | 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 |
| 301 | Moved Permanently | 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 |
| 302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
| 303 | See Other | 查看其它地址。与301类似。使用GET和POST请求查看 |
| 304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
| 305 | Use Proxy | 使用代理。所请求的资源必须通过代理访问 |
| 306 | Unused | 已经被废弃的HTTP状态码 |
| 307 | Temporary Redirect | 临时重定向。与302类似。使用GET请求重定向 |
| 400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
| 401 | Unauthorized | 请求要求用户的身份认证 |
| 402 | Payment Required | 保留,将来使用 |
| 403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
| 404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
| 405 | Method Not Allowed | 客户端请求中的方法被禁止 |
| 406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
| 407 | Proxy Authentication Required | 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 |
| 408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
| 409 | Conflict | 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 |
| 410 | Gone | 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 |
| 411 | Length Required | 服务器无法处理客户端发送的不带Content-Length的请求信息 |
| 412 | Precondition Failed | 客户端请求信息的先决条件错误 |
| 413 | Request Entity Too Large | 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 |
| 414 | Request-URI Too Large | 请求的URI过长(URI通常为网址),服务器无法处理 |
| 415 | Unsupported Media Type | 服务器无法处理请求附带的媒体格式 |
| 416 | Requested range not satisfiable | 客户端请求的范围无效 |
| 417 | Expectation Failed | 服务器无法满足Expect的请求头信息 |
| 500 | Internal Server Error | 服务器内部错误,无法完成请求 |
| 501 | Not Implemented | 服务器不支持请求的功能,无法完成请求 |
| 502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
| 503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
| 504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
| 505 | HTTP Version not supported | 服务器不支持请求的HTTP协议的版本,无法完成处理 |
{{变量名}}
Pre-request Script是请求前的编程。
Tests是根据请求完后得到的数据编程。
①先发请求,在Tests中写入:
//console.log(responseBody)
//使用json提取器,实现关联
var token=JSON.parse(responseBody)
//通过 token 变量中 access_token 这个 key 拿到值
var finaltoken=token.access_token
//打印变量
console.log(finaltoken)
//将 finaltoken 设置全局变量 gettoken
pm.globals.set("gettoken", finaltoken);
//正则表达式取到access_token:字符串
var token=responseBody.match(new RegExp('"access_token":"(.*?)"'))
//取到hqtoken[1]
token=token[1]
//设为全局变量
pm.globals.set("token",token)
②在第二个请求中:
调用
{{gettoken}}
{{$timestamp}} 生成当前时间的时间戳
{{$randomInt}} 生成随机数
{{$guid}} 生成速记GUID字符串
如:var time=Date.now()
pm.globals.set("time1",time)
引用:{{time1}}
(断言使用内置动态参数无效,只能使用自定义动态参数,使用时要拼接)
"字符串“+pm.global.get("变量名")
1、Status code is 200 检查响应状态码是否为200
pm.test("Status code is 200", function () {
pm.response.to.have.status(200);
});
2、Body matches string 检查响应中是否包含指定字符串
例①
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include(pm.variables.get("time")); // 是否包含变量time
});
例②
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include("tags"); // 是否包含tags
});
3、json value check 检查响应中json 值
pm.test("Your test name", function () {
var jsonData = pm.response.json();
pm.expect(jsonData.errmsg).to.eql("ok"); // 检查json中errmsg是否等于"ok"
});
4、Is equal to a string 检查响应等于一个字符串
pm.test("Body is correct", function () {
pm.response.to.have.body('{"errcode":0,"errmsg":"ok"}'); // 是否等于{"err......}
});
5、Response heads Content- Type 检查是否包含 Content- Type 这种响应头
pm.test("Content-Type is present", function () {
pm.response.to.have.header("Content-Type");
});
6、Response time is less than 200ms 检查请求耗时小于200ms
pm.test("Response time is less than 300ms", function () {
pm.expect(pm.response.responseTime).to.be.below(300); // 耗时是否小于300ms
});
(如果返回值中存在有access_token,那就打印它,并将他的值设为全局变量)
if (responseBody.search("access_token")!=-1){
//使用正则表达式提取器方式实现接口关联 ,返回的数据 匹配,
var res=responseBody.match(new RegExp('"access_token":"(.*?)"'))
//打印匹配结果
console.log(res)
//设置全局变量
pm.globals.set("token_q", res[1]);
}
pm.test("Body matches string", function () {
pm.expect(pm.response.text()).to.include(pm.globals.get("time")); // 是否包含全局变量time
});
第一行是变量值
第二、三行等 是用例 列之间用英文逗号(,)分隔
如:
k1,k2,k3v
v11,v21,v31
v12,v22,v32
v13,v23,v33
注意:如果是空值,那就用逗号隔开,不填数据,表示空值
k1,k2,k3v
v11,v21,v31
,v22,v32
v13,,v33
[
{ "key":"v","key1":"v1" } // 用例
{ "key":"v","key1":"v1" } // 用例
]
①先下载node.js——https://nodejs.org/en/download/
②安装——详情
1.https://nodejs.org/en/下载node.js,一路安装
2.node -v ,npm -v查看安装是否成功
3.npm install -g newman 安装Newman,完成后 Newman -v
4.npm install -g newman-reporter-html 安装HTML插件
5.把postman脚本通过集合导出来,环境变量和全局变量都可以导出来,保存成json格式
这里导出的是postman驱动文件:

postman环境变量导出:

postman全局变量导出:

6. 通过命令行输入运行:newman run D:postman数据驱动.postman_collection.json -d D:postman数据.csv -r html --reporter-html-export D:postmanzhixing.html
参数解读:-d 表示驱动文件位置
-r表示report的形式,有三种cli, json, html; cli是在控制台显示结果
-e 后接环境变量的存放位置
-g 后接全局变量的位置
-n 值测试集合循环次数
windows建定时跑任务:计算机-管理-新建任务:
常规选项:创建名称--不管用户是否登录都要运行(点击更改用户或组--输入运行此任务的用户名--点击检查名称-点击确定)
新建触发器:修改要跑的时间,下面的 ”已启用”打上对钩---点击确定
新建操作:选择要运行的脚本位置
7.其他样式的报告需要安装插件
先安装插件,在命令行输入运行:npm install -g newman-reporter-htmlextra
在命令行输入命令:newman run D:postman数据驱动.postman_collection.json -d D:postman数据.csv -r htmlextra
tips:
①从postman导出的是驱动文件:D:postman数据驱动.postman_collection.json
②用6命令生成的报告在指定位置(同一位置且重名的话会覆盖上一次的报告):D:postmanzhixing.html
③用7生成的报告,会自动新建一个newman文件,报告存放在文件中
我正在学习如何使用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
类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
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我正在为一个项目制作一个简单的shell,我希望像在Bash中一样解析参数字符串。foobar"helloworld"fooz应该变成:["foo","bar","helloworld","fooz"]等等。到目前为止,我一直在使用CSV::parse_line,将列分隔符设置为""和.compact输出。问题是我现在必须选择是要支持单引号还是双引号。CSV不支持超过一个分隔符。Python有一个名为shlex的模块:>>>shlex.split("Test'helloworld'foo")['Test','helloworld','foo']>>>shlex.split('Test"
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)