软件测试常问问题及回答

一、自我介绍

因人而异,介绍清楚个人的工作经历,项目负责情况及个人爱好等等。

二、软件的生命周期

定义:软件从产生到报废的生命周期。

生命周期包括:问题的定义及规划(开发方与需求方讨论)、需求分析、软件设计、软件编码、软件测试(单元测试、集成测试、系统测试、验收测试)、运营维护阶段。(行业性概念)

三、测试流程

首先做需求评审,参与到项目的需求评审,在项目的需求评审阶段提出问题,进行整改,整改完成后进行复评审。复评审之后定稿,结合项目的计划,结合实现内容,制定完成测试计划,并定义测试的工作内容,制定完成后,根据需求稿进行测试用例的编写,测试用例编写完成后进行三方会审,通过三方会审来评估用例覆盖率是否全面。开发提测时进行冒烟测试,冒烟测试通过后,根据所写的用例进行进行系统测试,包括但不限于回归测试、bug验收测试、场景测试。最后输出测试报告。

四、接口用例设计

  1. 是否满足前提条件

    有些接口需要满足前置条件,才可成功获取数据。常见的,需要登陆Token。

    逆向用例:针对是否满足前置条件(假设为n个条件),设计0n条用例

  2. 是否携带默认值参数

    正向用例:带默认值的参数都不填写、不传参,必填参数都填写正确且存在的“常规”值,其它不填写,设计1条用例;

  3. 业务规则、功能需求

    这里根据实际情况,结合接口参数说明,可能需要设计n条正向用例和逆向用例

  4. 参数是否必填

    逆向用例:针对每个必填参数,都设计1条参数值为空的逆向用例

  5. 参数之间是否存在关联

    有些参数彼此之间存在相互制约的关系

    逆向用例:根据实际情况,可能需要设计0n条用例

  6. 参数数据类型限制

    逆向用例:针对每个参数都设计1条参数值类型不符的逆向用例

  7. 参数数据类型自身的数据范围值限制

    正向用例:

    针对所有参数,设计1条每个参数的参数值在数据范围内为最大值的正向用例

    逆向用例:

    针对每个参数(假设n个),设计n条每个参数的参数值都超出数据范围最大值的逆向用例

    针对每个参数(假设n个),设计n条每个参数的参数值都小于数据范围最小值的逆向用例

    以上几个方面考虑全的话,基本可以做到如下几个方面的覆盖:

    主流程测试用例:正常的主流程功能校验;

    分支流测试用例:正常的分支流功能校验。

    异常流测试用例:异常容错校验

8.接口怎么测

1、先考虑接口的正常调用 按照接口的定义,传递正确的接口信息,包括地址,方法,参数,然后再看返回的数据是否是正确的,数据库数据是不是正确的 传递的请求数据需要覆盖有效类,边界值 返回的响应结果都需要检查,比如code,msg,staus等信息 验证数据存储,例如增删改查业务中对数据库的验证 2、考虑请求参数的错误,异常情况 请求的数据输入的异常值,例如,空值,长度类型异常等等,接口能否正确处理,并且返回的结果能否正确处理 考虑业务的约束 输入错误的参数名,多一个或者少一个 3、关注接口的安全性测试 铭感数据,密码是否加密传输 返回的数据是否含有敏感信息 接口是否对传输的数据进行敏感信息较验 4、关注接口的性能测试 并发请求相同的接口,去查看接口的请求情况 接口的响应时间,是否在用户可接受范围内 对接口进行压力测试,确定最大瓶颈点

五、bug生命周期

  • New ( 新建 )→ In Progress ( 正在修复 )→ Fixed ( 已修复 )→ Closed ( 关闭 )

    | 验收不通过

    Reopen( 重启 )→ In Progress ( 再修复 )→ Fixed ( 已修复 )→ Closed ( 关闭 )

  • Cannot Reproduce : 无法复现 - Pass : 无法修复/无需求 - Delay : 延期

    ————————————————————————Bug严重级别———————————————————————————————

    P0:Block - 无法进行测试,产品不能使用,如 crash

    P1:Critical - 重要功能未实现,能勉强使用,但功能严重受限

    P2:Major - 主要功能未完全实现,影响部分流程的进行,不影响主流程

    P3:Normal - 一般的问题,影响面较小

    P4:Minor - 细微的问题,一般是优化、建议

