B03_接口测试前置知识补充:cookie和session

B03_接口测试前置知识补充:cookie和session

 

cookie,可以翻译成“曲奇”或者“小饼干”,指用户通过浏览器访问网站时,网站为了记录用户浏览历史,辨别用户身份等储存在用户本地上的一小份数据。有时也用其复数形式 cookies。

 

session,可以翻译成“会话”,是服务器分配在自己内存或数据库中的一块区域,用于存储登录后的用户信息,和 cookie 结合后可以辨别发来请求的用户身份,解决 HTTP 协议无状态的问题。

 

在使用 HttpRunner 的时候,要模拟用户的身份向接口发送请求,明白 cookie 和 session 的内容后,就可以从响应信息中提取我们需要的 cookie,继而以特定身份去访问接口(有点类似 LR 中关联的处理方式)。

 

我们以下图来简要说明,如何通过 cookie 和 session 的结合来进行用户身份的识别。

 

 

图中“红色”编号部分处理过程:

在 HTTP 协议中,如果浏览器收到服务器发过来的 Cookie ,则在其向该服务器发送的后续所有请求中,都会自动把这些 Cookie 附带上再发回服务器。

  1. 浏览器:用户通过浏览器输入用户名和密码,进行登录操作。
  2. 服务器:后续会为该请求分配一块内存区域(或数据库中),并分配一个该区域对应的唯一编号(即SessionID)。
  3. 服务器:判断用户名和密码是否正确。
  4. 服务器:如果用户名和密码正确,将关键用户信息存入上面分配的 Session 区域中。
  5. 服务器:在响应头域中,将上面的 SessionID 附加到 Cookie 中传回给浏览器。至此浏览器向该服务器发送的所有后续请求都会把这个 Cookie(里面存储着SessionID)附加到请求中一并再传给服务器。

 

图中“蓝色”编号部分处理过程:

由于 HTTP 协议无状态(即无记忆)的特点,无法从协议本身获知发起请求的人是谁。某用户通过浏览器发送请求,请求中附带着 Cookie 信息,里面存储了SessionID 编号。

  1. 服务器:收到请求后,根据 SessionID 按图索骥,查看自己是否有这个编号所对应分配的 Session 区域。
  2. 服务器:如果有这个区域,则到里面看看保存的用户信息,发现 name=Esther 信息。
  3. 服务器:至此服务器就可以核对到请求发送方的身份了,说明这个发起请求的用户就是 Esther 了。

 

关于会话(Session)有些注意事项:

  • 从打开浏览器访问页面开始,到关闭浏览器结束,这整个过程称之为一次“会话(Session)”。
  • 如果中间点击“退出”按钮,退出系统,但没有关闭浏览器,此次会话仍旧存在,SessionID 没有消失。
  • 所以退出系统的时候,还必需要清空存储在 Session 中的关键用户信息,否则点击后退按钮就又重新进入系统了。
  • 服务器中会设置 Session 的过期时间,如果一段时间没有进行任何操作,此会话会自动失效。
  • 有些页面可以关闭 Session 机制,如新闻浏览页面,不需要用户进行登录,就没有必要分配 Session 空间了。
  • 关于 SessionID 是保存在浏览器的临时 Cookie 中(即内存中),在浏览器的本地缓存目录是看不到的。
  • 另外,浏览器访问登录页面时产生的第一个请求,其响应中就已经返回 cookie:sessionid 了,只是此时 Session 空间内没有记录用户信息(相当于空白状态),只有当用户成功输入用户名和密码登录后,才向 Session 中写入用户关键信息。图中将这个过程整合简化处理了。
  • 服务器端 Session 中存储的用户数据不宜过多,毕竟如果存储在内存中,非关键数据的存储会浪费空间。

 

 

 

 

 

 

 

self = ChainMap({}, {'im30': 'pax_branch_7.0_3.xx_release', 'im30v2': 'A133_V2_4_T509_pax_branch_release', 'a80': 'pax_branch...3700': 'MTK_android11_pax_branch_user', 'a8300': 'A133_V2_4_pax_branch_release', 'a6650': 'A6650_pax_branch_user'}, {}) key = 'a80s' def __missing__(self, key): > raise KeyError(key) E KeyError: 'a80s' /usr/lib/python3.8/collections/__init__.py:890: KeyError During handling of the above exception, another exception occurred: request = <SubRequest 'upgrade_os_by_fastboot' for <Function test_Antutu_Score_PER1>> get_device_in_config = ('172.16.120.187:6714', '172.16.25.170', 'false', 'A80S', True) get_sn_fastboot_sn = {'1240047508': '241050374620301a044f', '1240193065': '140050344410142b03ce', '1640000442': '1400788643245025084f', '2210000495': 'NRUO65VOT4TWON99', ...} @pytest.fixture(scope='session', autouse=False) def upgrade_os_by_fastboot(request, get_device_in_config, get_sn_fastboot_sn): """ 更新固件 """ _serial, ip, regex, device_name, is_version_test = get_device_in_config # 一些配置参数 # _serial = get_serial logger.info(exec_cmd("adb devices -l")) if util.wait_for_device(_serial, timeout=10 * 60) is False: assert False, "{} device is offline".format(_serial) return # 优先从命令行获取 fastboot_sn = request.config.getoption(CmdOption.DEVICE_FASTBOOT.value) if fastboot_sn is None: fastboot_sn = get_sn_fastboot_sn.get(_serial) if fastboot_sn is None: logger.warning(f"也许你需要在{get_sn_fastboot_sn_map_path()}配置对应的fastboot sn") fastboot_sn = _serial path = os.getcwd() logger.info("upgrade_os_by_fastboot path:%s" % path) logger.info(exec_cmd("rm -rf ./Uniphiz_*")) logger.info(exec_cmd("rm -rf ./PayDroid_*")) logger.info(exec_cmd("rm -rf ./IM30_A80_PayDroid_*")) if is_version_test is False: # CI的日常测试任务 upgrade_result = upgrade_now(_serial, device_name, fastboot_sn, "", "fastboot") else: # CI的版本测试任务 > upgrade_result = upgrade_now_version_test(_serial, device_name, fastboot_sn, "", "fastboot") ../CI_Code_Pull/tests/conftest.py:209: 这是什么错误
07-14
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值