软件测试基础知识记录

杂谈

突然发现写博客对梳理知识和记录非常有用,所以我想多写几篇

预计的分类规划是:测试知识记录贴、Python记录贴、数据库/网络知识记录贴、k8s/Jenkins/docker项目管理、其他内容记录贴

反正我也是自己边学边总结

测试

工作几个月总结的理论知识,虽然测试的知识不会像数学一样具有绝对正确性,但至少基本概念不出大差错,于是做了一个记录,同时也方便自己查缺补漏和复习

什么是软件测试?

为了发现软件中出现的缺陷、错误、漏洞而执行程序的过程

测试的目的是什么?

验证软件是否符合需求;寻找软件中的缺陷;在用户的角度测试软件,提升软件质量;尽早地介入测试,降低项目成本。

测试有哪几个阶段?

大分类为4个,分别为单元测试、集成测试、系统测试、验收测试,但绝对不仅是4个,可以进行细分从而单拎出来表示阶段

单元测试的工作一般开发做,验证单元功能是否符合需求,测试没有代码权限不了解。

集成测试的工作就是根据接口文档进行外部接口测试,测试接口是否调用正确,请求方法、请求数据、响应数据是否符合要求;1.验证模块间的接口调用、数据是否有问题以及结构设计问题2.集成之后的功能实现是否达到要求。

系统测试就是执行测试用例验证测试场景与内部接口测试,验证系统的功能是否满足需求分析说明书/系统设计说明书的要求

其中系统测试又分为冒烟测试、功能测试(其他细分)、性能测试(其他细分)...(+软件质量模型的六个特性)

测试方法有哪些?

黑盒测试、白盒测试、灰盒测试、静态测试、动态测试

黑盒测试保证需求,测试各场景但不保证所有代码写的功能全部被测到;属于功能测试阶段

白盒测试保证代码都覆盖功能,但不保证完美符合需求;属于单元测试阶段

灰盒测试保证各个模块之间的功能实现,介于白盒和黑盒之间;属于集成测试阶段


软件研发流程

基本流程:

用户需求-概要设计-详细设计-开发编码-软件测试-系统实施-验收交付

详细版本:

前期调查-项目立项-用户需求-需求分析-需求分析评审-概要设计-概要设计评审-详细设计-详细设计评审-*(开发计划排期-开发编码-单元测试-前后端联调测试)-*(测试计划排期-编写测试用例-测试用例评审-集成测试)-开发提测-冒烟测试-功能测试第一轮-功能测试第二轮-性能测试-用户体验测试-现场实施试运行-回归测试-功能验收-交付-售后

注*(开发)与*(测试),该部分表示并行。

软件迭代,测试主要参与流程为:详细设计评审-依据开发计划排期测试计划-编写测试用例-测试用例评审-等待开发提测-冒烟测试-功能测试-回归测试-发包


用例设计方法有哪些?

等价类、边界值、判定表,场景法、错误推断法、正交实验法、因果图

其中工作中最常用的就是等价类、边界值以及场景法。

等价类:把输入的数据分为有效等价类与无效等价类;有效等价类指的是根据需求说明书是合理且有意义的输入数据的集合,无效等价类是无意义,不合理的输入数据的集合。一条测试用例覆盖多个有效等价类,覆盖一个无效等价类(覆盖一个无效等价类不是指你只有一个异常场景)

边界值:属于等价类的补充,一般都是从等价类的边缘去寻找问题(为什么?因为开发也是人,是人就有可能会打错字)

场景法:模拟用户操作流程,一个事务的正确流程为基准,称为基本流;输入错误导致流程反复,但是依然可以完成流程为备选流;其他失败或者错误的流程称为异常流

为什么要设计测试用例?好处是什么?

因为

可以更加全面的测试了所有功能,保证覆盖率,跟踪测试进度,减少重复冗余的测试点提高测试效率。

好处

它是测试工作的依据,还可以进行复用;评估需求覆盖率、使得工作可重复;自动化测试的基础

测试用例由哪些组成?

用例编号、模块名称、用例名称、前置条件、操作步骤、预期结果、实际结果、优先级、执行人

