测试面试内容

一、自动化的测试流程(具体做了那些任务)

安卓/IOS基于 appium 的测试原理
在这里插入图片描述

1、appium基于WebDriver,在设备中注⼊Bootstrap.jar,通过调用UiAutomator的命令,				                实现App自动化测试。
2、C/S架构,利用平台自带的测试框架完成自动化,本质是一个资源整合平台。
1、弄清这一行代码发生了什么?
webdriver.Remote('http://localhost:4723/wd/hub',desired_caps)

1、客户端代码与appiumserver建立连接-session,并传递caps配置信息。
2、Appiumserver检查配置信息是否符合要求。
3、利用adb工具检查当前连接的移动设备。
4、安装appium-settings与uiautomator2到被测手机(首次运行脚本发生)。
5、手机启动appium-settings作为监听服务,用于和appium-server进行通信。
6、uiautomator2启动被测app (代码指定了底层驱动为UI2)。
Appium在IOS端工作流

1.客户client端是test script,即测试脚本
2.Server是appium在服务端开启的(默认端口是4723),appium server接受client发送的请求,解析请求内容,调用对应的框架响应操作。
3.appium server调用instruments.js启动一个socket server,同时分出一个子进程运行instruments.app,把bootstrap.js注入到设备用于和外界交互。
4.bootstrap.js把执行的结果返回给appium server
5.appium server再把结果返回给appium client。

所以可以看到android与ios区别在于appium 将请求转发到bootstrap.js或者bootstrap.jar.然后由bootstrap 驱动UIAutomation和UiAutomator去devices上完成具体的动作。

二、移动端自动化启动参数

移动端参数

参数android
"udid": self.udid,
"platformName":
"platformVersion": 
"newCommandTimeout":6000,
"automationName": "Appium"
"deviceName": 
"appPackage":
"appActivity":
"noReset": "True"
IOS配置
{
  "xcodeOrgId": "xxxx",
  "xcodeSigningId": "iPhone Developer",
  "udid": "xxxxxx",
  "platformName": "iOS",
  "deviceName": "iphone 7 Plus",
  "bundleId": "xxxxx",
  "AutomationName": "XCUITest",
  "platformVersion": "14.4"
}

docker命令

docker ps 查看当前运行中的容器
docker images 查看镜像列表
docker rm container-id 删除指定 id 的容器
docker stop/start container-id 停止/启动指定 id 的容器
docker rmi image-id 删除指定 id 的镜像
docker volume ls 查看 volume 列表
docker network ls 查看网络列表
----------------------------------------------------------
docker-compose命令:
docker-compose up -d(-d指后台运行,必须是在docker-compose.yml目录下)
docker-compose ps :查看运行状态
docker-compose stop:停止运行
docker-compose restart:重启
docker-compose restart service-name 重启单个服务
docker-compose exec  service-name sh:进入容器命令行
docker-compose logs [service-name]:查看容器运行log

怎样定位下拉框元素

