jemter做接口测试

Jmeter做接口测试

Jmeter脚本编写一般分五个步骤:
  1. 添加线程组

  2. 添加 http 请求

  3. 在 http 请求中写入接入 url、路径、请求方式和参数

  4. 添加查看结果树

  5. 调用接口、查看返回值

本次用来测试的接口地址的api:httpbin.org

一、实施1-2步骤:

添加线程组、http请求

二、配置http请求的相关参数

在 http 请求中写入接入 url、路径、请求方式和参数,当前选择请求的方式为GET方式。

三、调用接口,查看返回值

  1. 添加查看结果树

  2. 调用接口,得到返回值

四,请求方式改为post方式来进行请求

改为post进行测试,得到的响应数据

五,http请求默认值

通过上面两个请求我们发现,Web 服务器中的协议和服务器名称或 IP 这两个值都是一样,每次重复输入其实比较麻烦,因此我们可以使用 HTTP 请求默认值来管理这些公共的配置数据。

添加步骤:

线程组——添加——配置元件——HTTP 请求默认值

然后进行如下配置,并把该元件放置到请求前面。

经过请求默认值的配置后,后续我们增加新的请求,如果这两项值是一样的话,那么则无需再重复填入该值。

六,断言设置

Jmeter 可以针对每一个请求响应进行断言。

设置步骤:

选中一个请求,如 http-get,然后右键选择:

添加——断言——响应断言。

各个匹配模式含义如下

包括:响应内容包括需要匹配的内容即代表响应成功,支持正则表达式

匹配:响应内容要完全匹配需要匹配的内容即代表响应成功,大小写不敏感,支持正则表达式。

Equals:响应内容要完全等于需要匹配的内容才代表成功,大小写敏感,需要匹配的内容是字符串正则表达式

Substring:返回结果包含指定结果的字串,但是 subString 不支持正则字符串

如下图所示匹配返回的字符串是否包含:http://httpbin.org/get

如果断言成功,则查看结果树为绿色标志,如果断言失败则为红色显示,如下图所示:

七,参数设置

Jmeter 支持通过 Query String Parameters 或者 Request body 请求体来传递参数。

Query String Parameters

如果希望在请求 URL 中添加参数,则可以在 Http 请求界面的 Parameters 选项里面添加参数。该参数会通过 Query String Parameters 方式传递给服务器,也就是在 URL 中传递参数。 如下图如所示设置参数:

Request body

在 Post 请求中参数一般在 body 中传递,Jmeter 也支持在 body 中传递参数。如传递 Json 格式的参数,在 BodyData 编辑框输入如下参数:

{“username”:”Test1234”}

image-20210909181352243

另外还需要指定参数的格式,因此需要添加 HTTP 信息头

添加步骤:

选定请求——添加——配置元件——HTTP 信息头管理器,然后在管理器里面添加参数类型

Content-Type :application/json 如下图所示:

八,变量

在请求过程中,有时我们需要在请求中设置一些变量来测试不同的场景。

Jmeter 支持以下类型变量:

  1. 用户自定义变量

  2. 函数生成变量

  3. 数据文件变量

(1) 用户自定义变量

设置步骤: 选中请求——添加——前置处理器——用户参数 设置变量名称为 user,值为 Test1234

在请求时引用变量如下所示: 变量引用格式为:${user}

(2)函数生成变量

Jmeter 有许多内置的函数,可以生成随机数。

创建步骤:

点击菜单栏选项——函数助手对话框——下拉选择__Random()函数 函数配置如下:

(3)CSV数据文件变量

CSV 数据文件变量是指从外部 csv 文件读取数据出来作为变量。

设置步骤:

选择请求——添加——配置元件——CSV 数据文件设置

创建 csv 文件: 注意文件编码为 UTF-8 文件内容如下:

Test1234,Test1234

data.csv

CSV 数据文件设置如下:

在 Post 请求中引用变量数据如下:

image-20210909182059478

得到的请求数据

GET http://httpbin.org/?user=Test1234&pwd=Test1234

GET data:

Test1234Test1234{“username”:”Test1234”}

[no cookies]

(4)csv参数化

针对之前的 POST 接口进行如下参数遍历测试:

接口如下:

http://httpbin.org/post

发送参数:user1.csv

user1,user1

user2,user2

user3,user3

在之前的 csv 数据文件设置需要需改配置如下:

表示把所有数据读取一遍,且不重复。

读取的数据:

九,用例分离

用例设计

之前我们的用例数据都是配置在 Jmeter Http 请求中,每次需要增加,修改用例都需要打开 jmeter 重新编辑,当 用例越来越多的时候,用例维护起来就越来越麻烦,有没有好的方法来解决这种情况呢?

其实我们可以将用例的数据存放在 csv 文件中,然后通过 csv 文件配置来读取用例中的数据,执行测试。用例数据如图所示:

用例名称变量含义:

1.${caseSeq}:用例编号

2.${apiType}:api 类型

3.${apiSeq} :api 版本号

4.${apiName}:api 名称

5.${priority}:优先级

6.${url}:api 路径

7.${methods}:请求方法

8.${parameter}: 请求参数

9.${expectValue}:期望值,用于断言

Jmeter设置步骤:
1.新建一个线程组,命名为:数据驱动

2.创建一个 http 请求默认值,设置如下:

3.添加一个循环控制器

步骤为:线程组——添加——逻辑控制器——循环控制器。

循环控制器的作用可以控制整个用例循环执行的次数。默认值是 1 根据用例数量可以修改为 4

4.在循环控制器节点下创建 CSV 文件设置,具体配置内容如下——注意csv文件为上面的用例设计这步

5.创建一个 if 控制器

步骤为:循环控制器——添加——逻辑控制器——if 控制器

if 控制器的作用为根据不同条件执行不同的用例,例如这里根据不同的接口请求类型,分别创建了 GET 和 POST 两个控制器。

GET 设置的条件语句如下:

条件语句为:**”${methods}”==”GET” 其中${methods}表示引用 csv 中的methods中的值**。

参数:

• Interpret Condition as Variable Expression?:如果这个选项被选中,将不会使用 js 解析;条件表达式的值必须是 true(忽略大小写),这里我们取消勾选状态。

Evaluate for all children:如果选中这一项,在每个子结点执行前都会计算表达式

6.创建 GET 请求类型的用例如下:

7.POST请求设置:POST 条件语句设置为:”${methods}”==”POST”

用例名称格式:${caseSeq}_ ${apiSeq}_${apiName}

断言设置如下:${expectValue}引用 csv 中对应的值。

十,测试报告

批量执行完接口测试之后,我们需要查看测试报告,在之前单个接口调试我们是通过查看结果树查看结果,但是当大

批量执行接口测试之后依旧这样查看那么肯定会很低效 那么该如何设置呢?

聚合报告

聚合报告是一个比较精简的报告元件,可以查看每个接口的性能情况与执行结果。 设置步骤:选中线程组——添