如果是测试点,则分为用例编号、模块名称,测试点场景(一条简短的测试点需要包含用例名称、前置条件、操作步骤、预期结果的信息)、测试结论、优先级


bug的组成

分为系统开发性bug和设计缺陷bug

简单来说就是一个是开发代码写戳了或者没按需求说明书来,另一个是产品经理的功能设计有问题

bug类型、bug标题、bug详细描述、bug所属项目、bug所属模块、bug产生环境、bug优先级、bug等级、bug的操作步骤、bug实际的结果、期望的预期结果、bug状态、bug处理人、bug产生原因、bug解决方案、备注

说多几个少几个没什么大的关系,主要的几个不要忘

bug的等级

不同公司具体不同

1级致命:常规操作(正常流程)系统崩溃,流程中断,测试工作无法继续进行(冒烟测试),功能与需求严重不符合,数据泄露造成安全问题,涉及金钱计算现场的需求以及现场bug

2级严重:关键控制点问题功能只有部分实现数据流校验错误逻辑不通,性能问题,密码明文等,非常规操作(比如登录连续一直点好多次,一直登录然后退出反复操作之类的)

3级一般:通用性功能问题,字段未转义,显示缺失,界面排版出现现场不太可能出现的场景,列名与含义不一致,查询错误,没有边界值,删除没有提示

4级建议:易用性和建议性等文字错误,提示过于简短不清楚,界面不整齐,内容布局等(不纳入开发考核)

bug的生命周期?

发现-提交-确认-分配-修复-验证-关闭

测试人员发现bug,记录提交bug给开发,bug状态为待确认

开发人员确认是bug,开始修复bug,bug状态为开始解决

开发人员修复bug,bug状态为已解决

测试人员验证bug修复成功,bug状态为已验证通过,关闭

测试人员验证bug修复失败,bug状态为已验证失败,重新打开

开发人员再次修复bug,状态为已解决

测试人员再次验证直到bug修复成功

接口测试怎么测的?

先了解接口的业务功能、入参返参等信息,编写接口测试用例,对参数使用等价类边界值等方法进行设计,依据测试用例使用postman等工具进行接口测试,查看接口是否正确调用,参数符合接口文档,保证接口测试结果的正确性

接口测试用例怎么设计的?

必填参数、全部参数、组合参数、额外参数;没有必填参数、必填参数值为空、错误的必填参数、越界的必填参数;url长度、返参响应结果的正确性


如何测试一支笔?

我看很多帖子写的都是功能细分就无了,全都是到处copy别人的,我自己感觉可以从工作角度来说明,这样应该更好点

使用对象?功能用途 目标对象?特殊要求?

谁用?什么功能在什么地方用?特殊要求?

学生,签字笔,用于在干纸上签字,要求防水

小朋友,画笔,用于墙壁,要求可擦

从工作角度回答:

项目立项,需求分析,设计评审,编码,测试计划,测试方案,接口测试,功能测试,性能测试,现场联调部署,用户体验测试,上线,用户验收,维护

如果要测某个东西,我们先了解根据设计文档,了解这个东西的使用对象,外观设计,功能用途和特殊需求等,比如说这个笔,他的使用对象是学生,功能是在干纸上进行签字,外观要求黑色,通过站在用户的角度去弄清楚用户平常使用会出现什么问题,我们要确定测试的有哪些关注点和优先级,比如应该主要关注XXX,优先XXX,并编写详细的测试计划和方案,需要进行哪些测试,可以根据质量模型六个特性去细化提取测试点,编写用例,对于这只笔的用例可以通过功能性,性能、安全性、可靠性、易用性、可移植性对这个笔提取测试点,还有场景法啥的,思维可以开阔一点

功能:是否能正常写字,笔帽笔筒笔尖套尾塞是否配套,笔芯能否正常替换,出墨速度是否符合要求,出墨粗细是否符合要求,是否符合外观要求,特殊需求比如可擦

性能:功能要求10米测试不间断地写12米,最大摔落高度2米测试3米摔落,设计使用寿命100米,测试多个笔平均是多少米

安全性:材料是否符合规定,笔身是否有很锋利的地方,笔套是否设计通孔

可靠性:在温度很高和很低的地方能否正常书写,在不同的纸面或表面上能否正常书写

