# 前言
测开笔记day01
一.接口测试
1. http协议的接口,http请求分几类
- get,post,delete,put,head,option
2. 状态码
3. cookie和session,Token的区别
(1)cookie数据存放在客户的浏览器上,session数据放在服务器上
(2)cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session
(3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面应当使用cookie
(4)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie,缓存包含cookie,缓存还包括图片等等,清空缓存不等于清空cookie
(5)可以将登陆信息等重要信息存放为session;其他信息需要保存,可以放在cookie
鉴权/授权 -----Token就是鉴权,访问的接口是否正常,是否非法访问,绕过前端访问。服务器发出 (作用:防止你跳过页面直接访问他的接口,他需要你带一个来自前一个页面的Token才能证明是你正常访问。 比如:网站-登录-考勤-进入考勤页面(属于正常访问),网站-登录-直接进入考勤页面(这就是绕过前端访问,这时候你要拿到上一个页面的token才能做到)) -------Key(Appkey)授权,是否具有访问接口的权限,使用第三方时,需要授权。
4. request请求
'''
这节课知识点
1.响应正文:针对请求从服务响应回来的数据:格式一般有html xml json
2.html xml json-->都可以用text获取
3.html xml json-->都用json会报错!只有json类型的返回值才支持json
4.验证码处理(图片or短信):a.屏蔽它,b.万能的,c.数据库查实时的
5.安全问题回答:要么屏蔽,要么写代码解决
6.响应报文重要关注点是:状态码,响应头,响应正文
'''
import requests
url='http://120.78.128.25:8765/Index/login.html'
res=requests.get(url)
print(res)
print('响应头:',res.headers)
print('响应状态码:',res.status_code)
print('响应正文:',res.text)
url='http://test.lemonban.com/futureloan/mvc/api/member/login'
data={'mobilephone':'15873731222','pwd':'123456'}
res=requests.post(url,data)
print(res)
print('响应头:',res.headers)
print('响应状态码:',res.status_code)
print('cookies:',res.cookies)
print('响应正文1:',res.text,type(res.text))
print('响应正文2:',res.json(),type(res.json()))
recharge_url='http://test.lemonban.com/futureloan/mvc/api/member/recharge'
recharge_data={'mobilephone':'15873731222','amount':"1000"}
header={'User-Agent':'Mozilla/5.0'}
recharge_res=requests.get(recharge_url,recharge_data,headers=header,cookies=res.cookies)
print('充值结果:',recharge_res.json())
print('请求头:',recharge_res.request.headers)
第二种方法
import requests
class HttpRequest:
'''
1.利用request封装get,post请求
2.url
3.param 传递的参数,非必填参数
4.method:请求方法支持get post 等等
'''
def http_request(self,url,data,method,cookie=None):
if method=='get':
res=requests.get(url, data, cookies=cookie)
else:
res=requests.post(url, data,cookies=cookie)
return res
if __name__ == '__main__':
url = 'http://test.lemonban.com/futureloan/mvc/api/member/login'
data = {'mobilephone': '15873731222', 'pwd': '123456'}
login_res=HttpRequest().http_request(url,data,'post')
print('登录结果是:',login_res.json())
recharge_url = 'http://test.lemonban.com/futureloan/mvc/api/member/recharge'
recharge_data = {'mobilephone': '15873731222', 'amount': "1000"}
recharge_res=HttpRequest().http_request(recharge_url,recharge_data,'get',login_res.cookies)
print('充值结果是:',recharge_res.json())
5. 单元测试
1.先写一个测试类
class MathMethod:
def __init__(self,a,b):
self.a=a
self.b=b
def add(self):
return self.a+self.b
def multi(self):
return self.a*self.b
2.单元测试代码实现
'''
接口测试的本质:测试类里面的函数
单元测试的本质:测试函数 代码级别
单元测试的框架 unitest+接口
单元测试的框架
1.写用例 (TestCase)
2.执行用例 (1.TestLoader加载用例,2.TestSuite存储用例)
3.对比结果(断言 Assert)
4.出报告(TextTestRunner)
抓异常:
try:...except AssertionError as e:
'''
import unittest
from hanshu.math_method import MathMethod
class TestMathMethod(unittest.TestCase):
'''
编写测试用例
1.一个用例就是一个函数,不能传参,只有self关键字
2.所有的用例(所有的函数,都是test开头test_)
'''
def test_add_two_math(self):
res=MathMethod(1,1).add()
print('加法结果是:',res)
self.assertEqual(0,res)
def test_add_two_ahengfa(self):
res=MathMethod(1,5).multi()
print('2结果是:',res)
try:
self.assertEqual(6, res)
except AssertionError as e:
print('出错了!错误信息是{}'.format(e))
raise e
def test_add_two_Bhengfa(self):
res=MathMethod(5,5).multi()
print('结果是:',res)
if __name__ == '__main__':
unittest.main()
3.
import unittest
from hanshu.class_01 import TestMathMethod
import HTMLTestRunner
suite=unittest.TestSuite()
suite.addTest(TestMathMethod('test_add_two_Bhengfa'))
suite.addTest(TestMathMethod('test_add_two_ahengfa'))
loader=unittest.TestLoader()
suite.addTest(loader.loadTestsFromTestCase(TestMathMethod))
with open('test.txt','w+',encoding='UTF-8') as file:
runner=unittest.TextTestRunner(stream=file,verbosity=2)
runner.run(suite)
with open('test_report.html','wb') as file:
runner=HTMLTestRunner.HTMLTestRunner(stream=file,verbosity=2,title='vivi写的报告', description='python11')
runner.run(suite)
6. 断言assert
7. setUp ,tearDown 夹心饼干(继承自unittest.TestCase)
def setUp(self):
print('我要开始执行用例了')
def tearDown(self):
print('执行完毕!')
'''
1.可以不写吗?----->可以
2.什么时候执行setUp?----->执行每一条测试用例之前会执行setUp
3.什么时候执行tearDown?----->每一条测试用例执行完后都会执行tearDown
4.如果有操作必须在执行用例之前准备好,那就放在setUp里面(比如连接数据库)
有操作必须在执行用例完毕之后要清除,那就放在tearDown里面。
'''
二.python反射
面试题:
测试过程中,如果第二条测试需要用到第一条测试某个值,写单元测试时该怎么处理这个问题?
1.全局变量 global
2.反射
3.写在setUp里面。每次执行时,先执行setUp里面的代码。
class GetDate:
Cookie='小黄'
print(GetDate.Cookie)
setattr(GetDate,'Cookie','小黄')
print(hasattr(GetDate,'Cookie'))
print(getattr(GetDate,'Cookie'))
delattr(GetDate,'Cookie')
print(hasattr(GetDate,'Cookie')
三.练习题
题目一:请完成http_request类的单元测试
要求如下:
1.写http_request类做作业
2.提供2个接口
登录url:http://test.lemonban.com/futureloan/mvc/api/member/login
充值url:http://test.lemonban.com/futureloan/mvc/api/member/recharge
3.针对登录接口写4个用例:正常登录、不输入密码、不输入账号、输入错误的密码
充值接口写4个用例:正常充值、不输入账号、不输入金额、输入错误的金额负数
4.请利用任何一种方法实现用例的加载并执行
5.生长html测试报告
|