1、怎么mock数据
mock 的意思是模拟,也就是模拟接口返回的信息,用已有的信息替换它需要返回的信息,从实现对上级模块的测试。
这里分为两类测试:一类是前端对接口的mock,一类是后端单元测试中涉及的mock
单纯的前端mock可以通过抓包工具Fiddler,Charles实现,通过修改代理返回的数据,实现多种场景的测试。这里在抓包工具之中会解释。
后端的Mock则是从接口的角度,如果一个接口A返回的数据需要依赖于另一个接口B,当敏捷开发中B接口还未开发完全时候这里会需要用到Mock。
怎么mock数据?
1.安装Node.js ,通过http-server开启本地服务器
获取端口http://localhost:8000
然后通过在文件夹创建html和json文件来测试数据
//html文件
<body>
<script>
var xhr = new XMLHttpRequest()
xhr.open('GET','/hello.json',true)
xhr.send()
xhr.addEventListener('load',function(){
var date = xhr.responseText;
console.log(date)
})
</script>
//json文件
{
"name":"jirengu",
"age":"2"
}
2、用过什么测试框架
1.模块化框架(test script modularity)
2.函数库结构框架(test library architecture)
3.关键字驱动测试框架(keyword-driven/table-driven testing)
4.数据驱动测试框架(data-driven testing)
5.混合型框架(hybrid test automation
Tellurium:是一种自动化的web测试框架。虽然它是在selenium的阶段上建立起来的,但两者之间有许多概念上的差异。
wtd:可以支持selenium,http(post,get),jsonrpc 自动化测试用例,并且可以支持测试环境修改,测试报告生成。wtd介绍 [5]
QTP:是quicktest Professional的简称,是一种自动测试工具。使用QTP的目的是想用它来执行重复的自动化测试,主要是用于回归测试和测试同一软件的新版本。因此你在测试前要考虑好如何对应用程序进行测试,例如要测试哪些功能、操作步骤、输入数据和期望的输出数据等
PhoenixAutotest:基于Selenium的自动化测试框架Phoenix,采用Java语言编写的。已经覆盖了WebUI自动化测试过程中需要的大部分功能封装。
(Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。)
测试框架
unittest – (Python 标准库) 单元测试框架。
nose – nose 扩展了 unittest 的功能。
contexts – 一个 Python 3.3+ 的 BDD 框架。受到C# – Machine.Specifications的启发。
hypothesis – Hypothesis 是一个基于先进的 Quickcheck 风格特性的测试库。
mamba – Python 的终极测试工具, 拥护BDD。
PyAutoGUI – PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块。
pyshould- Should 风格的断言,基于 PyHamcrest。
pytest- 一个成熟的全功能 Python 测试工具。
green- 干净,多彩的测试工具。
pyvows- BDD 风格的测试工具,受Vows.js的启发。
Robot Framework – 一个通用的自动化测试框架。
Web 测试
Selenium – Selenium WebDriver 的 Python 绑定。
locust – 使用 Python 编写的,可扩展的用户加载测试工具。
sixpack – 一个和语言无关的 A/B 测试框架。
splinter – 开源的 web 应用测试工具。
Mock测试
mock – (Python 标准库) 一个用于伪造测试的库。
doublex – Python 的一个功能强大的 doubles 测试框架。
freezegun – 通过伪造日期模块来生成不同的时间。
httmock – 针对 Python 2.6+ 和 3.2+ 生成 伪造请求的库。
httpretty – Python 的 HTTP 请求 mock 工具。
responses – 伪造 Python 中的 requests 库的一个通用库。
VCR.py – 在你的测试中记录和重放 HTTP 交互。
对象工厂
factoryboy – 一个 Python 用的测试固件 (test fixtures) 替代库。
mixer – 另外一个测试固件 (test fixtures) 替代库,支持 Django, Flask, SQLAlchemy, Peewee 等。
modelmommy – 为 Django 测试创建随机固件
代码覆盖率
coverage – 代码覆盖率测量。
伪数据
faker – 一个 Python 库,用来生成伪数据。
fake2db – 伪数据库生成器。
radar – 生成随机的日期/时间。
错误处理
FuckIt.py – FuckIt.py 使用最先进的技术来保证你的 Python 代码无论对错都能继续运行
3、指针
指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。
指针的值(即地址)总会是下列四种状态之一:
指向一个对象的地址
指向紧邻对象所占空间的下一个位置
空指针,意味着指针没有指向任何对象
无效指针(野指针),上述情况之外的其他值
**空指针:*在C语言中,我们让指针变量赋值为NULL表示一个空指针,而C语言中,NULL实质是 ((void)0) , 在C++中,NULL实质是0。C++中也可以使用C11标准中的nullpte字面值赋值,意思是一样的。
任何程序数据都不会存储在地址为0的内存块中,它是被操作系统预留的内存块。
**无效指针:**指针变量的值是NULL,或者未知的地址值,或者是当前应用程序不可访问的地址值,这样的指针就是无效指针,不能对他们做解指针操作,否则程序会出现运行时错误,导致程序意外终止。
未经初始化的指针就是个无效指针,所以在定义指针变量的时候一定要进行初始化。如果实在是不知道指针的指向,则使用nullptr或NULL进行赋值。
4、链表
一、链表的定义
1.和数组一样,链表也是一种线性表。
2.从内存结构来看,链表的内存结构是不连续的内存空间,是将一组零散的内存块串联起来,从而进行数据存储的数据结构。
3.链表中的每一个内存块被称为节点Node。节点除了存储数据外,还需记录链上下一个节点的地址,即后继指针next。
二、链表的特点
1.插入、删除数据效率高,时间复杂度为O(1)级别(只需更改指针指向即可),随机访问效率低,时间复杂度O(n)级别(需要从链头至链尾进行遍历)。
2.和数组相比,内存空间消耗更大,因为每个存储数据的节点都需要额外的空间存储后继指针。
三、常用的链表类型
1.单链表
1)每个节点只包含一个指针,即后继指针。
2)单链表有两个特殊的节点,即首节点和尾节点。为什么特殊?用首节点地址表示整条链表,尾节点的后继指针指向空地址null。
3)性能特点:插入和删除节点的时间复杂度为O(1),查找的时间复杂度为O(n)。
2.循环链表
1)除了尾节点的后继指针指向首节点的地址外均与单链表一致。
2)适用于存储有循环特点的数据,比如约瑟夫问题。
3.双向链表
1)节点除了存储数据外,还有两个指针分别指向前一个节点地址(前驱指针prev)和下一个节点地址(后继指针next)。
2)首节点的前驱指针prev和尾节点的后继指针均指向空地址。
四、数组与链表的比较
1.插入、删除和随机访问的时间复杂度
数组:插入、删除的时间复杂度是O(n),随机访问的时间复杂度是O(1)。
链表:插入、删除的时间复杂度是O(1),随机访问的时间复杂端是O(n)。
2.数组缺点
1)若申请内存空间很大,比如100M,但若内存空间没有100M的连续空间时,则会申请失败,尽管内存可用空间超过100M。
2)大小固定,若存储空间不足,需进行扩容,一旦扩容就要进行数据复制,而这时非常费时的。
3.链表缺点
1)内存空间消耗更大,因为需要额外的空间存储指针信息。
2)对链表进行频繁的插入和删除操作,会导致频繁的内存申请和释放,容易造成内存碎片,如果是Java语言,还可能会造成频繁的GC(自动垃圾回收器)操作。
4.如何选择?
数组简单易用,在实现上使用连续的内存空间,可以借助CPU的缓冲机制预读数组中的数据,所以访问效率更高,而链表在内存中并不是连续存储,所以对CPU缓存不友好,没办法预读。
如果代码对内存的使用非常苛刻,那数组就更适合。
5、长连接和短链接的优缺点,用处
tcp:面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次挥手断开连接
优点:在数据传输时,有确认、窗口、重传、拥塞控制机制,能保证数据正确性,较为可靠
缺点:速度相对慢一点,要求系统资源较多
udp: 面向无连接的通信协议,数据包括目的端口信息和源端口信息
优点:面向无连接,操作简单,要求系统资源较少,速度快,由于不需要连接,可进行广播发送
缺点:发送数据之前不需要与对方建立连接,接收到数据时也不需要发送确认信号,发送端不知道接收端是否正确接接收,不会重发,不可靠。
长连接:连接→数据传输→保持连接(心跳)→数据传输→保持连接(心跳)→……→关闭连接(一个TCP连接通道多个读写通信)
所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持(不发生RST包和四次挥手)。
这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态;
如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:
1、客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
2、客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
3、客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
4、客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。
短连接:连接→数据传输→关闭连接
短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接(管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段);
总结:
1:如果业务来往比较频繁,则选择长连接。
2:如果server要主动给client发数据,则选择长连接。
6、HTTP和HTTPS
HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费。
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。
HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题。
7、HTTP1.0和HTTP1.1
HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较为简单的网页上和网络请求上,而HTTP1.1则在1999年才开始广泛应用于现在的各大浏览器网络请求中,同时HTTP1.1也是当前使用最为广泛的HTTP协议。 主要区别主要体现在:
**缓存处理,**在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),这样就方便了开发者自由的选择以便于充分利用带宽和连接。
**错误通知的管理,**在HTTP1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
**Host头处理,**在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
**长连接,**HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。
8、变量长度
第一种 字符型(char) 占1BYTE
第二种 整型(int) short int 占 2BYTE int 占4BYTE
第三种 浮点型 float 占4BYTE double 占8BYTE long double 占16BYTE
9、粒度封锁
数据库中为了实现并发控制而采用封锁技术。
封锁对象的大小称为封锁粒度(Granularity)
封锁的对象可以说逻辑单元,也可以是物理单元。以关系数据库为例子,封锁对象可以是这样一些逻辑单元:属性值、属性值的集合、元组、关系、索引项、整个索引项直至整个数据库;也可以是这样的一些物理单元:页(数据页或索引页)、物理记录等。
锁定的粒度与系统的并发度和并发控制的开销密切相关。一般地,锁定的粒度越大,需要锁定的对象就越少,可选择性就越小,并发度就越小,开销就越小;反之,锁定的粒度越小,需要锁定的对象就越多,可选择性就越大,并发度就越大,开销就越大。
多粒度封锁
在一个系统中同时支持多种封锁粒度供不同的事务选择。
选择封锁粒度需同时考虑封锁开销和并发度两个因素, 适当选择封锁粒度。
例如:需要处理大量元组的用户事务:以关系为封锁单元
需要处理多个关系的大量元组的用户事务:以数据库为封锁单位
只处理少量元组的用户事务:以元组为封锁单位