易用性:笔的外观是否和写字颜色一致,迅速辨别按动笔还是盖帽笔,按动或拔帽的力度

可移植性:笔盖是否笔筒是否通用,市面大部分笔盖、笔芯能否通用配套

Python

数据类型:

基本数据类型:字符串(str)、数字(整形 int, 浮点 float, 复数 complex)、布尔(True,False)

复合数据类型:序列(列表 list、元组 tuple)、集合(set)、字典(dict)

[列表有序且可变] = []
(元组有序不可变) = ()
set(集合无序不重复) = {}
{字典键值对K:V} = {}

 最基本操作知识

赋值
变量名 = 值
(只能包含下划线与数字, 不可以以数字开头)

自增简写:b = b + 1 等同于 b += 1

a = 1
number_01 = 2
aim5 = "hahahaname"

b = b + 1
b += 1
c = c - 1
c += 1
 输出
print(a)
print(number_1)
print(aim5
print(f'你知道number_1的结果是{number_1}吗?')
#f表示format

print('你在干\t啥?')
#你在干   啥?
print('我\n也不知道')
#我
#也不知道
 输入
a = input('请开始你的表演,输入字符串吧:')
a = int(input('请开始你的表演,请输入数字,别输入字符串:'))
 随机值
import random
a = random.randint(1,100)
b = random.uniform(1,100)
print(a)
print(b)
 运算符
算数运算符:
加、减、乘、除、次方
+, -, *, /, **

逻辑运算符:
与、或、非
and, or, not

% 取余:
a = 10
b = a % 2
#10除2等于5, 整除了, 余数是0, 所以b的值是0
c = a % 3
#10除3除不尽,余数是1, 所c的值是1
索引、切片、拼接
序列是一块可存放多个值的连续内存空间,所有值按一定顺序排列,其中每个值所在位置都有一个编号,我们将这个编号称为索引

索引:
object[1]
切片:
object[start:end:step]

a = [1,2,3,4,5]
#索引
print(a[-1])
print(a[0],a[3])
#切片
print(a[0:3])  #!print(a[0,3]),don`t do that
print(a[0:6:2])
print(a[:2])
print(a[::2])
print(a[3:])
print(a[:-1])
print(a[::-1])

#替换
a[1:3] = [97,99,98]
print(a)

#字典索引
b = {'q':1, 'w':2, 'e':3, 'I':9}
print(b['q'])
print(b['I'])
#print(b[0])是不行的,字典不可以通过整数进行索引,只能通过键Key进行索引

#切片
text = "hello world python"
words2 = text[0:5],text[6:11],text[11:18]
print(words2)

ateyyy = 'funny'
#拼接
print("ateyyy + ateyyy -->", ateyyy + ateyyy)
print('2 * ateyyy -->', 2 * ateyyy)
#查询值是否存在
print('tey' in ateyyy)
print('fun' in ateyyy)
 if控制流
number = 23
guess = int(input('请输入数字:'))
if guess == number:
    print('你猜中了')
elif guess < number:
    print('你猜小了')
else:
    print('你猜大了')

print('ok')
 while循环

如果循环的结果是True,就会一直循环执行内容,如果是False就会跳出循环。

a = 0
while a < 100:
    a += 3
    print(a)
print('over')

#a = 102时就会跳出循环

 使用break也可以跳出循环(只会跳一层)

a = 0
while a < 100:
    a += 3
    print(a)
    if a == 66:
        break
print('over')

#a = 66时就会跳出循环

这里的while只是有个input输入,所以没有跳出循环的条件,因此我们在if里添加循环终止的条件

number = 23
running = True
while running:
    guess = int(input('输入你猜的数字 : '))
    if guess == number:
        print('你猜对了')
        running = False  # 猜到正确的数字后 while 循环会中止
    elif guess < number:
        print('猜小了')
    else:
        print('猜大了')
print('循环结束')

遍历列表分为:
考虑索引
for i in range(0, 10)
不考虑索引
for i in len(range(0, 10)

range()按顺序生成整数序列

切片slice():string[start:end:step]

分割spilit:string.split(str="分隔的字符")

随机数random

基础算法

pass

数据库

 事务的四个特性

事务就是一系列操作作为一个整体,该操作时数据库最小工作单元,一起向系统提交,要么都执行,否则都不执行。

⼀个接⼝可以是⼀个事务,多个接⼝也可以是事务,⼀个流程可以是事务,事务代表⼀个完整的功能。

        1.原子性(Atomicity):事务被视为不可分割的最小单位,要么全部执行成功,要不全部不执行。如果事务中任何一部分操作失败,整个事务将被回滚到初始状态,不会对数据库产生影响。

        2.一致性(Consistency):事务在开始和结束时,数据库的状态必须保持一致。这意味着事务在执行结束后,要满足所有的数据完整性约束(主键约束、外键约束等)、触发器等。(通俗的理解就是当你插入、修改等操作修改数据时,如果不满足数据库的各种约束,则事务就会回滚)

        3.隔离性(lsolation):并发执行的多个事务之间应该相互隔离,互不干扰。每个事务在逻辑上好像是在独立运行,即使同时执行也不会相互影响。这样可以避免数据读取脏数据、不可重复读和幻读等问题。

        4.持久性(Durability):一旦事务提交成功,所做的修改将被永久保存在数据库中,即使在系统故障或崩溃后也不会丢失。

主键、外键和索引的区别

1)定义 主键:唯一标识一条记录,不能有重复的,不允许为空

外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值

索引:该字段没有重复值,但可以有一个空值

2)作用 主键:用来保证数据完整性

