
接口文档生成流程 介绍 目前我们QA在测试过程中, 存在着接口文档不全或有出入(包括更新)的情况。 这时候我们一般会阅读开发编写的代码或者直截了当去问开发。 这2种方法的弊端都很明显, 即增加了沟通和时间成本。 自己看代码且不论QA对于开发语言的熟悉程度, 有的代码QA并不可见。独自研究费时费力, 去找开发询问的时候,得问到对应的人, 他们还需要花费时间精力去搜寻。 ==现在, 这些问题都将迎刃而解==。 原理介绍 通过swagger插件(如jar包)解析编写了接口注解的java代码, 而后通过生成的swagger.json文件解析出接口信息并导入接口文档管理工具(yapi)。 第一步: 编写注解 swagger是一个较为流行的接口文档管理工具, 但是这里我们不打算将他作为我们的大方向。其实接口文档的核心基本都已固定, 如path(route), 参数, 响应, 请求方式等。swagger在这点做得相当不错, 使用json-schema约束json字段的属性(required, example, type等)。 简而言之, 第一步就是通过注解对java中各个字段的参数做了约束, 通过插件生成json文档。 下面我们来看一个例子: example地址, 这是一个长得像外国人的中国老哥 我们来看下注解的具体实现 package com.github.kongchen.swagger.sample.wordnik.resource; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.*; import com.github.kongchen.swagger.sample.wordnik.model.LoginData; import javax.ws.rs.FormParam; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.Response; @Path("/login") @Api(value = "login", description = "登录接口") @Produces({"application/json"}) public class woodyTest { @POST @ApiOperation(value = "用户登录") @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid ID supplied"), @ApiResponse(code = 404, message = "Order not found")}) public Response getSuite( @ApiParam(value = "登录请求json参数", required = true) LoginData data) { System.out.println(data); return Response.ok().entity("").build(); } } ==图中的@POST, @ApiResponses, @Path等@== 意味都比较显著了吧, 因为我的java只有一点点语法基础, 所以理解可能有点出入, 我这里简单理解为注释的意思。如有不对求指教=。= 接下来我们来看看LoginData怎么写。 package com.github.kongchen.swagger.sample.wordnik.model; import io.swagger.annotations.ApiModelProperty; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import java.util.Date; @XmlRootElement(name = "LoginData") // 这是xml的信息, 我这里都去掉了不用 public class LoginData { @ApiModelProperty(value="用户名", name="user", example = "wuranxu") private String user; @ApiModelProperty(value="用户密码", name="pwd", example = "wodemimajiushimeiyoumima", required = true) private String pwd; @XmlElement(name = "user") public String getUser() { return user; } public void setUser(String user) { this.user = user; } @XmlElement(name = "pwd") public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } } 这个类里面, 有user和login属性, 分别给属性加了类似这样的注解 @ApiModelProperty(value="用户名", name="user", example = "wuranxu") 这里就是字段的约束。 第二步: 通过注解生成swagger.json 下载第一步那个小哥给出的demo, 解决好pom文件的依赖后。 在demo目录执行: mvn clean compile 可以看到图中目录生成了swagger.json 来看看生成的json 第三步: 导入yapi 先来介绍下yapi吧~ yapi是去哪儿的大前端团队开发,基于react+antd的一套接口文档管理工具。给个掌声, 真的很良心。 具体地址 大家可以试用了感受一下。 至于不需要yapi, 钟爱原生swagger的童鞋, 也可以直接将swagger.json放入你的本地swaggerUI中查看接口文档啦。 那么附上一张swagger的截图吧... 后话 其实缺点就是开发需要在每个model的类加上注解, 写每一个接口也需要注解, 开发不好惹千万千万不要推:) 当然还有第四步啦, 因为···这些都是手动干的啊, 没人有那么多精力去手动维护这些破json。预知后事如何, 请看下集预告。(写文档码字太久要去干活儿了)
茫茫题海好像旷野,突发奇想,想要记录一下曾经面试被虐的自己,看看自己当时是怎么被花式吊打的... Python常见的几个面试题 值传递和引用传递 下面代码会输出什么: def f(x,l=[]): for i in range(x): l.append(i*i) print l f(2) f(3,[3,2,1]) f(3) 我的错误答案: 都是值传递(来自16年8月左右的菜菜的自己) 类的成员变量和继承 class Parent(object): x = 1 class Child1(Parent): pass class Child2(Parent): pass print Parent.x, Child1.x, Child2.x Child1.x = 2 print Parent.x, Child1.x, Child2.x Parent.x = 3 print Parent.x, Child1.x, Child2.x 我的答案, 哈哈哈,有点羞耻···child1的值我一直以为是沿用Parent的,来自16年8月笨笨的自己 lambda惰性相关 def multipliers(): return [lambda x : i * x for i in range(4)] print [m(2) for m in multipliers()] 我的答案: [0, 2, 4, 6] 面壁面壁 实际答案: [6, 6, 6, 6] Git 之前用的啥版本控制工具 答svn, git有了解一点,但是没有实际投入使用。 git 拉取代码用啥命令 答: clone... 哈哈哈,无力吐槽,一时想不起pull答了个clone, 面试官还能坚持问我我还是挺佩服的。 requests requests里怎么传递post参数的 答: 我通过params传递的 params = json.dumps(dict) 那用json参数可以吗 答: 没有试过, 应该不可以吧。(orz, 我现在都是用json参数来传了) 这家就到这里了,很显然没有然后了。。 未完。。。
安装zlib相关依赖 解决zipimport.ZipImportError: can’t decompress data和pip3 ssl证书问题 sudo yum -y install zlib* sudo yum install openssl-devel 找到Python3下载链接 进入官网 选择对应版本 选一个你喜欢的Python3版本, 建议3.4以后(这里我选择3.6) 选择压缩包 右键赋值链接地址 比如这里是https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz 下载 wget https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz 解压 tar xvf Python-3.6.5.tar.xz 进入目录编译 configure sudo ./configure make sudo make install sudo make install 安装完成
介绍 这个模板改编自这位外国老哥 效果图 错误截图 录像 失败的case可以点击"view"查看报错信息, 也可以点击screenshot查看截图信息,更可以点击replay查看该条用例的一个完整运作过程! 加入了测试环境 加入了截图和录像功能 加入了echarts也就是这个大饼 觉得好看的可以联系我,哈哈哈!!!
以后会陆续补充 偶然在Python Cookbook看到一个format操作,想到一个问题, 感觉用了!r之后,会把传入的对象按照原来形式保留 d = {"foo": "bar"} "value in d is {!r}".format(d["bar"]) 想到一个用处,举个例子: params = ("woody", "suxiaoji", "zy") sql = "select userId from user where username in {!r}".format(params) print(sql)