一.问题描述

在做自动化测试时,有两个测试方法,loginTrue方法和addUser方法,原则上只有loginTrue方法执行成功获取到cookie,并存储到TestConfig的静态对象cookiestore里面;下次从TestConfig拿到这个cookie请求addUser。
代码如下:
LoginTest类:

package com.course.cases;import com.course.config.TestConfig;
import com.course.model.InterfaceName;
import com.course.model.LoginCase;
import com.course.utils.ConfigFile;
import com.course.utils.MybatisUtils;
import lombok.extern.log4j.Log4j2;
import org.apache.http.client.CookieStore;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.session.SqlSession;
import org.testng.Assert;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;import java.io.IOException;
import java.net.URISyntaxException;@Log4j2
public class LoginTest {private CookieStore cookieStore;@BeforeTest(groups = "loginTrue",description = "测试准备工作")public void beforeTest(){TestConfig.addUserUrl = ConfigFile.getUrl(InterfaceName.ADD_USER);TestConfig.getUserInfoUrl = ConfigFile.getUrl(InterfaceName.GET_USER_INFO);TestConfig.getUserListUrl = ConfigFile.getUrl(InterfaceName.GET_USER_LIST);TestConfig.loginUrl = ConfigFile.getUrl(InterfaceName.LOGIN);TestConfig.updateUserInfoUrl = ConfigFile.getUrl(InterfaceName.UPDATE_USER_INFO);TestConfig.client = HttpClients.custom().setDefaultCookieStore(TestConfig.cookieStore).build();}@Test(groups = "loginTrue",description = "用户登录成功接口测试")public void loginTrue() throws URISyntaxException {SqlSession sqlSession = MybatisUtils.openSession();LoginCase loginCase = sqlSession.selectOne("loginCase",1);System.out.println(loginCase);System.out.println(TestConfig.loginUrl);log.info("********开始验证loginTrue api*********");//发请求,获取结果String result = getResult(loginCase,TestConfig.loginUrl);log.info("请求http:localhost/v1/login的结果是------>" + result);//验证返回结果Assert.assertEquals(loginCase.getExpected(),result);log.info("********loginTrue api 验证通过*********");}//getResult这个是具体发送请求的方法private String getResult(LoginCase loginCase, String loginUrl) throws URISyntaxException {//1.创建URLBuilder对象方法URIBuilder uriBuilder = new URIBuilder(loginUrl);uriBuilder.setParameter("userName",loginCase.getUserName()).setParameter("password",loginCase.getPassword());//2.创建post方法HttpPost post = new HttpPost(uriBuilder.build());//3.获得client对象,并设置cookiestoreTestConfig.client = HttpClients.custom().setDefaultCookieStore(cookieStore).build();//4.设置请求头post.setHeader("content-type","application/json");//5.设置cookie,已在3设置//6.请求api,获得响应结果CloseableHttpResponse response = null;String res = null;try {response = TestConfig.client.execute(post);res = EntityUtils.toString(response.getEntity(),"utf-8");//7.存储cookies到TestConfiglog.info(cookieStore);TestConfig.cookieStore = cookieStore;} catch (IOException e) {e.printStackTrace();} finally {try {response.close();TestConfig.client.close();} catch (IOException e) {e.printStackTrace();}}//7.返回return res;}@Test(groups = "loginFalse",description = "用户登录失败接口测试",enabled = false)public void loginFalse() throws URISyntaxException {SqlSession sqlSession = MybatisUtils.openSession();LoginCase loginCase = sqlSession.selectOne("loginCase",2);System.out.println(loginCase);System.out.println(TestConfig.loginUrl);log.info("********开始验证loginFalse api*********");//发请求,获取结果String result = getResult(loginCase,TestConfig.loginUrl);log.info("请求http:localhost/v1/login的结果是------>" + result);//验证返回结果Assert.assertEquals(loginCase.getExpected(),result);log.info("********loginFalse api 验证通过*********");}
}

AddUserTest类

package com.course.cases;import com.course.config.TestConfig;
import com.course.model.AddUserCase;
import com.course.utils.MybatisUtils;
import lombok.extern.log4j.Log4j2;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.ibatis.session.SqlSession;
import org.json.JSONObject;
import org.testng.Assert;
import org.testng.annotations.Test;import java.io.IOException;@Log4j2
public class AddUserTest {@Test(dependsOnGroups = "loginTrue",description = "添加用户接口")public void addUser(){SqlSession sqlSession = MybatisUtils.openSession();AddUserCase addUserCase = sqlSession.selectOne("addUser",1);System.out.println(addUserCase);System.out.println(TestConfig.addUserUrl);log.info("********开始验证addUser api*********");//发请求,获取结果String result = getResult(addUserCase,TestConfig.addUserUrl);log.info("请求http:localhost/v1/addUser的结果是------>" + result);//验证返回结果Assert.assertEquals(result,addUserCase.getExpected());log.info("********addUser api 验证通过*********");}private String getResult(AddUserCase addUserCase,String testUrl){//1.创建post方法HttpPost post = new HttpPost(testUrl);//2.获得client对象,并设置cookiestore(取自TestConfig)TestConfig.client = HttpClients.custom().setDefaultCookieStore(TestConfig.cookieStore).build();//3.JSONObject设置请求json数据,利用StringEntity携带在post请求里JSONObject param = new JSONObject();param.put("userName",addUserCase.getUserName());param.put("password",addUserCase.getPassword());param.put("sex",addUserCase.getSex());param.put("age",addUserCase.getAge());param.put("permission",addUserCase.getPermission());param.put("isDelete",addUserCase.getIsDelete());StringEntity entity = new StringEntity(param.toString(),"utf-8");post.setEntity(entity);//4.设置请求头post.setHeader("content-type","application/json");//5.设置cookie,已在2设置//6.请求api,获得响应结果CloseableHttpResponse response = null;String res = "false";try {response = TestConfig.client.execute(post);res = EntityUtils.toString(response.getEntity(),"utf-8");} catch (IOException e) {e.printStackTrace();} finally {try {response.close();TestConfig.client.close();} catch (IOException e) {e.printStackTrace();}}//7.返回return res;}
}

运行testng.xml发现addUser方法运行失败,

二.问题解决

1.查看服务端报错日志

也就是说服务端进行校验的时候没有获取到cookie;

2.在AddUserTest里做断点调试,看下有没有拿到TestConfig的cookiestore

如图,拿到的cookiestore是null;

3.接着在LoginTest里做断点调试,看看是没有存储进去还是返回的response里面没有cookie信息

如图,response里面是包含cookie信息的,但是没有存储进cookiestore对象;

4.排查我的cookiestore代码,
由以下关键代码组成,

发现我只是声明了一个cookiestore对象,但是没有用new关键字实例化

5.修改代码如下:

6.再次调试运行LoginTest类,此时可以成功获取到cookie啦

7.再次运行自动化测试代码


11:46:02.125 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
11:46:02.128 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1715248762.
11:46:02.128 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@663c9e7a]
11:46:02.128 [main] DEBUG com.course.model.addUser - ==>  Preparing: select * from add_user_case where id=?
11:46:02.128 [main] DEBUG com.course.model.addUser - ==> Parameters: 1(Integer)
11:46:02.129 [main] DEBUG com.course.model.addUser - <==      Total: 1
AddUserCase(id=1, userName=test1, password=111, age=11, sex=1, permission=1, isDelete=0, expected=true)
http://localhost:8080/v1/addUser
11:46:02.129 [main] INFO com.course.cases.AddUserTest - ********开始验证addUser api*********
11:46:02.137 [main] DEBUG org.apache.http.client.protocol.RequestAddCookies - CookieSpec selected: default
11:46:02.137 [main] DEBUG org.apache.http.client.protocol.RequestAddCookies - Cookie [version: 0][name: JSESSIONID][value: 080C66D4A4D30502096CBF692EE3E688][domain: localhost][path: /][expiry: null] match [localhost:8080/v1/addUser]
11:46:02.137 [main] DEBUG org.apache.http.client.protocol.RequestAddCookies - Cookie [version: 0][name: login][value: true][domain: localhost][path: /v1][expiry: null] match [localhost:8080/v1/addUser]
11:46:02.137 [main] DEBUG org.apache.http.client.protocol.RequestAuthCache - Auth cache not set in the context
11:46:02.137 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection request: [route: {}->http://localhost:8080][total kept alive: 0; route allocated: 0 of 2; total allocated: 0 of 20]
11:46:02.137 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection leased: [id: 1][route: {}->http://localhost:8080][total kept alive: 0; route allocated: 1 of 2; total allocated: 1 of 20]
11:46:02.138 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Opening connection {}->http://localhost:8080
11:46:02.138 [main] DEBUG org.apache.http.impl.conn.DefaultHttpClientConnectionOperator - Connecting to localhost/127.0.0.1:8080
11:46:02.138 [main] DEBUG org.apache.http.impl.conn.DefaultHttpClientConnectionOperator - Connection established 127.0.0.1:56145<->127.0.0.1:8080
11:46:02.138 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Executing request POST /v1/addUser HTTP/1.1
11:46:02.138 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Target auth state: UNCHALLENGED
11:46:02.138 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Proxy auth state: UNCHALLENGED
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> POST /v1/addUser HTTP/1.1
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> content-type: application/json
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> Content-Length: 90
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> Host: localhost:8080
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> Connection: Keep-Alive
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_45)
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> Cookie: JSESSIONID=080C66D4A4D30502096CBF692EE3E688; login=true
11:46:02.138 [main] DEBUG org.apache.http.headers - http-outgoing-1 >> Accept-Encoding: gzip,deflate
11:46:02.138 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "POST /v1/addUser HTTP/1.1[\r][\n]"
11:46:02.138 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "content-type: application/json[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "Content-Length: 90[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "Host: localhost:8080[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "Connection: Keep-Alive[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_45)[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "Cookie: JSESSIONID=080C66D4A4D30502096CBF692EE3E688; login=true[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "Accept-Encoding: gzip,deflate[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "[\r][\n]"
11:46:02.139 [main] DEBUG org.apache.http.wire - http-outgoing-1 >> "{"password":"111","isDelete":"0","sex":"1","permission":"1","userName":"test1","age":"11"}"
11:46:02.145 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "HTTP/1.1 200 [\r][\n]"
11:46:02.145 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "Content-Type: application/json;charset=UTF-8[\r][\n]"
11:46:02.145 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "Transfer-Encoding: chunked[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "Date: Thu, 10 Jun 2021 03:46:02 GMT[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "4[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "true[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.headers - http-outgoing-1 << HTTP/1.1 200
11:46:02.148 [main] DEBUG org.apache.http.headers - http-outgoing-1 << Content-Type: application/json;charset=UTF-8
11:46:02.148 [main] DEBUG org.apache.http.headers - http-outgoing-1 << Transfer-Encoding: chunked
11:46:02.148 [main] DEBUG org.apache.http.headers - http-outgoing-1 << Date: Thu, 10 Jun 2021 03:46:02 GMT
11:46:02.148 [main] DEBUG org.apache.http.impl.execchain.MainClientExec - Connection can be kept alive indefinitely
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "0[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.wire - http-outgoing-1 << "[\r][\n]"
11:46:02.148 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection [id: 1][route: {}->http://localhost:8080] can be kept alive indefinitely
11:46:02.148 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection released: [id: 1][route: {}->http://localhost:8080][total kept alive: 1; route allocated: 1 of 2; total allocated: 1 of 20]
11:46:02.148 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection manager is shutting down
11:46:02.148 [main] DEBUG org.apache.http.impl.conn.DefaultManagedHttpClientConnection - http-outgoing-1: Close connection
11:46:02.148 [main] DEBUG org.apache.http.impl.conn.PoolingHttpClientConnectionManager - Connection manager shut down
11:46:02.148 [main] INFO com.course.cases.AddUserTest - 请求http:localhost/v1/addUser的结果是------>true
11:46:02.148 [main] INFO com.course.cases.AddUserTest - ********addUser api 验证通过*********

执行成功,数据库的user表成功添加数据

java接口自动化-post请求获取不到cookie问题解决相关推荐

  1. Java接口自动化之Maven工具使用

    VOL 190 30 2020-12 今天距2021年1天 这是ITester软件测试小栈第190次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上 08 ...

  2. python程序如何封装成接口_python接口自动化如何封装获取常量的类

    这篇文章主要介绍了python接口自动化如何封装获取常量的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 背景: 一.执行case的过程: 首先需 ...

  3. java接口自动化书籍_java接口自动化优化(一)

    优化extentreports在线样式改为离线加载自己项目下的样式 主要解决extentreports在线加载失败问题 上篇文章介绍了通过testng编写用例后使用extentreports作为测试报 ...

  4. Java接口自动化之TestNG单元测试框架(一)

    上一篇Java接口自动化系列文章:Java接口自动化之log4j日志框架,主要介绍log4j日志介绍.日志三大组成部分及日志实战. 以下主要介绍TestNG的简介.@Test注解及其属性. 01 Te ...

  5. java接口自动化(四) - 企业级代码管理工具Git的应用

    1.简介 首先我们自己需要将自己的代码上传到GitHub上边做好备份.用来避免万一由于某些不可控的非人为因素或者人为因素造成的代码丢失.而且GitHub是一个开源的代码管理工具.所以宏哥这里再次介绍一 ...

  6. java接口自动化Excel占位符_基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport的接口自动化测试框架...

    接口自动化框架 项目说明 本框架是一套基于maven+java+TestNG+httpclient+poi+jsonpath+ExtentReport而设计的数据驱动接口自动化测试框架,TestNG ...

  7. java接口自动化-Testng框架、HttpClient框架

     Testng 引用文件 ==>pom.xml 快捷键配置:Alt键+回车 <dependencies><dependency><groupId>org.te ...

  8. 阿里java接口自动化实践pdf_接口自动化测试设计

    1.接口测试基础 1.1.什么是接口测试? 接口测试是测试系统组件间接口的一种测试. 接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点. 接口测试的重点是要检查数据的交换,传递和控 ...

  9. java接口自动化(三) - 手工接口测试到自动化框架设计之鸟枪换炮

    1.简介 上一篇宏哥介绍完了接口用例设计,那么这一章节,宏哥就趁热打铁介绍一下,接口测试工具.然后小伙伴们或者童鞋们就可以用接口测试工具按照设计好的测试用例开始执行用例进行接口手动测试了.关于手动测试 ...

最新文章

  1. 一个类型初始值设定项引发异常
  2. 粉色温馨——HTML框架示例
  3. SAP Spartacus navigation ui节点的url字段的生成逻辑,同样来自sampledataaddon
  4. 你是信用卡卡奴吗?怎么摆脱卡奴?
  5. LINUX下SYN***战
  6. 关于C/C++中函数参数传递的规则
  7. Golang中Goroutine与线程
  8. oracle rds 运维服务_从Oracle一条新闻说起,为什么我们需要更好更开放的RDS服务?...
  9. HFSS —2.4Ghz蓝牙和wifi天线设计
  10. 算法学习笔记(使用追赶法解三对角方程组)
  11. Gazebo学习笔记4:模型编辑器
  12. ARM920T及其MMU,Cache学习杂记(一)
  13. 宝妈群体又一次遭受职场歧视?公司要求怀孕即离职?或许抖音小店是突破口
  14. 怎么运行element ui
  15. Ubuntu16.04(14.04) 安装网卡驱动教程
  16. 利用Meshlab旋转三维点云模型
  17. 新款 Mac mini(2018) 性能及接口分析
  18. 通用USB设备驱动源码分析
  19. 新人第一次学C++的第七个项目
  20. X3D - 一次编写、处处、时时都可渲染的三维图形格式

热门文章

  1. VUE监听页面刷新和关闭事件
  2. 99%的人都不懂中本聪、V神这么牛靠的是什么?一张图而已!
  3. java计算机毕业设计汽车销售系统源码+数据库+系统+lw文档+mybatis+运行部署
  4. Arduino融资3200万美元,进军企业市场
  5. 致远OA表单自定义函数(计算N年后今天的日期 )
  6. CENTOS上的网络安全工具(七)MYSQL也不能少
  7. 使用HTML5和CSS3实现运动,九.HTML5和CSS3提高
  8. 2万字好文!手把手教你实现 Docker 部署 Redis 集群
  9. C++入门——实现见缝插针游戏
  10. 全球与中国塑料面漆喷涂器市场深度研究分析报告