外键:用来和其他表建立联系用的

索引:提高查询排序的速度

3)个数 主键:只能有一个

外键:一个表可以有多个外键

索引:一个表可以有多个索引

delete、truncate、drop

简单来说就是delete是删某一条数据或多条/全部数据的,truncate是删表的所有数据,drop是直接删表

在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就 是著名的并发性问题。

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性

计算机网络

很简单的八股

Osi模型、Tcp,udp使用区别;

TCP/IP协议四层:应用层、传输层、网络层、链路层

Osi七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层

Tcp:可靠,安全,稳定,速度慢,保证数据完整、无损和正确顺序

Udp:不可靠,快速,损耗小,不会对数据包的顺序和是否到达目的地进行检查

http和https区别?

http+ssl安全套接层加密,https更加安全,http是明文传输

http默认端口80,https是443

前缀url不一样

get、post区别,适用情况?

1.长度:

get方法时,请求参数和对应的值附加在url后面,一般浏览器url都会有长度限制,所以也就受限制,

post是放在请求体Request body里面的不受限制

2.安全:

get所有请求参数是直接放在url当中的

post是放在body当中的,虽然f12或者抓包工具就能查到,只是相比较而言更安全

3.能否被缓存:

get能被缓存,post无法被缓存

4.业务功能用途:

get一般用于查询或者获取数据的时候

post一般都是用来提交表单数据,以及修改数据的时候

状态码

200/301/401/402/403/404/500/503;

200:响应成功

301:重定向,网页发生转移

400:客户端有语法错误,不能被服务端正确理解

401:请求未经授权

403:服务器收到请求,但是拒绝服务

404:服务器找不到请求的网页

500:服务器发生不可预期的错误

503:服务器当前不能处理用户的请求,一段时间后可能会恢复正常

tcp三次握手和四次挥手:

面试官你好,这个问题我是知道的。TCP/IP协议是传输层的一个面向连接的安全可靠的传输协议。

三次握手的机制是为了保证能建立一个安全可靠的连接;第一次握手是由客户端发起,客户端会向服务端发送一个请求/报文SYN,当服务端收到这个请求报文的时候就知道客户端要和我发起一个新的连接,于是服务端就向客户端发送一个确认消息包ACK,以上两次握手之后,对于客户端而言,其实是已经知道了所有信息,就是我既能给服务端发送消息,我还能收到服务端的消息;对于服务端而言,两次握手是不够的,因为到目前为止,服务端只知道一件事情,客户端给我发送的消息我收的到,但是我发给客户端的消息,客户端能不能收到我还不知道。

所以还要进行第三次握手。第三次握手就是当客户端收到服务端发过来的确认收到的消息报文之后,还要继续给服务端进行一个回应,这个回应也是ACK确认,回应我客户端也收到了你服务器发给我的确认消息。