六、持续集成

1.统一的代码库

2.自动构建

3.自动测试

4.每个人每天都要向代码库主干提交代码

5.每次代码递交后都会在持续集成服务器上触发一次构建

6.保证快速构建

7.模拟生产环境的自动测试

8.每个人都可以很容易的获取最新可执行的应用程序

9.每个人都清楚正在发生的状况

10.自动化的部署

七、制定测试计划

测试计划包含了测试目标、测试范围、测试环境、测试类型的说明、测试工具,模版划分、相关的测试负责人,测试次数、时间安排、测试相关的风险等等,模块划分主要根据测试人员的熟悉程度来划分,工作量的评估,需要根据以往的测试经验再结合这个项目来进行评估

八、性能测试流程

1、性能需求分析,定义完整的性能指标,同步设计性能场景

2、搭建性能测试环境

3、基于场景实现测试脚本

4、基于性能测试准备测试数据

5、执行测试并采集数据

6、性能诊断与分析

7、性能调优(谁有问题找谁),回归到5-6步骤

8、输出报告

先查看本地资源是否不足导致,或者是场景设计导致,如果都没问题,是否是因为网络传输的问题导致排队,服务器是否有mq消息队列,如果有的话就不会是带宽的问题。

计算方式:

QPS(TPS)= 并发数/平均响应时间    或者   并发数 = QPS平均响应时间 内存计算公式Memtotal - Memfree - cached - buffers)/Memtotal   100即( =(B2-F2-K2-N2)/B2*100)

打开jmeter:cd /Users/dingyu/Documents/apache-jmeter-5.4.2/bin

九、Linux常用指令

```Plain Text

  • alt+ctrl 退出操作linux,可以操作windows
  • 切换目录命令:
  • pwd 查看当前目录
  • cd 文件夹 进入某个文件夹
  • cd .. 退到上一级
  • cd - 退到上次操作的目录
  • cd / 推到根目录
  • 显示文件列表
  • ls 列出当前目录下的所有信息
  • ls -a 显示所有文件,包括隐藏文件
  • ls -l 显示文件详细信息
  • ll 对ls -l的简称
  • clear 清空内容
  • 目录操作
  • mkdir aa bb文件夹名称 创建目录
  • rmdir aa (remove directory) 移除目录 可以移除多个
  • 浏览文件
  • 进入 cd /etc
  • cat 文件名称 打开文件,查看所有内容
  • more 查看内容,可以分页查看
  • 结合enter键,一点点看
  • 如果按空格键,分页查看
  • q 退出查看
  • less 查看内容
  • enter +向下箭头,一点点查看
  • q 退出查看
  • tail 可以选择查看哪些内容
  • tail -10 profile 查看后10行
  • 结束 ctrl+c
  • 文件操作
  • touch xx.txt 创建xx.txt文件
  • rm xx.txt 删除文件 需要询问,如果确定删除y 取消 n
  • rm -f xx.txt 删除文件,不询问
  • rm -r aa 递归移除,并询问
  • rm -rf aa 递归移除,不询问
  • cp aa.txt bb.txt 复制
  • 可以指定复制的目录 比如 cp aa.txt /usr/local/bb.txt
  • mv aa.txt cc.txt 剪切
  • * 可以指定剪切的目录 比如 mv aa.txt /usr/local/dd.txt
  • 压缩和解压
  • tar命令位于/bin目录下,它能够将用户所指定的文件或目录打包成一个文件,但不做压缩,一般Linux上常用的压缩方式是选用tar将许多文件打包成一个文件,再以gzip压缩命令压缩成xxx.tar.gz(或称为xxx.tgz)的文件。
  • tar -c 指定压缩成一个文件 -v 显示过程信息 -f 指定文件名称 tar -cvf xxx.tar ./* -z 指定使用gzip方式进行压缩 tar -zcvf iii.tar.gz ./* -x 解开tar文件 普通解压 tar -xvd uuu.tar.gz 解压指定路径 tar -xvf uuu.tar.gz -C /usr/local
  • vi和vim编辑文本
  • vim是vi的升级版. vi既可以查看文件也可以编辑文件。 三种模式:命令行、插入、底行模式。 切换到命令行模式:按Esc键; 切换到插入模式:按 i 、o、a键; i 在当前位置前插入 I 在当前行首插入 a 在当前位置后插入 A 在当前行尾插入 o 在当前行之后插入一行 O 在当前行之前插入一行 退出编辑:esc(退出键)
    退出并保存: :wq(shift+:) 退出不保存: :q! 快捷键:在非编辑状态下 dd 删除一行 / 搜索的快捷键
  • 重定向输出 ifconfig 查看ip

重定向输出,覆盖原有内容;

重定向输出,又追加功能; 示例: cat b.txt > a.txt 将输出定向到a.txt中 cat c.txt >> a.txt 输出并且追加 ifconfig > ifconfig.txt ifconfig >> ifconfig.txt

  • grep 搜索指令 grep hello aaa.txt 普通搜索 grep hello aaa.txt --color 高亮搜索
  • ps -ef 查看当前进程
  • 管道符号 | 管道是Linux命令中重要的一个概念,其作用是将一个命令的输出用作另一个命令的输入。 cat hello.txt |more ps -ef|grep bash ls --help | more 分页查询帮助信息 ps -ef |grep 2251 搜索进程号 ifconfig | more cat index.html | more
  • &&命令执行控制: 命令之间使用 && 连接,实现逻辑与的功能。 只有在 && 左边的命令返回真(命令返回值 $? == 0),&& 右边的命令才会被执行。 mkdir haha && cd haha
  • 网络通讯命令 ifconfig 查看ip信息 ping 查看服务器是否ping的通 netstat 查看网络端口 netstat -an|grep 3306 搜索mysql端口 查看bash进程的端口 第一步:找到bash进程的进程号 pid=ps -ef|grep bash
    第二步:根据进程号去找端口 netstat -an|grep pid

Linux第二天笔记

系统指令

  • date 查看日期
  • date -s "1991-11-11 11:11:11" 设置日期
  • kill 进程号 杀死进程
  • kill -9 进程号 强制杀死进程
  • du 查看当前文件大小
  • du -h 优化查看
  • who 显示当前登录系统的用户名
  • whoa I'mmi 显示当前用户
  • hostname 显示当前的主机名称
  • vim /etc/sysconf/network 修改主机名称
  • uname 显示系统信息 文件显示
  • tail 显示尾部信息
  • tail -10 install.log 显示文件后10行
  • tail -c 10 install.log 显示后10个字符
  • head
  • head -10 install.log 显示文件的前10行
  • head -c 10 install.log 显示文件的前10个字母 系统监测
  • free 内存
  • -b:以Byte为单位显示内存使用情况; -k:以KB为单位显示内存使用情况; -m:以MB为单位显示内存使用情况; -s:持续观察内存使用状况; free -b free -k free -m free -s 10 free -s -m 10 每隔10秒显示内存信息,以m单位计算 total 总内存大小 free 剩余 used 已使用大小 (要求小于%70)
  • uptime 内存和cpu uptime uptime命令能够打印系统总共运行了多长时间和系统的平均负载。uptime命令可以显示的信息显示依次为:现在时间、系统已经运行了多长时间、目前有多少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载。 15:31:30 //系统当前时间 up 127 days, 3:00 //主机已运行时间,时间越大,说明你的机器越稳定。 1 user //用户连接数,是总连接数而不是用户数 load average: 0.00, 0.00, 0.00 // 系统平均负载,统计最近1,5,15分钟的系统平均负载 系统平均负载是指在特定时间间隔内运行队列中的平均进程数。 如果每个CPU内核的当前活动进程数不大于3的话,那么系统的性能是良好的。如果每个CPU内核的任务数大于5,那么这台机器的性能有严重问题。
  • top 进程 可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 可以分析应用占用的cpu和memory大小
  • mpstat 查看cpu详细信息 mpstat mpstat是MultiProcessor Statistics的缩写,是实时系统监控工具。其报告与CPU的一些统计信息 其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。
  • df命令 显示磁盘空间 df命令用于显示磁盘分区上的可使用的磁盘空间。默认显示单位为KB。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。 系统重启和关机指令
  • shutdown 关机
  • reboot 重启
  • halt 关机指令
  • Linux权限命令 Permission denied 常用 777 755 chmod 755 a.txt chmod u=rwx,g=rx,o=rx a.txt chmod 000 a.txt
  • 防火墙
  • 临时关闭防火墙 service iptables stop
  • 临时开启防火墙 service iptables start
  • 查看防火墙状态 service iptables status
  • 永久关闭防火墙 chkconfig iptables off
  • 永久打开防火墙 chkconfig iptables on
  • 用哪个开哪个? 更改系统文件 vi /etc/sysconfig/iptables 复制一行 指定开放端口
  • 重启防火墙 service iptables restart

十、自动化测试request函数

getMethod() 获得请求方式
getHeader()获取请求头信息
getRequestURI() 获得请求资源
getParameter()获得参数的值

十一、python常用函数

```Plain Text
staticmethod() 函数返回函数的静态方法。该方法不强制要求传递参数
print()函数:打印字符串;
raw_input()函数:从用户键盘捕获字符;
len()函数:计算字符长度;
format()函数:实现格式化输出;
type()函数:查询对象的类型;
int()函数、float()函数、str()函数等:类型的转化函数;
id()函数:获取对象的内存地址;
help()函数:Python的帮助函数;
s.islower()函数:判断字符小写;
s.sppace()函数:判断是否为空格;
str.replace()函数:替换字符;
import()函数:引进库;
math.sin()函数:sin()函数;
math.pow()函数:计算次方函数;
os.getcwd()函数:获取当前工作目录;
listdir()函数:显示当前目录下的文件;
time.sleep()函数:停止一段时间;
random.randint()函数:产生随机数;
range()函数:返回一个列表,打印从1到100;
file.read()函数:读取文件返回字符串;
file.readlines()函数:读取文件返回列表;
file.readline()函数:读取一行文件并返回字符串;
split()函数:用什么来间隔字符串;
isalnum()函数:判断是否为有效数字或字符;
isalpha()函数:判断是否全为字符;
isdigit()函数:判断是否全为数字;
lower()函数:将数据改成小写;
upper()函数:将数据改成大写;
startswith(s)函数:判断字符串是否以s开始的;
endwith(s)函数:判断字符串是否以s结尾的;
file.write()函数:写入函数;
file.writeline()函数:写入文件;
abs()函数:得到某数的绝对值;
file.sort()函数:对书数据排序;
tuple()函数:创建一个元组;
find()函数:查找 返回的是索引;
dict()函数:创建字典;
clear()函数:清楚字典中的所有项;
copy()函数:复制一个字典,会修改所有的字典;
get()函数:查询字典中的元素。
```


十二、自动化测试testNG注解的使用

@BeforeSuite	在该套件的所有测试都运行在注释的方法之前,仅运行一次
@AfterSuite	在该套件的所有测试都运行在注释方法之后,仅运行一次
@BeforeClass	在调用当前类的第一个测试方法之前运行,注释方法仅运行一次
@AfterClass	在调用当前类的第一个测试方法之后运行,注释方法仅运行一次
@BeforeTest	注释的方法将在属于test标签内的类的所有测试方法运行之前运行
@AfterTest	注释的方法将在属于test标签内的类的所有测试方法运行之后运行
@BeforeGroups	配置方法将在之前运行组列表。 此方法保证在调用属于这些组中的任何一个的第一个测试方法之前不久运行
@AfterGroups	此配置方法将在之后运行组列表。该方法保证在调用属于任何这些组的最后一个测试方法之后不久运行
@BeforeMethod	注释方法将在每个测试方法之前运行
@AfterMethod	注释方法将在每个测试方法之后运行
@DataProvider	标记一种方法来提供测试方法的数据。 注释方法必须返回一个Object [] [],其中每个Object []可以被分配给测试方法的参数列表。 要从该DataProvider接收数据的@Test方法需要使用与此注释名称相等的dataProvider名称
@Factory	将一个方法标记为工厂,返回TestNG将被用作测试类的对象。 该方法必须返回Object []
@Listeners	定义测试类上的侦听器
@Parameters	描述如何将参数传递给@Test方法
@Test	将类或方法标记为测试的一部分,此标记若放在类上,则该类所有公共方法都将被作为测试方法
@Test(priority = 0) 可进行循环控制,数字越小执行顺序越高
Suite > Test > Class > Groups > Method

十三、HTTPS和HTTP的区别:

1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。 2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。 3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。 4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

十四、tcp三次握手

第一次握手,由浏览器发起,告诉服务器我要发送请求了 第二次握手,由服务器发起,告诉浏览器我准备接受了,你赶紧发送吧 第三次握手,由浏览器发送,告诉服务器,我马上就发了,准备接受吧

十五、tcp与Udp的区别

1、udp安全性高于tcp,udp的漏洞少 2、udp传输性比tcp块 3、udp属于一对多的连接或多对多的连接,tcp属于一对一连接

十六、cookie和session的区别

1,session 在服务器端,cookie 在客户端(浏览器) 2,session 默认被存在在服务器的一个文件里(不是内存) 3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id) 4,session 可以放在 文件、数据库、或内存中都可以。 5,用户验证这种场合一般会用 session

十七、POST和GET的区别

  1. get是从服务器上获取数据,post是向服务器传送数据。

  2. GET请求把参数包含在URL中,将请求信息放在URL后面,POST请求通过request body传递参数,将请求信息放置在报文体中。

  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。

  4. get安全性非常低,get设计成传输数据,一般都在地址栏里面可以看到,post安全性较高,post传递数据比较隐私,所以在地址栏看不到, 如果没有加密,他们安全级别都是一样的,随便一个监听器都可以把所有的数据监听到。

  5. GET请求能够被缓存,GET请求会保存在浏览器的浏览记录中,以GET请求的URL能够保存为浏览器书签,post请求不具有这些功能。

  6. HTTP的底层是TCP/IP,GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。 7.GET产生一个TCP数据包,对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);POST产生两个TCP数据包,对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据),并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次

十八、状态码

1.表示临时响应并需要请求者继续执行操作: 100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的 第一部分,正在等待其余部分。 101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2.表示成功处理了请求的状态代码: 200 (请求成功),服务器已成功处理了请求。 通常,这表示服务器提供了请求的网 页。 201 (已创建) 请求成功并且服务器创建了新的资源。 202 (已接受) 服务器已接受请求,但尚未处理。 203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。 204 (无内容) 服务器成功处理了请求,但没有返回任何内容。 205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。 206 (部分内容) 服务器成功处理了部分 GET 请求。

3.表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向: 300 (多种选择) 针对请求,服务器可执行多种操作。 301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。** 302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用 原有位置来进行以后的请求。 303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响 应时,服务器返回此代码。 304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时, 不会返回网页内容。 305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响 应,还表示请求者应使用代理。 307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使 用原有位置来进行以后的请求。

4.这些状态代码表示请求可能出错,妨碍了服务器的处理: 400 (错误请求) 服务器不理解请求的语法。 401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此 响应。 403 (禁止) 服务器拒绝请求。 404 (未找到) 服务器找不到请求的网页。** 405 (方法禁用) 禁用请求中指定的方法。 406 (不接受) 无法使用请求的内容特性响应请求的网页。 407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授 权使用代理。 408 (请求超时) 服务器等候请求时发生超时。 409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲 突的信息。 410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。 411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 412 (未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。 413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的 处理能力。 414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 415 (不支持的媒体类型) 请求的格式不受请求页面的支持。 416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此 状态代码。 417 (未满足期望值) 服务器未满足”期望”请求标头字段的要求。

5.一般是服务器问题: 500 (服务器内部错误) 服务器遇到错误,无法完成请求。** 501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求 方法时可能会返回此代码。 502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这 只是暂时状态。 504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。 505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

十九、数据库知识

#插入数据
insert into test (id,email,ip,state) values(2,'[email protected]','127.0.0.1','0');
#删除数据 
delete from test where id = 1;
#修改数据
update test set id='1',email='[email protected]' where id=1;
#查数据
select * from test;  #取所有数据
select * from test limit 0,2;  #取前两条数据 
select * from test email like '%qq%' #查含有qq字符 _表示一个 %表示多个
select * from test order by id asc;#降序desc
select * from test id not in('2','3');#id不含2,3或者去掉not表示含有
select * from test timer between 1 and 10;#数据在1,10之间

#---------------------------表连接知识------------------------------
#等值连接又叫内链接 inner join 只返回两个表中连接字段相等的行
select * from A inner join B on A.id = B.id; #写法1
select * from A,B where A.id = B.id; #写法2
select a.id,a.title from A a inner join B b on a.id=b.id and a.id=1;#写法3 表的临时名称
select a.id as ID,a.title as 标题 from A inner join B on A.id=B.id;#添加as字句

#左连接又叫外连接 left join 返回左表中所有记录和右表中连接字段相等的记录
select * from A left join B on A.id = B.id;

select * from A left join (B,C,D) on (B.i1=A.i1 and C.i2=A.i2 and D.i3 = A.i3);#复杂连接

#右连接又叫外连接 right join 返回右表中所有记录和左表中连接字段相等的记录
select * from A right join B on A.id = B.id;

#完整外部链接 full join 返回左右表中所有数据
select * from A full join B on A.id = B.id;

#交叉连接 没有where字句 返回卡迪尔积
select * from A cross join B;


CREATE TABLE 语句用于创建数据库中的表。
.查询数据库中所有表名称:

  select table_name from information_schema.tables where table_schema='数据库名称';(包含视图)

  select table_name from information_schema.tables where table_schema='数据库名称' and table_type = 'BASE TABLE' AND table_schema = DATABASE ();(不包含视图)

2.查询每张表中所有字段名:

  select COLUMN_NAME from INFORMATION_SCHEMA.Columns where table_name='表名称' and table_schema='数据库名称';

oracle:

1.查询数据库中所有表名称:

  select t.table_name from user_tables t;

2.查询每张表中所有字段名:

  SELECT COLUMN_NAME FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '表名称';

二十、登录接口测试点

正常: 全部必填 异常: 数据异常: 手机号/密码: 长度异常,长度大于11位,长度小于11位 类型异常:非数据(字符,字母,汉字) 是否是必填 是否重复 参数异常: 多参数,少参数,无参数,错误参数 业务异常,操作成功!用户名或密码错误

二十一、Python中列表与元组的区别,列表与字典的区别

1、列表可以修改,元祖不可以修改,列表相当于一个动态数组,而元组是一个静态数组; 2、列表是用中括号声名,元组是用小括号声明,并且元组只有一个元素的时候需要在后面加;号; 3、字典的话,生成的慢,但是查找快,列表生成的块,查找慢; 4、列表是有序的,字典是无序的; 5、列表通过索引访问,字典使用key访问;

二十二、已登录为例,说一下po设计模式的过程

1、第一步先实现basepage基类型,主要实现了drive的获取,通过drive可以进行兼容性的测试 2、实现对象层,封装登录页面的元素定位,比如输入框,确定按钮的元素的定位方法; 3、根据封装定位的方法来进行相关的操作,比如输入用户名,输入密码,点击确认按钮; 4、根据封装的页面和操作类,实现对应的自动化测试; 什么是po设计模式: pageobject,为例减少代码重复,让代码的可读性更强,也更容易去维护。 主要包括三层,对象层(主要封装某些元素定位的方法),操作层(封装元素的一些特定操作),业务层(把一个或者多个操作组合成具体的业务,实现具体的功能测试)

二十三、pytest与unittest区别

||unittest|pytest| |-|-|-| |用例编写方法|1)测试文件必须导入unittest包 2)测试类必须继承unittest.TestCase 3)测试类必须要有unittest.main()方法 4)测试方法必须要以test_ 打头|1)测试文件名要以test打头,或者test结尾 2)测试类名字要以Test打头 3)测试方法名字test_ 打头| |用例分类执行|默认执行全部用例, 也可以通过加载testsuit,执行部分用例|通过@pytest.mark方法来标记类和方法, pytest main加入参数-m 来只执行标记的类和方法| |用例的前置和后置|提供了setUp/tearDown,只能针对所有用例|pytest中的fixture显然更加灵活。可以任意自定义方法函数,只要加上@pytest.fixture()这个装饰器,那么被装饰的方法就可以被使用| |参数化|参数化|使用@pytest.mark.parametrize装饰器| |断言格式|断言很多断言格式(assertEqual、assertIn、assertTrue、assertFalse)|只有assert一个表达式,用起来比较方便| |生成测试报告|使用HTMLTestRunner|pytest-HTML、allure插件| |失败重跑|无|pytest-rerunfailures插件可支持失败重跑|

总体来说,unittest用例格式复杂,兼容性无,插件少,二次开发方便。pytest更加方便快捷,用例格式简单,可以执行unittest风格的测试用例,无须修改unittest用例的任何代码,有较好的兼容性。pytest插件丰富,比如flask插件,可用于用例出错重跑,还有xdist插件,可用于设备并行执行,效率更高。

二十四、po设计模式

Python中列表与元组的区别,列表与字典的区别: 1、列表可以修改,元祖不可以修改,列表相当于一个动态数组,而元组是一个静态数组; 2、列表是用中括号声名,元组是用小括号声明,并且元组只有一个元素的时候需要在后面加;号; 3、字典的话,生成的慢,但是查找快,列表生成的块,查找慢; 4、列表是有序的,字典是无序的; 5、列表通过索引访问,字典使用key访问;

已登录为例,说一下po设计模式的过程 1、第一步先实现basepage基类型,主要实现了drive的获取,通过drive可以进行兼容性的测试 2、实现对象层,封装登录页面的元素定位,比如输入框,确定按钮的元素的定位方法; 3、根据封装定位的方法来进行相关的操作,比如输入用户名,输入密码,点击确认按钮; 4、根据封装的页面和操作类,实现对应的自动化测试; 什么是po设计模式: pageobject,为例减少代码重复,让代码的可读性更强,也更容易去维护。 主要包括三层,对象层(主要封装某些元素定位的方法),操作层(封装元素的一些特定操作),业务层(把一个或者多个操作组合成具体的业务,实现具体的功能测试)

二十五、系统测试包括以下方面

  • 软件的外观界面测试(简称 UI 测试):主要测试软件界面功能模块的布局是否合理,整体风格是否一致,界面文字是否正确,命名是否统一,页面是否美观,文字、颜色、图片组合是否完美等。测试难度:相对简单。

  • 软件的功能测试:主要是测试软件所呈现给用户的所有功能点是否都能正常使用和操作,是否满足需求文档里的要求。测试难度:中等。

  • 软件的性能测试:测试软件在不同环境和压力下是否能正常运转,其中有一个很重要的指标就是系统响应时间,例如多人同时访问某个网页时,网页是否能在规定的时间内打开等。测试难度:较高。

  • 软件的安全性测试:测试该软件防止非法侵入的能力。测试难度:较高。

  • 软件的易用性测试:测试软件是否容易操作,主观性比较强,站在用户的角度体验软件产品好不好用。测试难度:相对简单。

  • 软件的兼容性测试:测试该软件与其他软件的兼容能力,作为初级软件测试人员,主要考虑软件与浏览器的兼容能力,包括分辨率的兼容。测试难度:相对简单。

猜你喜欢

转载自blog.csdn.net/DY_CSDN/article/details/130016848