将SoapUI项目导入Postman
- 发表于2016年4月27日
- 作者Abhijit Kane
邮递员对Swagger的支持意味着可以点击几下!您可以获得邮件收集,其中包含请求中填写的URL,标头和有效载荷数据。
这是一个快速的演练:
- 我们将从使用Facebook的API创建一个SoapUI项目开始。在那种人Smartbear有一吨的开源项目的GitHub上。其中之一是“肥皂样品项目”,其中有一些广泛使用的API的项目定义。对于本指南,我们将选择Facebook。
- 通过https://github.com/SmartBear/soapui-sample-projects/blob/master/Facebook/Facebook-soapui-project.xml导航到Facebook项目的项目定义。在本地保存此文件。
- 打开SoapUI 单击导入按钮,然后选择刚刚下载的文件。
- 您应该在左侧栏中看到API端点的层次结构。每个端点+方法组合将具有相关联的数据,如URL参数和头。这是我们将导入Postman的数据。
- 右键单击“Facebook”项目,然后单击“导出Swagger”。您需要为API提供基本路径。对于Facebook而言graph.facebook.com。如果您打开请求,您可以在“端点”字段中找到此信息。选择“Graph API”作为要导出的API,填写基本路径,然后选择一个目标位置来保存Swagger文件。
- 我们现在可以直接将这个Swagger文件导入Postman!打开您的邮递员副本,然后点击顶部导航栏中的“导入”。在“导入文件”选项卡中,选择您在步骤5中保存的文件。
- 您应该会看到一个名为“Graph API”的导入集合,它具有SoapUI中定义的所有端点。
- 您会注意到Postman会自动将请求分组到文件夹中。此外,鼓励使用环境变量 - {{user}}符号表示您可以简单地添加一个名为“user” 的环境变量,它的值将在发送请求时被替换。
当您将文件导入Postman时,SoapUI的某些方面如加载测试不会被反映出来。我们正在寻找更好地处理SoapUI测试功能的方法,但这将是另一次的博文。
行为驱动
在Postman中编写行为驱动的API测试环境
由于显而易见的原因,在Postman中拥有相同的测试规范样式听起来恰到好处。毕竟,有人可能认为他们正在测试回应的行为!更不用说有组织的测试,无缝创造和拆卸的灯具,yada yada yada的无尽的好处!
我个人喜欢在邮递员中写下如下所示的测试。(不介意上述xkcd: - /)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
describe("response", function () {
var responseJSON;
it("must be a valid JSON", function () {
responseJSON = JSON.parse(responseBody);
expect(typeof responseJSON).toBe("object");
});
describe("json", function () {
it("must not have error object", function () {
expect(responseJSON.error).toNotBeOk();
});
it("must have a message", function () {
expect(responseJSON.message).toBeOk();
});
});
});
|
因此,我开始了我的交通时间项目,以创建一个很小的(非常微小的)测试框架,我可以在我的邮递员收藏中并使用它来编写测试。我个人开始使用它,并认为分享它可能会帮助我们BDD爱好者。框架最终成为一个大约0.7kb的精神,我命名的脚本
描述它
(这样的创造力!)
“describe-it”测试框架脚本
1
2
3
4
5
6
7
8
|
(typeof tests!=='object')&&(tests={});var
it=((it=function(k,v){it.d.push(k);it.t[it.d]=1;it.b.forEach(it.c);try{v()}catch(e){it.t[it.d]=0;setTimeout&&setTimeout(function(){throw e;})}it.a.forEach(it.c);it.d.pop()}),
it.a=[],it.b=[],it.c=function(x){x()},it.d=[],it.d.toString=function(){return this.join(' ')},
it.t=tests,it.x=function(v){this.v=v},it.xp=it.x.prototype,it.xp.toBe=function(x){(this.v!==x)&&it._()},
it.xp.toNotBe=function(x){(this.v===x)&&it._()},it.xp.toEql=function(x){(this.v!=x)&&it._()},
it.xp.toNotEql=function(x){(this.v==x)&&it._()},it.xp.toBeOk=function(){!this.v&&it._()},
it.xp.toNotBeOk=function(){this.v&&it._()},it),describe=function(k,v){it.d.push(k);v();it.d.pop()},
expect=function(v){return new it.x(v)},beforeEach=it.b.push.bind(it.b),afterEach=it.a.push.bind(it.a);
|
脚本公开了以下功能:
- describe (testgroup:string, tests:function);
- it (testname:string, test:function);
- beforeEach (setup:function);
- afterEach (teardown:function);
- expect (value); // assertion function
这些功能类似于摩卡/茉莉花,因此参考他们的文档是一个明显的捷径 -
http://jasmine.github.io/2.0/introduction.html
“expect”断言功能支持以下检查:
- expect(something).toBeOk(); // allows truthy variables
- expect(something).toNotBeOk(); // allows falsey variables
- expect(something).toBe(somethingElse); // checks equality
- expect(something).toNotBe(somethingElse); // checks inequality
- expect(something).toEql(somethingElse); // checks similarity
- expect(something).toNotEql(somethingElse); // checks dissimilarity
我们可能需要更多的这些,特别是与API测试相关的。(很想听到更多的评论。)
在邮递员中使用脚本
在邮递员中使用这两个部分:
- 将脚本保存为全局变量
- 在测试脚本中,在使用框架之前,eval全局变量
将脚本保存为全局变量
将脚本保存为全局变量允许我在多个请求中重新使用测试框架脚本,而无需手动添加它们。可以简单地将脚本的内容添加到具有名称的全局变量(或环境变量)中
describe-it-test-script
。文档文章
https://www.getpostman.com/docs/environments
概述如何设置和使用这些变量。
以下集合从要点中提取测试框架(以便我可以使用最新内容进行更新),并将其保存在全局变量中。随后的请求使用此全局变量在每个请求的测试脚本中获取测试框架。
使用此测试框架的样本集合:
导入您的邮递员,并参考在其中称为“describe-it”的集合中编写的测试。
在测试中使用脚本
将脚本存储在变量中后,可以通过
eval
在脚本中运行来轻松地在任何测试中使用脚本。您的测试的第一行将看起来像以下内容:
1
2
3
|
eval(postman.getGlobalVariable("describe-it-test-script"));
|
我知道 - eval是邪恶的!但这是一个单独的讨论。如果要完全避免“eval”,只需在测试开始时粘贴最小化的脚本即可。但是这样会使测试看起来有些丑陋。
发布此,你可以开始使用
describe
,
it
,
expect
测试框架等功能正常。
使用测试框架
1
2
3
4
5
6
7
8
9
10
11
12
|
eval(postman.getGlobalVariable("describe-it-test-script"));
describe ("response", function () {
it ("must have html content type header", function () {
expect(responseHeaders['Content-Type'])
.toBe('text/html; charset=utf-8');
});
it ("must return a 200 status code", function () {
expect(responseCode.code).toEql(200);
});
});
|
我们可以根据需要编写尽可能多的测试,并
describe
根据需要嵌入多个块。如果一个程序
it
段中有运行时错误,其他测试仍将继续执行。
怎么运行的在这篇文章中共享 的 集合(名为describe-it)的 示例包含使用此微框架编写的测试示例。它具有写入失败和传递场景的测试。在邮差集合运行中运行集合后,它会将测试结果输出到各自的 describe 块中。
该
it
函数执行
try-catch
块内的测试参数功能。如果函数执行没有错误,它会将测试描述参数(以及它的父
describe
块的描述)添加到Postman
tests
变量中,并将其设置为真实值。在
expect
断言失败或发生其他错误的情况下,将
tests
对象键设置为falsey值。
在上面的例子中,如果所有的测试都通过,
tests
对象就像这样
1
2
3
4
|
tests: {
"response must have html content type header": 1,
"response must return a 200 status code": 1
}
|