加——监听器——聚合报告。报告各个参数含义如下:

• Samples – 本次场景中一共完成了多少个请求

• Average – 平均响应时间(单位:ms)

• Median – 响应时间的中值(单位:ms)

• 90% Line – 所有请求中 90%的响应时间。

• Min – 最小响应时间(单位:ms)

• Max – 最大响应时间(单位:ms)

• Error – 出错率

• Troughput – 吞吐量

• Received–响应数据大小

• KB/sec – 以流量做衡量的吞吐量

HTML 报告

有时候我们需要将测试报告以 HTML 附件形式发送给各个项目成员,那么需要生成 HTML 报告。 JMeter3.0 以后引入了 Dashboard Report,用于生成 HTML 页面格式图形化报告的扩展模块。

生成步骤:

打开 cmd 进入 jmeter 目录 bin 目录

执行命令:

jmeter -n -t httpbin_test.jmx -l httpbin.jtl -e -o C:\Users\Administrator\Desktop\Report

命令的参数:

-n :以非 GUI 形式运行 Jmeter

-t :jmeter 脚本路径

-l :result.jtl 运行结果保存路径(.jtl)此文件必须不存在。

-e :在脚本运行结束后生成 html 报告

-o :用于存放 html 报告的目录,不加该参数默认生成到

参考拓展资料

https://blog.csdn.net/zhizunyu2009/article/details/79011413

https://blog.csdn.net/gld824125233/article/details/52842914

https://blog.csdn.net/defonds/article/details/53517247

https://blog.csdn.net/wuyou10206/article/details/77539791

https://blog.csdn.net/huangjuyan/article/details/52993758

https://www.cnblogs.com/imyalost/p/10239317.html

http协议

http协议简介

(1)超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的 一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了 提供一种发布和接收 HTML(超文本标记语言) 页面的方法。

HTTP 协议在网络 OSI 模型中属于应用层协议,应用层协议除了 HTTP 还有:FTP, SMTP,DNS,RIP,Telnet 等。

HTTP 协议工作于客户端—服务端架构上。浏览器作为 HTTP 客户端通过 **URL(网址)**向 HTTP 服务端(即 Web 服务器) 发送请求。

(2)什么是超文本?

超文本英文名称叫做 Hypertext,我们在浏览器里面看到的网页就是超文本解析而成的, 其网页源代码是一系 列 HTML 代码,里面包含了一系列标签,如 img 显示图片,p 指定显示段落等,浏览器解析这些标签后便形成了我们平常看到的网页,而这网页的源代码 HTML ,就可以称作超文本。 例如我们在 Chrome 浏览器里面打开如百度页面,右键点击”查看源代码”,这些源代 码都是超文本。

(3)什么是URL?