1、可以直接使用xpath定位
2、导包 Select类 --> from selenium.webdriver.support.select import Select
实例化Select类 select=Select(WebElemet)
(WebElement):driver.find_element_by_css_selector(’#nr’)
调用方法:
① select.select_by_index(index)---下标
② select.select_by_value(value)---值
③ select_by_visible_text() ----根据option显示文本来定位

python自动化三大等待

1、强制等待

from selenium import webdriver
import time
chrome = webdriver.Chrome()#浏览器实例化
chrome.get('https://www.baidu.com')#访问百度
time.sleep(5)#在页面等待5秒
chrome.close()#关闭浏览器

2、隐式等待

from selenium import webdriver
chrome = webdriver.Chrome()#浏览器实例化
driver.implicitly_wait(5)#设置等待对象--参数输入最长等待时间-时间单位是s
chrome.get('https://www.baidu.com')#访问百度,百度网页打开完毕后,也就是不转圈后
chrome.find_element_by_id('kw')#去找id为kw的元素,最长时间为5s,找不到会返回异常
chrome.close()#关闭浏览器

3、显示等待

from selenium import webdriver
from selenium.webdriver.support.wait import webdeiverwait#导入显示等待方式
chrome = webdriver.Chrome()#浏览器实例化
chrome.get('https://www.baidu.com')
webdeiverwait(chromer, 10, 0.5).until(chrome.find_element_by_id('kw'))#until里面是等待的元素,每隔0.5s自动找寻一次id为kw的元素,最长找寻时间为10s

#webdeiverwait(chromer, 10, 0.5).until(lamba el: chrome.find_element_by_xpath())#until里面是等待的元素,也可以导入匿名对象

字典、元组、列表

列表:可以添加append()、删除元素del list[index],更新list[2]="**"
元组:元组不可变,但是可以删除和拼接,元组内只有一个元素时,要在第一个元素后加上逗号,删除:del tup。删除只能删除整个元组
字典:key:value,数据间以逗号分隔,可以删除del tinydict['Name'],更新tinydict['Age'] = 8, 添加信息tinydict['School'] = "菜鸟教程" 
总结:
1.元组比列表遍历速度快,因为元组是一个整体,运算效率高;
2.正是因为不能修改,元组可以保护不需要修改的数据,可以使代码结构更安全。

闭包、装饰器、生成器

闭包:在一个函数内嵌套一个内层函数,这个内层函数可以读取外层函数的变量,反之外层函数无法读取内层函数的变量,(python搜索顺序往父对象读取不是往下读取),也就是当内部函数不执行,外层函数的变量也就无法被释放,封闭在内层函数的作用域内,知道函数被执行

def f1():
	n = 999
	def f2():
		print(n)
	return f2

装饰器:当不改变函数代码结构情况下,给函数增加一些额外的功能

def ignore_exception(func):
   @functools.wraps(func)
   def wrapper(*args, **kwargs):
       suc = None
       try:
           suc = func(*args, **kwargs)
       except Exception as e:
           logger.error(e)
           logger.error("an exception happened on %s, but you chose ignore it " % func.__name__)
       return suc
   return wrapper

生成器

1、通常配合yield使用,调用该函数的时候不会立即执行代码,而是返回了一个生成器对象;
2、当使用 next() (在 for 循环中会自动调用 next() ) 作用于返回的生成器对象时,函数 开始执行,在遇到 yield 的时候会『暂停』,并返回当前的迭代值;
3、当再次使用 next() 的时候,函数会从原来『暂停』的地方继续执行,直到遇到 yield语 句,如果没有 yield 语句,则抛出异常**StopIteration**
使用 send() 方法给它发送消息:send() 方法就是 next() 的功能,加上传值给 yield 。
使用 throw() 方法给它发送异常: throw() 就是 next() 的功能,加上传异常给 yield 。
使用 close() 方法关闭生成器:生成器被关闭后,再次调用 next() 方法,不管能否遇到 yield 关键字,都会抛出 StopIteration 异常,

get 和 post 区别

1、get:数据长度不得大于2kb ,post理论上长度不进行限制
2、GET 编码格式只能用ASCII码,POST没有限制
3、GET请求在浏览器刷新或者回退的时候是无害的。POST的话数据会被重新提交。
4、GET 会将数据存在浏览器的历史中,POST不会
5、可见性 参数在URL用户可以看见,POST的参数在REQUSET BODY中不会被用户看见
6、GET 是将数据中的hearder 和 data 一起发送给服务端,返回200code
7、POST 是先将hearder发给服务器返回100continue,再发送data给到服务器,返回200
8、安全性 GET相对不安全 POST相对安全些

http和 https区别

1、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。
2、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
3、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)
4、证书申请不同,http 无需证书、https 需要 ca 证书申请需要收费

monkey命令

adb shell monkey -p 包名 -s 5 throttle 1500 -v -v -v -ptc touch 100 --ignore-timeouts --ignore-crashes --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes 2000 >存储路径
(注意事项:事件后面要加时间百分比)
monkey说明
–throttle 时间间隔

–ignore-crashes 忽略崩溃

–ignore-timeouts 忽略超时

–ignore-security-exceptions 忽略许可错误

–ignore-native-crashes 忽略本地崩溃

–monitor-native-crashes 监控本地崩溃

–pct-touch 触摸、点击

–pct-motion 调整动作事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一个up事件组成)
–pct-trackball 调整轨迹事件的百分比(轨迹事件由一个或几个随机的移动组成,有时还伴随有点击)

–pct-nav 调整“基本”导航事件的百分比(导航事件由来自方向输入设备的up/down/left/right组成)

–pct-majornav 调整“主要”导航事件的百分比(这些导航事件通常引发图形界面中的动作,如:5-way键盘的中间按键、回退按键、菜单按键)

–pct-syskeys 调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)

–pct-appswitch 调整启动Activity的百分比。在随机间隔里,Monkey将执行一个startActivity()调用,作为最大程度覆盖包中全部Activity的一种方法

–pct-flip 调整“键盘翻转”事件的百分比。

–pct-anyevent 调整其它类型事件的百分比。它包罗了所有其它类型的事件,如:按键、其它不常用的设备按钮、等等

linux 命令

常用命令

mkdir 新建文件夹---文件夹
touch 新建文件名---文件
rm 文件---删除文件
rm -rf 文件---删除文件
cp 原文件  新文件---拷贝文件
cp -r 源文件夹 新文件夹----拷贝文件夹
scp -r 本地的目录 root@远程linuxip:/远程linux的文件路径
mv 文件  文件夹----移动文件
cat 文件内容查看
tail -f 文件名----实时滚动显示文件的最后10行信息(默认10行)
tail -n 20 文件名---显示文件的最后20行信息
语法:
	find 搜索路径 -name "文件名关键词"
例子:
	find / -name "passwd"
grep "ERRO"
ps -ef | grep 进程id
ps aux---查看所有进程
文件的每个归属方的权限的值使用rwx之和计算出来的。
语法
	`chmod [-R] nnn 文件` 
	-R 递归设置文件夹内所有文件
	
压缩语法:tar -zcvf 压缩后文件名 被压缩文件
解压缩语法 tar -zxvf 压缩文件名 -C 解压后文件所在目录

开启防火墙
systemctl start 服务名
关闭防火墙(服务器重启后还会自动开启防火墙)
systemctl stop firewalld
查看防火墙状态
systemctl status firewalld 
vim---编辑
查看ip 地址
ip a、ip addr
查看网卡对应的 IP 地址
 ifconfig | grep inet

python中的深浅拷贝

浅拷贝:python中的拷贝一般都是浅拷贝,拷贝时,拷贝对象的子对象不会拷贝,因此源对象和拷贝对象会引用一个子对象(copy) – copy.copy(源对象)
深拷贝(copy模块中的deepcopy):递归拷贝对象中的子对象,拷贝完的子对象和原来对象中的子对象也不相同,也就是所有的拷贝都是新的

json中:dumps、dump、loads、load

在这里插入图片描述

TCP/IP

三次握手,四次挥手

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,进入SYN_SEND状态,等待服务器确认;
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器 进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入 ESTABLISHED状态,完成三次握手。
通过这样的三次握手,客户端与服务端建立起可靠的双工的连接,开始传送数据。
三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的
在这里插入图片描述
是为了防止已失效的连接请求报文段突然又传到了服务器端

如何进行多设备运行

多进程/分布式

2、JMeter组件以及基本使用

录制脚本:

  1. 第一步:添加http代理服务器,在测试计划–》添加–》非测试元件–》http代理服务器
    在这里插入图片描述

  2. 第二步:添加线程组(这个线程组是用来放录制的脚本,不添加也可以,就直接放在代理服务器下)测试计划–》添加–》线程–》线程组(顺便讲一下线程组执行顺序:setUp --线程组 --tearDown)
    在这里插入图片描述

  3. 第三步:选择录制脚本的存放位置,就选择我们第二步创建的线程组中。
    在这里插入图片描述

  4. 第四步:然后我们点击启动,其他项默认就好,其他选项后期会详细说明

  5. 第五步:设置浏览器的代理,设置-网络设置 -选择手动配置代理,点击确定

  6. 第七步:脚本录制中填写脚本名称,浏览器中输入录制的网址,就可以开始录制了。

3、压力测试

4、接口测试流程以及细节

5、环境部署(linux/docker)

6、fiddler应用场景

1、Fiddler是位于客户端和服务器端的HTTP代理,也是目前最常用的http抓包工具之一 。

7、MySQL

内连接、外链接(左右外连接)
内连接:取两表交集
左连接(先查左边表所有数据,然后按on条件拼接)
右连接(先查右边表所有数据,然后按on条件拼接)
约束:
主键约束(primary key) PK
自增长约束(auto_increment)
非空约束(not null)
唯一性约束(unique)
默认约束(default)
零填充约束(zerofill)
外键约束(foreign key) FK

常用命令:

数据库操作命令:
show database;--查询当前服务器数据库命令
create database; 数据库名称--创建一个新的数据库
use 数据库名称;--使用/切换数据库
drop database 数据库名称;--删除数据库
select database;--查询当前数据库

数据库表中操作命令:
show tables;
desc 表名称;查询当前表结构
show create table 表名称;--查询表详细结构
drop table if exists 表名称;

修改表结构:
alert table 表名 add column 列名 列类型 comment ‘备注’;--给表添加字段
alert table 表名 drop column 列名;--删除指定表的字段
alert table 表名 change 原字段名 新字段名 字段类型;--修改指定表的字段
alert table 旧表名 rename 新表名;

数据库操作命令:
insert into 表名 values(数据1,数据2,……);--全列添加数据
insert into 表名 (字段1,字段2,……) values(数据1,数据2,……);--给指定字段添加数据查询
insert into  表名 values(数据1,数据2,……),(数据1,数据2,……),(数据1,数据2,……)

数据库查询操作命令:
select * from 表名;全列查询
select 字段名1,字段名2 from 表名;--查询指定字段
select 表达式 from 表名;--表达式查询
表达式:字段+10或者(烈名-5*)3
select 字段名 as 别名 from 表名;--给查询字段取别名,方便查询
去重查询--distinct
select distinct 字段1,字段2,…… from 表名;--意思字段1,字段2全列的所有重复值去除,只保留一个唯一值

order by 排序查询:(asc升序,desc降序)--默认升序
select * from table order by 字段1,字段2 desc;
或者
select * from table order by 字段1,字段2 asc;

MySQL常见面试题:
删除语句:

delete ---基础用法:delete from table(表名)。这个用于删除有明确定义的数据或者整个表的数据,比如:id是唯一不可重复的,delete from Student where id=5,即把id=5的唯一的一条数据删除。只是删除数据,不删除表的结构,假删除通过rollback可以找回

drop ---drop table +表名称、drop database +数据库名称,删除表内容和表结构

truncate --truncate table TABLE_NAME;立即生效无法挽回
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值