通过以上三次连接,不管是服务端还是客户端都彼此知道了,我既能给对方发送消息也能收到对方的消息,那么这个连接就能被安全的建立了。

四次挥手机制,也是由客户端首先发起的,客户端会发起一个请求/报文FIN;当服务端收到这报文之后,我就知道了客户端想要和我服务端断开连接,但是此时服务端不一定能做好准备,因为当客户端发起断开连接的时候,我服务端说不定还有东西要继续发送呢;所以此时对于服务端而言他只能进行一个消息确认ACK,我先告诉服务端,我知道你要和我断开连接了,但是我这还可能没有做好准备,你还需要等我一下,等会我会告诉你;于是,发完这个消息确认包后,可能稍作片刻,它可能会继续发送一个断开连接的报文FIN,是由服务端发给客户端的,这个报文表示了服务端已经做好了断开连接的准备,那么当这个报文发给客户端的时候,客户端同样要给服务端继续发送一个消息确认的报文,表明接收到了,然后服务端会有超时等待。一共有四次,通过这四次的相互沟通和连接,我就知道了,不管是服务端还是客户端都已经做好了断开连接的准备,于是连接就可以被断开了。

这是我对三次握手和四次挥手的理解。

为啥不是三次挥手?

三次挥手就是服务器发送断开连接的FIN,此时服务器只能告诉客户端我数据发送完了,可以关闭连接,可服务端不知道数据是不是成功传过去了,所以接着就是四次挥手客户端应答确认,同意关闭连接

为什么挥手要超时等待?

因为客服端向服务端发送的确认/ACK之后万一发生问题了没整过去,服务端会一直在最后确认的状态,因为不知道自己确认断开的请求是不是发过去了,客户端有超时等待就不会有问题,因为服务端长时间未接受确认ack包会再发一次fin包。

cookiesession是什么?

Cookiekv对格式的本地文件

客户端请求服务器,服务器是不会记录信息的,也就是HTTP无状态,这样会很麻烦,我进入到下一级界面或者退出再进入就又要再次进行身份验的操作。那Cookie和Session就是用来补充的,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态,然后根据Cookie把相应的数据发给你。Cookie是浏览器对于一些信息的键值对形式保存,当浏览器关闭,Cookie也就删除了(也有关浏览器依然保持会话的)

Session是服务端保存的临时会话

客户端浏览器访问服务器的时候,服务器把客户端信息和数据以某种形式记录在服务器上,比如把SessionId存在Cookie里边,之后浏览器发送请求时,便可以通过Cookie中的sessionId(key)找到响应的用户。这就是Session。客户端浏览器再次访问时只需要从该Session中的Key查找该客户的状态就给你返回相应数据

但如果多个服务器,有负载均衡,那换个服务器就找不到Cookie里的Key了,这个时候就有Token,就是个秘钥,服务器通过这个秘钥来辨别身份,而且不需要储存用户信息,也可以不放在Cookie里。

一个是给通行证,一个是查客户明细表,都是确认身份

        1、cookie

          (1)通常,登录后,在浏览器端生成一个文件,保存在浏览器的客户端;

          (2)一般会存储用户的身份信息;

          (3)可以删除,删除后,重新登录可以再次生成;

          (4)有些系统也会通过cookie记录一些用户的操作习惯;

        2、session

          (1)登录后,服务器端发送一个随机的ID值,来进行用户身份的识别;

          (2)有时效性,在代码中进行设计,一般30分钟;

          (3)只支持一个应用服务器有效;

        3、token

          (1)登录后,服务器端发送一个token令牌;

          (2)有时效性;

          (3)可以支持多平台访问

同步和异步

同步和异步是一种通讯方式

同步:执行一个操作时,需要等待其处理完成,然后再进行下一个操作

异步:执行一个操作时,不需要等待返回,就进行下一个操作,一般需要使用并行或者消息中间件

举例: 下单接口中,需要调用库存接口做库存判断,所以必须等待库存接口返回数据才 能进行下一步操作,这是同步; 下单接口中,下单成功后需要调用邮件通知接口,不用等待接口返回成功,就可以直接进行下一步操作,这是异步

还有好多我还没写完,两点半了先睡觉了,应该可以继续编辑吧..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值