我们在浏览器的地址栏里输入的网站地址叫做 URL(Uniform Resource Locator,统一资源定位符)。就像每家每 户都有一个门牌地址一样,每个网页也都有一个 Internet 地 址(如:http://www.baidu.com)。

(4) http功能

HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是用于从服务器传输 超文本到本地浏览器的传输协议。

(5) http的特点

无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户端的请求,并收到 客户端的应答后, 即断开连接。采用这种方式可以节省传输时间。

媒体独立:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可 以通过 HTTP 发送。客户端以及服务器指定使用适合的 MIME-type 来传输。

无状态:HTTP 协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。如果服务 器不需要先前信 息,那么它的应答就比较快。但是缺少状态意味着如果后续处理需要前面 的信息,则它必须重传,这样可 能导致每次连接传送的数据量增大,此时可以设置缓存。

(6) http与https的区别?

HTTPS 的全称是 Hyper Text Transfer Protocol over Secure Socket Layer,是以 安全为目标的 HTTP 通道,简单讲是 HTTP 的安全版,即 HTTP 下加入 SSL 层(Secure Sockets Layer 安全套接层),简称为 HTTPS。

HTTPS 的安全基础是 SSL,因此通过它传输的内容都是经过 SSL 加密的,它的主要作用可以分为两种:

  1. 是建立一个信息安全通道,来保证数据传输的安全。

  2. 确认网站的真实性,凡是使用了 https 的网站,都可以通过点击浏览器地址栏的锁头标 志来查看网站认证之 后的真实信息,也可以通过 CA 机构颁发的安全签章来查询。现在越来越多的网站和 APP 都已经向 HTTPS 方向发展。例如:谷歌从 2017 年 1 月推出的 Chrome 56 开始, 对未进行 HTTPS 加密的网址链接亮出风险提示,即在地址栏的显著位置提醒用户“此网页不安全”。

7.http与TCP/IP的特点:

TCP/IP 协议是传输层协议,主要解决数据如何在网络中传输,而 HTTP 是应用层协 议,主要解决如何包装数据。

http的请求

我们在浏览器输入百度首页的地址:https://www.baidu.com/ 输入之后浏览器会给 我们打开百度首页。 实际上这 个过程是浏览器向网站所在的服务器发送了一个 Request,即请求,网站服 务器接收到这个 Request 之后进行处 理和解析,然后返回对应的一个 Response,即响 应,然后传回给浏览器,Response 里面就包含了页面的源代码等内容,浏览器再对其进行解析便将网页呈现了出来。

列如,使用火狐浏览器,打开百度,查看页面的请求过程。

需要详细步骤,点击这边:

https://zhidao.baidu.com/question/428894531624967852.html

(1)请求的四部分

•Request Method: 请求方式

•Request URL: 请求链接

•Request Headers: 请求头

•Request Body: 请求体

wireshark的使用

wireshark介绍

wireshark的官方下载网站: http://www.wireshark.org/

wireshark是非常流行的网络封包分析软件,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。

wireshark是开源软件,可以放心使用。 可以运行在Windows和Mac OS上。

使用wireshark的人必须了解网络协议,否则就看不懂wireshark了。

Wireshark不能做的:

为了安全考虑,wireshark只能查看封包,而不能修改封包的内容,或者发送封包。

Wireshark 对比 Fiddler

Fiddler是在windows上运行的程序,专门用来捕获HTTP,HTTPS的。

wireshark能获取HTTP,也能获取HTTPS,但是不能解密HTTPS,所以wireshark看不懂HTTPS中的内容

总结,如果是处理HTTP,HTTPS 还是用Fiddler, 其他协议比如TCP,UDP 就用wireshark

什么人会用到wireshark
  1. 网络管理员会使用wireshark来检查网络问题

  2. 软件测试工程师使用wireshark抓包,来分析自己测试的软件

  3. 从事socket编程的工程师会用wireshark来调试

总之跟网络相关的东西,都可能会用到wireshark.

wireshark 开始抓包

开始界面

wireshark是捕获机器上的某一块网卡的网络包,当你的机器上有多块网卡的时候,你需要选择一个网卡。

点击Caputre->Interfaces.. 出现下面对话框,选择正确的网卡。然后点击”Start”按钮, 开始抓包

Wireshark 窗口介绍

WireShark 主要分为这几个界面

  1. Display Filter(显示过滤器), 用于过滤

  2. Packet List Pane(封包列表), 显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表

  3. Packet Details Pane(封包详细信息), 显示封包中的字段

  4. Dissector Pane(16进制数据)

  5. Miscellanous(地址栏,杂项)

Wireshark 显示过滤

使用过滤是非常重要的, 初学者使用wireshark时,将会得到大量的冗余信息,在几千甚至几万条记录中,以至于很难找到自己需要的部分。搞得晕头转向。

过滤器会帮助我们在大量的数据中迅速找到我们需要的信息。

过滤器有两种,

一种是显示过滤器,就是主界面上那个,用来在捕获的记录中找到所需要的记录

一种是捕获过滤器,用来过滤捕获的封包,以免捕获太多的记录。 在Capture -> Capture Filters 中设置

保存过滤

在Filter栏上,填好Filter的表达式后,点击Save按钮, 取个名字。比如”Filter 102”,

Filter栏上就多了个”Filter 102” 的按钮。

过滤表达式的规则

表达式规则

  1. 协议过滤

比如TCP,只显示TCP协议。

  1. IP 过滤

比如 ip.src ==192.168.1.102 显示源地址为192.168.1.102,

ip.dst==192.168.1.102, 目标地址为192.168.1.102

  1. 端口过滤

tcp.port ==80, 端口为80的

tcp.srcport == 80, 只显示TCP协议的愿端口为80的。

  1. Http模式过滤

http.request.method==”GET”, 只显示HTTP GET方法的。

  1. 逻辑运算符为 AND/ OR

常用的过滤表达式

封包列表(Packet List Pane)

封包列表的面板中显示,编号,时间戳,源地址,目标地址,协议,长度,以及封包信息。 你可以看到不同的协议用了不同的颜色显示。

你也可以修改这些显示颜色的规则, View ->Coloring Rules.

封包详细信息 (Packet Details Pane)

这个面板是我们最重要的,用来查看协议中的每一个字段。

各行信息分别为

Frame: 物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol Version 4: 互联网层IP包头部信息

Transmission Control Protocol: 传输层T的数据段头部信息,此处是TCP

Hypertext Transfer Protocol: 应用层的信息,此处是HTTP协议

wireshark与对应的OSI七层模型

TCP包的具体内容

从下图可以看到wireshark捕获到的TCP包中的每个字段。

实例分析TCP三次握手过程

看到这, 基本上对wireshak有了初步了解, 现在我们看一个TCP三次握手的实例

三次握手过程为

都看过很多遍了, 这次我们用wireshark实际分析下三次握手的过程。

打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao

在wireshark中输入http过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击”Follow TCP Stream”,

这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图

图中可以看到wireshark截获到了三次握手的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

第一次握手数据包

客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。 如下图

第二次握手的数据包

服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的I S N加1以.即0+1=1, 如下图

第三次握手的数据包

客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1, 如下图:

就这样通过了TCP三次握手,建立了连接

linux

liunx概叙

Linux是基于Unix的

Linux是一种自由和开放源码的操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、台式计算机

liunx系统的应用

服务器系统

Web应用服务器、数据库服务器、接口服务器、DNS、FTP等等;

嵌入式系统

路由器、防火墙、手机、PDA、IP 分享器、交换器、家电用品的微电脑控制器等等,

高性能运算、计算密集型应用

Linux有强大的运算能力。

桌面应用系统

移动手持系统

liunx目录结构

一.liunx的目录

cd /:进入linux的根目录

然后ll指令,下面图是linux的文件目录,linux中是一切皆文件

二.liunx基本指令

文件列出命令

Ls: 列出当前目录里面所有的文件和文件夹

Ll: 列出当前目录里面所有的文件和文件夹详细信息

Ls -a:列出所有文件和文件夹(包含隐藏文件)

访问命令

cd 文件夹名 :访问某个文件夹

cd 文件夹1/文件夹2

cd ../ 返回上一级

创建文件夹

Mkdir 文件夹名字

Mkdir -p 文件夹1/文件夹2/….

删除空文件夹

Rmdir 文件夹名

浏览文件的指令

Cat:访问的是文件的最后面的部分

More: 访问文件,它会显示文件的百分比,按下空格键进行切换。

Less: 访问文件内容:根据pgup和pgdn来进行上下翻页

Tail:

tail 文件名:访问文件

tail -数字 文件名:访问后几行

删除命令

Rm 文件名 ——询问式删除

Rm - f 文件名 ——不询问式删除

rm -r 文件夹名——递归删除

Rm -rf ./* ——删除掉当前目录下面所有的文件和文件夹

rm -rf * 自杀式删除

复制、粘贴

Cp 源文件 目标文件夹

剪切

Mv 源文件 目标文件夹

打包压缩、解压

Tar -参数 压缩包名 ./*

压缩

Tar -czvf X.gz ./*

解压

Tar -xvf x.gz

创建文件编辑信息

Vi 文件名

按下“i”键进入 insert模式

输入文字

保存:

Esc —>输入“:wq”

不保存:

Esc—->输入“q!”

Vi与vim大致相同!

其他常用命令

pwd:显示当前所在目录

touch:创建一个空文件 示例: touch a.txt

ll -h:友好显示文件大小

wget:下载资料 示例: wget https://www.baidu.com

liunx权限命令

文件权限

Linux三种文件类型:

普通文件: 包括文本文件、数据文件、可执行的二进制程序文件等。

目录文件: Linux系统把目录看成是一种特殊的文件,利用它构成文件系统的树型结构。

设备文件: Linux系统把每一个设备都看成是一个文件

文件类型标识:

普通文件(-)

目录(d)

符号链接(l)

* 进入etc可以查看,相当于快捷方式

字符设备文件(c)

块设备文件(s)

套接字(s)

命名管道(p)

文件管理权限:

linux系统中的755权限是指所有者拥有可读、可写、可执行权限,所属组与其他用户仅拥有可读与可执行权限。linux系统的权限一般是用1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9位数字代表其他用户的权限。

以 755 为例:

● 1-3 位 7 等于 4+2+1,rwx,所有者具有读取、写入、执行权限;

● 4-6 位 5 等于 4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;

● 7-9 位 5,同上,也是 r-x,其他用户具有读取、执行权限但没有写入权限。

常用的linux文件权限:

444 r–r–r–
600 rw——-
644 rw-r–r–
666 rw-rw-rw-
700 rwx——
744 rwxr–r–
755 rwxr-xr-x
777 rwxrwxrwx

从左至右,1-3位数字代表文件所有者的权限,4-6位数字代表同组用户的权限,7-9数字代表其他用户的权限。
而具体的权限是由数字来表示的,读取的权限等于4,用r表示;写入的权限等于2,用w表示;执行的权限等于1,用x表示;
通过4、2、1的组合,得到以下几种权限:0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入+执行)
以755为例:
1-3位7等于4+2+1,rwx,所有者具有读取、写入、执行权限;
4-6位5等于4+1+0,r-x,同组用户具有读取、执行权限但没有写入权限;
7-9位5,同上,也是r-x,其他用户具有读取、执行权限但没有写入权限。

rwx权限数字解释
chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。
范例:
chmod a=rwx file

chmod 777 file
效果相同
chmod ug=rwx,o=x file

chmod 771 file
效果相同
若用chmod 4755 filename可使此程序具有root的权限

三.把文件传输到linux服务器上面

使用ftp工具来传输

ftp协议:文件传输协议

四.在linux服务器上面安装jdk环境

① 把jdk的linux版本上传上去

② 查询linux系统自带的版本

Java -version

查询全部的jdk版本:

rpm -qa | grep java

③ 卸载版本

Rpm -e - -nodeps 版本号

一条一条删除

安装:

在 usr/local/src里面创建一个java文件夹

在上述java文件夹里面,把jdk的安装包传输过来

解压jdk的文件

  1. 安装依赖:yum install glibc.i686

​ 去修改配置文件 etc/profile 最后面加上下面这段

#set java environment

​ JAVA_HOME=/usr/local/src/java/jdk1.7.0_71

​ CLASSPATH=.:$JAVA_HOME/lib.tools.jar

​ PATH=$JAVA_HOME/bin:$PATH

​ export JAVA_HOME CLASSPATH PATH

加载配置文件: source etc/profile

最后验证:java -version

在liunx上安装mysql

准备:mysql(linux版本)

步骤:

  1. 传上去,在usr/local/src 在这里创建一个mysql的文件夹

  2. 检测一下自己的系统是否自带mysql

    rpm -qa | grep mysql

3.卸载掉自带的mysql版本

4.在文件夹里面,解压mysql

  1. 安装server

指令:rpm -ivh MySQL-server-5.6.22-1.el6.i686.rpm

直接提示安装成功

整个server就安装成功,在linux上面,把mysql的服务端装成功了。

  1. 安装client(客户端)

安装成功的截图

服务和客户端安装完毕

  1. 查询mysql的服务状态

服务端与客户端安装完毕

查询mysql的服务的状态

指令:service mysql status

说明服务没有启动,接着输入指令启动服务

service mysql start

Mysql的服务启动成功

8.使用root来登陆mysql(忽视)

  1. 去找登陆密码:必须进入root目录里面来

​ root用户目录里面,去找一个隐藏文件

10.使用查看隐藏文件的指令 ll -a

11.使用vi编辑器去打开这个文件

vi .mysql_secret

12.使用mysql的root账户来登陆

mysql -uroot -p

13.输入刚刚复制的密码,然后登陆成功。 Lyv87TDvlw_0hUSJ(是我的原始密码)

image-20210908155746577

14.登陆进来第一件事,改密码:

修改root密码:SET PASSWORD = PASSWORD(‘123456’);

密码修改成功,输入“exit;”退出

15.把mysql加入到系统的自启动

chkconfig –add mysql

16.mysql自动启动

chkconfig mysql on

完成上述步骤,我们在linux上面安装好了mysql,mysql的服务也会随着linux系统启动而启动,但是它还不能支持远程访问。

17.开启远程访问(必须登陆进去)

A. 登陆到mysql当中去: mysql -uroot -p

B. 设置mysql的远程访问的规则:

grant all privileges on . to ‘root’ @’%’ identified by ‘123456’;

​ Flush privileges;

18.打开防火墙规则,开启mysql的3306端口(必须退出mysql的登陆状态)

/sbin/iptables -I INPUT -p tcp –dport 3306 -j ACCEPT

/etc/rc.d/init.d/iptables save

/etc/init.d/iptables status

完成这一步,我们基本上可以去远程来访问我们mysql服务了。

19.使用Navicat工具远程连接mysql的服务:

sql查询50道

#创建库

CREATE DATABASE aa;
USE aa;

表1

CREATE TABLE Student(sid VARCHAR(10),sname VARCHAR(10),sage DATETIME,ssex VARCHAR(10));

插入数据:
INSERT INTO Student VALUES(‘01’ , ‘赵雷’ , ‘1990-01-01’ , ‘男’);
INSERT INTO Student VALUES(‘02’ , ‘钱电’ , ‘1990-12-21’ , ‘男’);
INSERT INTO Student VALUES(‘03’ , ‘孙风’ , ‘1990-05-20’ , ‘男’);
INSERT INTO Student VALUES(‘04’ , ‘李云’ , ‘1990-08-06’ , ‘男’);
INSERT INTO Student VALUES(‘05’ , ‘周梅’ , ‘1991-12-01’ , ‘女’);
INSERT INTO Student VALUES(‘06’ , ‘吴兰’ , ‘1992-03-01’, ‘女’);
INSERT INTO Student VALUES(‘07’ , ‘郑竹’ , ‘1989-07-01’ , ‘女’);
INSERT INTO Student VALUES(‘08’ , ‘王菊’ , ‘1990-01-20’ , ‘女’);


表2

CREATE TABLE Course(cid VARCHAR(10),cname VARCHAR(10),tid VARCHAR(10));

插入数据
INSERT INTO Course VALUES(‘01’ , ‘语文’ , ‘02’);
INSERT INTO Course VALUES(‘02’ , ‘数学’ , ‘01’);

INSERT INTO Course VALUES(‘03’ , ‘英语’ ,’03’);

表3

CREATE TABLE Teacher(tid VARCHAR(10),tname VARCHAR(10));

插入数据
INSERT INTO Teacher VALUES(‘01’ , ‘张三’);
INSERT INTO Teacher VALUES(‘02’ , ‘李四’);

INSERT INTO Teacher VALUES(‘03’ , ‘王五’);

表4

CREATE TABLE SC(sid VARCHAR(10),cid
VARCHAR(10),score DECIMAL(18,1));

插入数据
INSERT INTO SC VALUES(‘01’ , ‘01’ , 80);
INSERT INTO SC VALUES(‘01’ , ‘02’ , 90);
INSERT INTO SC VALUES(‘01’ , ‘03’ , 99);
INSERT INTO SC VALUES(‘02’ , ‘01’ , 70);
INSERT INTO SC VALUES(‘02’ , ‘02’ , 60);
INSERT INTO SC VALUES(‘02’ , ‘03’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘01’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘02’ , 80);
INSERT INTO SC VALUES(‘03’ , ‘03’ , 80);
INSERT INTO SC VALUES(‘04’ , ‘01’ , 50);
INSERT INTO SC VALUES(‘04’ , ‘02’ , 30);
INSERT INTO SC VALUES(‘04’ , ‘03’ , 20);
INSERT INTO SC VALUES(‘05’ , ‘01’ , 76);
INSERT INTO SC VALUES(‘05’ , ‘02’ , 87);
INSERT INTO SC VALUES(‘06’ , ‘01’ , 31);
INSERT INTO SC VALUES(‘06’ , ‘03’ , 34);
INSERT INTO SC VALUES(‘07’ , ‘02’ , 89);
INSERT INTO SC VALUES(‘07’ , ‘03’ , 98);

接下来是题目:

#1.查询“某1”课程比“某2”课程成绩高的所有学生的学号;

SELECT *
FROM (SELECT *FROM sc WHERE sc.CId=01) AS ch
INNER JOIN(SELECT * FROM sc WHERE sc.CId=02)AS mh
ON ch.SId=mh.SId WHERE ch.Score>mh.Score

#2.查询平均成绩大于60分的同学的学号和平均成绩;

SELECT sid,AVG(score) FROM sc GROUP BY sid
HAVING AVG(score)>60;

#3.查询所有同学的学号、姓名、选课数、总成绩

SELECT Student.sid,Student.Sname,COUNT(SC.cid),SUM(score)
FROM Student LEFT OUTER JOIN SC ON Student.sid=SC.cid
GROUP BY Student.sid,Sname

#4.查询姓“李”的老师的个数;

SELECT COUNT(teacher.tid)FROM teacher
WHERE teacher.tname LIKE’李%’

#5.查询没学过“张三”老师课的同学的学号、姓名;

SELECT Student.sid,Student.Sname FROM Student WHERE sid
NOT IN (SELECT DISTINCT( SC.sid) FROM SC,Course,Teacher
WHERE SC.cid=Course.cid AND Teacher.tid=Course.tid AND
Teacher.Tname=”张三”);

#6.查询学过“ ”并且也学过编号“ ”课程的同学的学号、姓名;

SELECT a.SID,a.SNAME FROM (SELECT student.SNAME,student.SID
FROM student,course,sc WHERE cname=”语文”
AND sc.sid=student.sid AND sc.cid=course.cid)AS a,
(SELECT student.SNAME,student.SID FROM student,course,
sc WHERE cname=’数学’AND sc.sid=student.sid AND
sc.cid=course.cid)AS b WHERE a.sid=b.sid;

#7.查询学过“张三”老师所教的所有课的同学的学号、姓名;

SELECT sid,Sname FROM Student WHERE sid IN (SELECT sid FROM
SC ,Course ,Teacher WHERE SC.cid=Course.cid AND
Teacher.tid=Course.tid AND Teacher.Tname=’张三’
GROUP BY sid HAVING COUNT(SC.cid)=(SELECT COUNT(cid) FROM
Course,Teacher
WHERE Teacher.tid=Course.tid AND Tname=’张三’))

#8.*****查询课程编号“01”的成绩比课程编号“02”

#课程低的所有同学的学号、姓名;

SELECT a.sid,a.sname FROM(SELECT student.SID,student.sname,
sc.SCORE FROM student,sc WHERE student.sid=sc.sid AND
sc.cid=1)AS a,(SELECT student.SID,student.sname,sc.score FROM
student,sc WHERE student.sid=sc.sid AND sc.cid=2)AS b
WHERE a.score<b.score AND a.sid=b.sid

#9.查询所有课程成绩小于60分的同学的学号、姓名;

SELECT sid,Sname FROM Student WHERE sid
NOT IN (SELECT Student.sid FROM Student,SC WHERE
Student.sid=SC.sid AND score>60);

#10.*****查询没有学全所有课的同学的学号、姓名;

SELECT Student.sid,Student.Sname FROM Student,SC
WHERE Student.sid=SC.sid GROUP BY
Student.sid,Student.Sname
HAVING COUNT(cid) <(SELECT COUNT(cid) FROM Course);

#11.查询至少有一门课与学号为“01”的同学所学相同的同学的学号和姓名;

SELECT DISTINCT(student.sid),student.sname FROM
student,sc WHERE student.sid=sc.sid AND
student.sid IN(
SELECT cid FROM sc WHERE sid=01)

#12.查询和”01”号的同学学习的课程完全相同的其他同学的学号和姓名

SELECT DISTINCT(student.sid),student.Sname FROM
Student,SC WHERE Student.sid=SC.sid AND
cid IN (SELECT cid FROM SC WHERE sid=1)

#13.*****把“SC”表中“张三”老师教的课的成绩都更改为此课程的平均成绩;

#这里求出张三老师的平均分值即可!!!
UPDATE sc SET score =(SELECT AVG(score) FROM
sc,course,teacher WHERE course.cid=sc.cid
AND course.tid=teacher.tid AND teacher.tname=”张三”)

mysql第三章

子查询

​ 子查询:把A的查询结果给B做参考(A子 B 父)
多级子查询

select * from orderdetail where Ordernum in

(select Ordernum from orders where CusID =

(select CusID from customers order by

Cuspoint desc limit 1))

语句解释
​ – 1.查询积分最高的客户的 id 号
​ – 2.通过子句查询id号来查询出订单号
​ – 3.通过子句查询出订单号来查询出对应订单的详情

子查询的结果是单行单列 ,条件可以使用 = > < >= <= !=

SELECT * FROM orders WHERE CusID =
(SELECT CusID FROM customers
ORDER BY CusPoint DESC LIMIT 1)

子查询的结果是多值 ,条件可以使用 in 、 not in
案例
select * from customers where cusid not in

(select distinct cusid from orders)

语句解释
– 1.查询所有下过单的客户id
– 2.通过这个子查询得到客户id号作为条件 ,来筛选出未下过单的客户

函数

系统函数

聚合函数:

​ max()
​ min()
​ count()
​ sum()
​ avg()

日期函数:

​ 1.SELECT NOW()
​ 获取当前的系统时间
​ 2.SELECT CURDATE()
​ 获取当前日期
​ 3.SELECT CURTIME()
​ 获取当前的时分秒

获取日期或时间中某个单位的整数:

​ 1.SELECT YEAR( d )
​ 获取指定时间的年
​ 2.month(d):月份
​ 3. dayofmonth(d):日
​ 4.hour(d):小时
​ 5.minute(d):分钟
​ 6.second(d):秒
​ 7.weekday(d) 获取这是一周的第几天
​ 周一为0
​ 8.week(d):一年中的第几周
​ 9.SELECT DAYOFYEAR(NOW()) :获取一年当中的第第多少天

日期运算:

1.datediff(d1,d2):计算d1-d2相差的天数
SELECT DATEDIFF(NOW(),’2001-2-6 08:59:33’);
单位:天
2.adddate(d,n):在d日期的基础上增加n天
SELECT ADDDATE(NOW(),5)
3.SUBdate(d,n):在d日期的基础上减少n天
SELECT SUBDATE(NOW(),50)
4.SELECT DATE_ADD(d,INTERVAL n type)
d:表示一个日期
INTERVAL:固定的关键字
n:数值
为正数:增加
为负数:减少
type:表示时间单位
year
month
day
week

日期格式的转换:

​ 用的函数:
​ date_format(时间,格式字符)
​ 案例
​ SELECT DATE_FORMAT(NOW(), ‘%Y年%m月%d日’);
​ 获取当前时间的年月日进行组合
​ 格式字符参考
​ %Y:表示四月年份
​ %m表示两位的月份
​ %d:表示两位日数
​ …可以参考课后资料表

数字函数:

​ SELECT ROUND(‘3.1465926’,2);
​ 四舍五入保留2位小数
​ SELECT ROUND(3.54)
​ 四舍五入保留整数
​ truncate(x,y):保留y位小数的值,只舍不入
​ ceil(x):返回大于等于x的最小整数(向上取整)
​ floor(x):与ceil相反,返回小于等于x的最大整数(向下取整)
​ rand():产生一个0~1的小数

字符串函数:

​ 1.concat(s1,s2,…):将多个字符串拼接
​ SELECT CONCAT(CusLogin,CusNick) FROM customers
​ 2.concat_ws(s,s1,s2,….):将多个字符串使用s进行拼接
​ SELECT CONCAT_WS(‘-‘,CusLogin,CusNick) FROM customers
​ 注意:在MySQL中不能使用+号来实现字符串拼接
​ 3.char_length(s):获取字符串字符长度
​ SELECT CHAR_LENGTH(‘A112班’)
​ 4.length(s):获取字符串字节长度
​ 5.right(x,n):截取x字符串的后面n个字符
​ 6.left(x,n):截取x字符串的前面n个字符
​ 7.substring(x,start,length):对x字符串进行截取,从start位置开始截取length个
​ SELECT SUBSTRING(‘这是一段字符串’,1,4);
​ 8.Upper(s):转化为大写
​ 9.Lower(s):转化为小写
​ 10.replace(s1,s2,s3):在s1的字符串中查找s2字符串并替换成s3字符串
​ locate(substr,str) 查找substr在str中第一次出现的位置
​ locate(substr,str,pos) 查找substr在str中pos后第一次出现的位置
​ 注意:mysql的索引从1开始
​ md5转换
​ 目的
​ 将字符串s转化为md5编码

字符串转换

​ 格式:
​ convert(x,type): 将x转换为type类型并返回
​ type的取值:
​ 字符类型:char(length)
​ 日期类型:date、time,datetime
​ 浮点型:decimal
​ 整数:signed
​ 案例:
​ SELECT CONVERT(‘123a’,SIGNED)+45;

二、自定义函数

语法格式

​ 创建
​ DROP FUNCTION IF EXISTS fn_test;
​ CREATE FUNCTION 函数名(参数 数据类型) returns 返回值类型
​ 没得花括号
​ return 返回值;
​ 调用
​ SELECT 函数名(传参)

注意事项

​ 必须有返回类型
​ 函数名使用fn_开头命名
​ 函数中不能产生查询结果集

删除函数 :drop function 函数名

mysql第二章

mysql增删改查操作

一.增:insert

1.一次插入一条数据:insert into 表名 values (值1,值2…)

2.一次插入多条:insert into 表名 values (值1,值2…),(值1,值2…)

3.通过查询来插入数据:insert into 表1 select * from 表2 where 条件(把表2的符合条件的数据 插入到表1中)

例:INSERT INTO stuinfo2 SELECT * FROM stuinfo WHERE stusex=’男

二.删(删除有三种方法可以删除)

delete:

只删除数据,但是没有删除表结构,标识列不会清零

语法:delete from 表名

只删除一条数据:

delete from 表名 where 条件

truncate:

只删除数据,但是没有删除表结构,标识列会清零

语法:truncate 表名

drop:

直接删除表结构

语法:drop table 表名

只删除一条数据:

delete from 表名 where 条件

三.改:update

语法:update 表名 set 要修改的列=修改的值 where 条件

四. 查(重点)

一切的根源:

​ select * from 表名 查询整表
​ select 列名 from 表名 查询部分

关键字 :where + 条件
逻辑词的使用:and or not

​ and :并且
​ or: 或者
​ not: 非
​ 案例:查询年龄在18-22之间的学生
​ in

模糊查询

案例:学号最后一位是2或者3的学生
查询姓李的同学
like 关键字:
SELECT * FROM 表名 WHERE 字段名 LIKE “李%”;

%的用法: 前后都有,包含即可
在前面,以什么结尾
在后面,以什么开头
占位符的使用
LIKE “”;
下划线的长度决定了字符的长度

聚合函数

​ max:最大值
​ min:最小值
​ sum:求和
​ avg:平均数
​ count:统计/计数

排序

​ 排序的语法【order by】
​ SELECT * FROM 表名 ORDER BY 列名 ASC
​ SELECT * FROM 表名 ORDER BY 列名 DESC

分页 :limit

limit 起,截取几条

语法:LIMIT 2,3

分组: group by

​ 案例:给男女分组后,统计个数
​ having :分组后在过滤

总结顺序:

​ S……F…..W…..G…..H……O

去重复 :DISTINCT

​ 如何:SELECT DISTINCT(z_money) FROM zhangwu

合并查询结果集

​ 前提:两张表结构【字段个数、类型】必须一致
合并过滤重复结果集
​ select 字段列表1 from 表1
​ Union
​ Select 字段列表2 from 表2
合并不过滤重复结果集
​ select 字段列表1 from 表1
​ Union All
​ Select 字段列表2 from 表2

常见的多表查询的方式:

​ 交叉查询【不推荐】
​ 语法:
​ select * from 表1,表2
​ 现象:笛卡尔积

内连接查询【重点】

解释:
查询的结果集——两表有关联性的数据
语法:select * from 表1 as 别名1 inner join 表2 as 别名2 on 别名1.公共列=别名2.公共列;

​ select * from 表1,表2 where 表1.公共列=表2.公共列;

外连接查询
左外连接
​ 查询的结果集——两表有关联性的数据、左边表的全部
​ select * from 表1 as 别名1 left join 表2 as 别名2 on 别名1.公共列=别名2.公共列;

右外连接
​ select * from 表1 as 别名1 right join 表2 as 别名2 on 别名1.公共列=别名2.公共列;

mysql第一章

mysql数据库

一.什么是数据库?

存储文件,相当于数据的仓库

可以在数据库中对文件进行增删改查

1.常见的数据库有哪些?

关系型数据库

SQL server 、Oracle 、mysql 、DB2

非关系型数据库

resdis

2.如何在电脑上搭建一个MySQL环境,并安装一个MySQL的服务器

安装包有两个

安装前注意:安装失败了,一定要把文件中两个安装包卸载干净,再来重装,否则装不上去

默认用户名[超级管理员]:root

安装一个mysql可视化工具:

sql yog

navicat

二.mysql基本指令

show databases:显示当前mysql上的所有数据库

show tables:查询当前库下面的所有的表

drop database 库名:删除一个库

drop database if exists 库名 :先判断这个库存不存在,存在就删除

设置数据库的字符编码:

create database 库名 default character set =’utf8’

三.mysql常见的几种数据类型:

int:整数(范围在-214748364821474483647)/无符号范围(04294967295)

decimal:小数(decimal(5,2)则表示范围在:-999.99~999.99)

foalt(4字节):小数(单精度浮点,精准6个数字)

double(8字节):小数(双精度浮点,精准17个数字)

varchar:字符串(可变长度字符串,一个汉字两个汉字)

char:字符串(固定长度字符串,一个字节两个汉字)

datatime:日期类型(YYYY-MM-DD HH:ii:ss )

bit:布尔类型:只能保存0|1,用来表示真和假

四.mysql建表:

use 库名 #先切换到具体的数据库

drop table if exists 库名 #判断存在则删除

create table 表名 #创建表

(

列名 int not null,

列名 varchar(10) null

);

注:

1.每条语句后面使用分号结束

2.列和列之间使用逗号隔开,最后一列无需逗号

3.默认有符号(zerofill),无符号(unsigned)

五.mysql约束

数据类型:省

非空约束:not null

默认值约束:default

检查约束:没有

唯一约束:unique

标识列(自动增长):auto_increment

主键约束:primary key

外键约束:foreign key

1.如何添加约束:建表时数据类型后面直接加约束

Drop table if exists students; –判断存在则删除

create table students

(

SID int not null primary key auto_increment, – 非空 主键 自动增长

Sname varchar(20) null, – 允许空

Ssex varchar(2) not null default ’男’, – 默认’男’

SCard varchar(18) not null unique, – 唯一

SCID int,

foreign key(SCID) references classes(CID) – 单独加外键

);

2.表结构的其他操作

(1)修改表名:

alter table 旧表名 rename 新表名;

表结构操作

(2)增加一列:

alter table 表名 add 字段名 数据类型 [约束];

(3)删除一列:

alter table 表名 drop 字段名;

(4)修改字段名和数据类型:

alter table 表名 change 旧字段名 新字段名 新数据类型;

(5)只修改字段数据类型

alter table 表名 modify 字段名 新数据类型;

复制表

(6) 仅复制结构:

create table 新表名 like 源表;

(7)复制结构和数据:

create table 新表名 select * from 源表;

3.课后拓展:创建表之后,能否再添加或删除约束?

1.非空约束

添加:alter table 表名 modify 列名 数据类型 not null

删除:alter table 表名 modify 列名 数据类型 null

2.主键约束

添加:alter table 表名 add primary key (字段)

删除:alter table 表名 drop primary key

3.唯一约束

添加:alter table 表名 add unique 约束名(字段)

删除:alter table 表名 drop key 约束名

4.自动增长(需要是主键,才能自动增长)

添加:alter table 表名 modify 列名 int primary key auto_increment

删除:alter table 表名 modify 列名 int

5.外键约束

添加:alter table 表名 add constraint 约束名 foreign key(外键列)

references 主键表(主键列)

删除:alter table 表名 drop foreign key 约束名

6.默认值

添加:alter table 表名 alter 列名 set default ‘值’

删除:alter table 表名 alter 列名 drop default

软件测试第三章:软件缺陷

一、缺陷的基本理论

1. 什么是缺陷

软件存在着不符合质量需求或违背软件用户、客户、企业意愿的问题,这就是软件缺陷

2. 缺陷的判断标准

1.软件未达到产品说明书标明的功能;

2.软件出现了产品说明书指明不会出现的错误;

3.软件功能超出产品说明书指明范围;

4.未达到产品说明书虽未指出但应达到的目标;

5.软件测试员认为软件难以理解、不易使用、运行速度缓慢,或者最终用户认为不好。

3. 缺陷的表现形式

A. 用户要求的功能、特性没有实现或部分实现。

B. 运行出错,包括运行中断、系统崩溃、界面混乱等。

C. 数据结果不正确、精度不够、不完整或格式不统一。

D. 文字显示内容不正确或拼写错误。

E. 系统性能低下、系统资源浪费。

4. 缺陷的注意点

a.无效的缺陷

b.重复的缺陷

c.有争议的缺陷

d.无法再现的缺陷

二. 提交缺陷报告

1. 什么是缺陷报告

缺陷报告是对缺陷进行记录、分类和跟踪的文档。

2.缺陷报告的组成

缺陷的标题/缺陷摘要/缺陷概述/缺陷基本信息

预处理

复现步骤

期望结果

实际结果

缺陷的严重程度

缺陷的优先级

测试的软件和硬件环境

测试的软件版本

缺陷的类型

3. 根据缺陷类型分类

功能缺陷

界面缺陷

文档缺陷

代码缺陷

算法错误

性能缺陷

4. 根据缺陷的等级分类

A类 致命缺陷

B 类 严重缺陷

C 类 一般缺陷

D类 较小缺陷

5.根据缺陷的优先级分类

1级:缺陷必须立即解决

2级:缺陷需要正常正常排队等待修复

3级:缺陷可以在方便时被纠正

4级:下一个版本修复

5级:不修复或者列入发布清单

6.根据缺陷的状态分类

submitted/ 已提交: 已提交的缺陷

open/打开:确认提交的缺陷,等待处理

rejected/已拒绝:拒绝提交的缺陷,不需要修复或不是缺陷

resolved/已解决:缺陷被修复

verified/已验证:确认缺陷确实被修正

closed/关闭:确认被修复的缺陷,将其关闭

软件测试第二章:测试入门

测试入门

1.软件产品的特点

  1. 是一种逻辑产品,与物质产品有很大的区别。

  2. 软件产品的生产主要是研制,生产成本主要在开发和研制,开发研制完成后,通过复制就产生了大量软件产品。

  3. 软件产品不会用坏,不存在磨损,消耗。

  4. 生产主要是脑力劳动,还末完全摆脱手工开发方式,大部分产品是”定做”的。

2. 什么是软件工程?

系统化、规范化、可管理、将软件开发变成一项工程。

3.为什么需要软件工程?

软件开发进度难以预测

软件开发成本难以控制

用户对产品功能难以满足

软件产品质量无法保证

软件产品难以维护

软件缺少适当的文档资料

4.软件的开发模型

(1)瀑布模型:瀑布模型是一种线形的、顺序的软件开发模型,主要分为6个阶段:可行性计划研究→需求分析→软件设计→编码→测试→运行维护

(2) V模型:V 模型从左到右,描述了基本的开发过程和测试行为,明确地标明了测试工程中存在的不同级别以及测试阶段和开发过程各阶段的对应关系

(3)快速原型模型: 快速原型模型类似于建造房子,确定客户对房子的需求之后快速地搭建一个房子模型

**(4)迭代模型:**迭代模型又称为增量模型或演化模型,它将一个完整的软件拆分成不同的组件,然后逐个组件地开发测试,整个开发工作被组织为一系列短期、简单的小项目,称为一系列迭代,每一个迭代都需要经过需求分析→软件设计→编码→测试的过程,

**(5 )螺旋模型:**最大的特点是引入了其他模型所忽略的风险分析,如果项目不能排除重大风险,就停止项目从而减小损失。这种模型比较适合开发复杂的大型软件。

有4个象限:制订计划、风险分析、实施工程、客户评估

4.软件开发生命周期

软件和其他产品一样,都有一个从“出生”到“消亡”的过程,这个过程称为软件的生命周期

可将软件生命周期划分为6个阶段:问题定义 需求分析 软件设计

软件开发 软件测试 软件维护 淘汰

5.软件测试定义:

测试是为了让程序能够按照预期运行而建立的一种信心。

测试是为发现错误而执行的一个程序或者系统的过程。

6.什么是软件测试?软件测试是做什么的?

软件测试是使用人工或者自动手段运行或测定某个系统的过程,检验系统是否满足规定的需求,并找出预期结果与实际结果的差异

7.测试的对象:

根据软件的定义,软件包括程序、文档,所以软件测试并不仅仅是程序测试。软件测试贯穿于整个软件生命周期中。

由于在整个软件生命周期中,各阶段有不同的测试对象,形成了不同开发阶段的不同类型的测试。

8.软件测试的目的:

(1)预防缺陷,减少产品的风险

(2)发现被测对象与用户需求之间的差异(俗称找BUG)

(3)通过测试活动发现并解决缺陷,增加人们对被测对象的质量信心

(4)通过测试活动,发现被测对象的质量信息,为决策者提供数据依据

9.软测测试所遵循的原则

  1. 测试应该基于客户的需求
  2. 测试要尽早进行
  3. 穷尽测试是不可能的
  4. 杀虫剂的悖论
  5. 没有缺陷的软件是不存在的

10.软件的质量特点

功能性 可靠性 易用性 可维护

11.那些原因影响软件的质量

需求模糊

开发过程不规范

软件开发人员问题

软件缺乏质量控制管理

12.软件测试的分类

按照测试阶段分

1.单元测试:单元测试是软件开发的第一步测试,目的是为了验证软件单元是否符合软件需求与设计。单元测试大多是开发人员进行的自测。

2.冒烟测试:冒烟测试最初是从电路板测试得来的,当电路板做好以后,首先会加电测试,如果电路板没有冒烟再进行其他测试,否则就必须重新设计后再次测试。

后来这种测试理念被引入到软件测试中。在软件测试中,冒烟测试是指软件构建版本建立后,对系统的基本功能进行简单的测试,这种测试重点验证的是程序的主要功能,而不会对具体功能进行深入测试。

如果测试未通过,需要返回给开发人员进行修正;如果测试通过则再进行其他测试。因此,冒烟测试是对新构建版本软件进行的最基本测试。

3.集成测试:集成测试是冒烟测试之后进行的测试,它是将已经测试过的软件单元组合在一起测试它们之间的接口,用于验证软件是否满足设计需求。

4.系统测试:系统测试是将经过测试的软件在实际环境中运行,并与其他系统的成分(如数据库、硬件和操作人员等)组合在一起进行的测试。

5.验收测试:验收测试主要是对软件产品说明进行验证,逐行逐字地按照说明书的描述对软件产品进行测试,确保其符合客户的各项要求。

按照测试技术分类

1.黑盒测试:

不需要关注被测对象的内部结构,仅从用户需求的角度去考虑,是否满足显性或者隐性的需求

2.白盒测试:

白盒测试又叫透明盒测试,它是指测试人员了解软件程序的逻辑结构、路径与运行过程,在测试时,按照程序的执行路径得出结果。白盒测试就是把软件(程序)当作一个透明的盒子,测试人员清楚地知道从输入到输出的每一步过程,如

按照软件质量分类

功能测试:

功能测试就是测试软件的功能是否满足客户的需求,包括准确性、易用性、适合性、互操作性等。

性能测试:

性能测试就是测试软件的性能是否满足客户的需求,性能测试包括负载测试、压力测试、兼容性测试、可移植性测试和健壮性测试。

按照自动化程度来分类:

1.手工测试:

手工测试是测试人员一条一条地执行代码完成测试工作。手工测试比较耗时费力,而且测试人员如果是在疲惫状态下,则很难保证测试的效果。

2.自动化测试:

自动化测试是借助脚本、自动化测试工具等完成相应的测试工作,它也需要人工的参与,但是它可以将要执行的测试代码或流程写成脚本,执行脚本完成整个测试工作。

按照测试类型分类

① 界面类测试

界面类测试是验证软件界面是否符合客户需求,包括界面布局是否美观、按钮是否齐全等。

② 安全性测试

安全性测试是测试软件在没有授权的内部或外部用户的攻击或恶意破坏时如何进行处理,是否能保证软件与数据的安全。

③ 文档测试

文档测试以需求分析、软件设计、用户手册、安装手册为主,主要验证文档说明与实际软件之间是否存在差异。

其他分类

①α测试

α测试是指对软件最初版本进行测试。软件最初版本一般不对外发布,在上线之前,由开发人员和测试人员或者用户协助进行测试。测试人员记录使用过程中出现的错误与问题整个测试过程是可控的。

 β测试

β测试是指对上线之后的软件版本进行测试,此时软件已上线发布,但发布的版本中可能会存在较轻微的Bug,由用户在使用过程中发现错误与问题并进行记录,然后反馈给开发人员进行修复。

 回归测试

当测试人员发现缺陷以后,会将缺陷提交给开发人员,开发人员对程序进行修改,修改之后,测试人员会对修改后的程序重新进行测试,确认原有的缺陷已经消除并且没有引入新的缺陷,这个重新测试的过程就叫作回归测试。回归测试是软件测试工作中非常重要的一部分,软件开发的各个阶段都会进行多次回归测试。

 随机测试

随机测试是没有测试用例、检查列表、脚本或指令的测试,它主要是根据测试人员的经验对软件进行功能和性能抽查。随机测试是根据测试用例说明书执行测试用例的重要补充手段,是保证测试覆盖完整性的有效方式和过程。

13.软件测试的流程

1.测试需求分析阶段

2.测试计划阶段

3.测试设计阶段

4.测试执行阶段

5.测试评估阶段

14.测试用例包括哪些:

用例编号、用例名称、测试背景、测试数据、操作步骤、预期结果、实际结果、优先级、重要级、编写人、执行人、备注等。

15.缺陷报告:

缺陷编号、缺陷描述、严重度、缺陷状态、发现人、发现时间、修复时间、所属版本、所属模块、修复的优先级、详细描述、下一步处理人等。

16.测试报告

包括项目背景、需求分析、测试时间、测试环境、评审记录、测试范围、测试用例、功能实现清单、缺陷统计、测试统计(包含资源、执行、问题统计)、测试总结是否通过、测试的风险。

© 2021 Hero All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero