/*
* 鉴权:token、cookie、session
* 1、cookie:客户端(浏览器)本地缓存==>存在磁盘本地某个路径
* 存储一些小的明文信息,不会放非常隐秘的信息
* cookie是如何生成的?客户端(JS脚本)和服务端(Java、Python)都能生成,一般都是服务器生成。
*
* NAME=VALUE 赋予cookie的名称和其值(必填项)
* expires=DATE cookie的有效期(被max-age取代)
* path=PATH cookie适用路径,默认为当前路径
* domain=域名 cookie适用域名,默认当前域名
* max-age 用秒来设置cookie生存期
* size 大小
* HttpOnly 只有在http请求头中会带cookie信息,禁止通过JS访问
* secure 设置是否只能通过HTTPS来传递此条cookie
*
* 2、session:服务端缓存==>存储在内存中或者数据库中,断开了连接(关闭浏览器)session就会失效。
* 默认失效时间为30分钟。优点:可以存储任意信息,缺点:耗内存;
* session是如何生成的?服务端生成,使用cookie回写到客户端(jsessionId),客户端每次发送请求时自动携带该cookie(jsessionId)。
*
* 3、token:票据==>存储在客户端(浏览器)对header或body中
* 优点:不存储在服务端。一般只用来做鉴权存储用户相关信息。
* token是如何生成的?服务端生成,携带在header或body中回写客户端,客户端以同样的方法传递给服务端。
*
* 4、如何实现鉴权
* a、获取到对应的jsession或者对应token字符串;
* b、在请求的同时添加上它们;
* token子验证过程:结果是相等的,算法是相同的。
*
* 5、代码鉴权逻辑:
* a、在获取Post请求响应之后(HttpUtils),判断响应体中是否还有token字符;
* b、如果含有token存储到env环境变量中,(Map<String,String>)
* c、每次post、get、patch请求之前,调用添加token的方法addToken
* d、addToken中会判断env环境中是否有Token,如果有添加到对应的请求头中
* */
package com.lemon.utils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.util.Arrays;
public class HttpUtils {
/*
* static 修饰方法和变量
* 静态特点:
* 0、直接用类名点击调用
* 1、被所有的对象共享(环境变量)
* 2、所有类加载而加载
*/
public static void get(String url, String params) throws Exception {
// 1\2\3 login?username=15500110011&password=123456
HttpGet httpGet = new HttpGet(url+"?"+params);
// 4、有参传参、有头加头
httpGet.addHeader("X-Lemonban-Media-Type", "lemonban.v1");
// 5、点击发送按钮,模拟客户端发送请求
CloseableHttpClient client = HttpClients.createDefault();
//记录开始时间
long startTime = System.currentTimeMillis();
// 由客户端发出请求,6、接收响应
CloseableHttpResponse response = client.execute(httpGet);
//记录结束时间
long endTime = System.currentTimeMillis();
// 获取body
HttpEntity entity = response.getEntity();
// 获取状态码
int statusCode = response.getStatusLine().getStatusCode();
// 获取header
Header[] headers = response.getAllHeaders();
System.out.println(EntityUtils.toString(entity));
System.out.println(statusCode);
System.out.println(Arrays.toString(headers));
System.out.println("接口响应时间(毫秒):" + (endTime - startTime));
}
public static void jsonPost(String url, String params) throws Exception {
HttpPost httpPost = new HttpPost(url);
// 有参传参、有头加头
httpPost.setHeader("X-Lemonban-Media-Type", "lemonban.v1");
// Post请求必须添加content-type
httpPost.setHeader("Content-Type", "application/json");
// 传参
httpPost.setEntity(new StringEntity(params));
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getAllHeaders();
System.out.println(EntityUtils.toString(entity));
System.out.println(statusCode);
System.out.println(Arrays.toString(headers));
}
public static void fromPost(String url, String params) throws Exception {
HttpPost httpPost = new HttpPost(url);
httpPost.setHeader("X-Lemonban-Media-Type", "lemonban.v1");
httpPost.setHeader("Content-Type", "application/x-www-from-urlencoded;charset=UTF-8");
httpPost.setEntity(new StringEntity(params));
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = httpClient.execute(httpPost);
HttpEntity entity = response.getEntity();
int statusCode = response.getStatusLine().getStatusCode();
Header[] headers = response.getAllHeaders();
System.out.println(EntityUtils.toString(entity));
System.out.println(statusCode);
System.out.println(Arrays.toString(headers));
}
public static void main(String[] args) {
}
}
/*
* 1、allure
* Maven常用命令:
* test:执行test文件夹中所有代码
* package:把当前项目打包(会生成test)
* clean:清空当前项目下的Maven生产的文件
* install:把jar包安装到本地仓库(会执行test、package)
*
* 1、导入allure坐标
* 2、导入surefire插件
* 3、运行clean test(生成报表数据)
* 4、运行io.qameta.allure:allure-maven:server 启动报表服务器
* 5、如果你需要加上一些文字说明
* (1)@Test(dataProvider = "datas1",description = "充值测试") // DTO数据传输
* (2)@Step("回写Excel") 详细描写自动化程序的每个执行步骤
* //其他注释:
* Features:标注主要功能模块
* Stories:标注Features功能模块下的分支功能
* Title:标注Stories下的测试用例名称
* Severity:标注测试用例的重要级别
* Description:标注测试用例的描述
*
* 2、mock-server
* 当接口尚未开发完毕,创建一个虚拟接口,继续测试;
* https://github.com/dreamhead/moco
* https://github.com/dreamhead/moco/blob/master/moco-doc/apis.md
*
* 3、Jenkins
* 持续抓取版本库最新代码,定时构建(执行代码),生成对应构建信息,发送邮件,生生报表。
*
*/