# Tester_python
**Repository Path**: leith14/tester_python
## Basic Information
- **Project Name**: Tester_python
- **Description**: homework for excercises
- **Primary Language**: Python
- **License**: GPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-05-12
- **Last Updated**: 2021-06-29
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 学习笔记
# 1. Python基础知识
## 环境管理
## 基本数据类型与操作
变量(数字不能开头,大小写敏感),

## 控制流语法
### 分支结构
### 循环结构
## 函数
### 默认参数

### 关键字参数

###
lambda
## 常用数据结构
### list
#### 常用函数

#### 列表推导式

### tuple

#### 元组不可变特性

#### 常用函数

### set

#### 推导式

### dictionary
#### 定义

#### 常用函数

## 装饰器,迭代器
## 魔法方法
### if __name__ == '__main__' 如何正确理解?
https://www.zhihu.com/question/49136398
https://zhuanlan.zhihu.com/p/344951719
## 模块
### 项目目录结构

sys.path可以查看搜索路径
### 文件引用
## 输入与输出
### 字面量打印与格式化


#### format
#### 格式化f“{}”

### 文件读取
#### 操作步骤


### JSON格式转换


## 错误与异常
### 语法错误与定位
#### 错误
##### 语法错误
SyntaxError
##### 逻辑错误(就是要找的bug)
##### 系统错误
OOM
#### 异常
程序执行过程中,出现的未知错误,逻辑和语法都正常,但是业务逻辑不完善,引起的bug
#### 异常与错误的区别
### 异常捕获、异常处理
IndexError:list index out of range
KeyError, ValueError,
raise 关键字抛出异常
### 自定义异常
## 程序调试


Debug模式:步过,步出,步入。压栈
## 面向对象编程

类变量需要类来访问,实列变量需要实例来改变
类方法不能访问实例放法,需要加装饰器,@classmethod
## 面向对象三大特性
### 封装
重复代码抽取成一个方法。
### 继承
重写方法
### 多态
重写方法就是多态的体现
## 标准库
### OS
### Time
### urllib,推荐使用Requests
### math
## 多线程处理
进程和线程





同步原语:锁,信号量
## 第三方库
### 常用第三方库总结一下
## pip 依赖管理与虚拟环境
## python unittest 测试框架
# 2. Pytest测试框架
## 常用参数
> Note
>
> The `-q/--quiet` flag keeps the output brief in this and following examples.
>
> $ pytest -q test_sysexit.py
pytest --markers 查看所有markers
- [ ] 还可以自定义marker,后续自己研究一下
## pytest markers
skip,usefixture, parametrize
https://docs.pytest.org/en/stable/mark.html#mark
## pytest fixtures: explicit, modular, scalable
里面有段对测试的解释,说的很好,之后编写测试用例要严格按照这四个步骤来执行:
1. **Arrange**
2. **Act**
3. **Assert**
4. **Cleanup**
fixtrue的传递,cached,可以同时使用多个fixtures,fixtures scope(session具体的生命周期?),autouser=true,yield 使用,safe teardown(每一步,每个状态拆开写fixture,**atomic operations**,)conftest.py作用范围是自己及subpackage的有所tests,
https://docs.pytest.org/en/stable/fixture.html#fixture
## Allure
https://docs.qameta.io/allure/#_pytest
# 3. Linux基础知识
## 系统与 Shell 环境准备

### shell
## 进程与线程
## 常用命令之文件处理
### 接连服务器
### 文件
#### 查看帮助
“命令” --help,man “命令”
#### 文件管理

tar -zcvf [压缩包名字] 【要压缩的文件】
#### 文本处理
gg到文件开头,G到文件结尾
#### 文件属性
#### 修改文件权限
### 网络
ifconfig,
## 常用命令之性能统计
### CPU
#### top




### 内存

### IO

### 网络IO
## 常用统计命令
### sort
### uniq
### wc
## 三剑客与管道使用
### 管道

### 正则表达式

### grep

### awk

****





### sed



/-e bn上下翻页,jk上线翻页。注意并没有对原文件处理
i是在行前添加,a是在行后添加。
-i参数使用一定要谨慎
## Bash 编程语法
## Bash 脚本编写
## Linux 进阶命令
## Linux 环境配置
## shell 实战
# 4. Web 自动化测试
## selenium 的安装
> **三大组件**
Selenium WebDriver,Selenium IDE,Selenium Grid。
> **安装步骤:**
1. pip install selenium
2. 安装chromedriver
## selenium IDE 用例录制
## selenium 测试用例编写
> demo1
```python
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
class TestHogwarts:
def setup(self):
# 注意chrome 禁止自动化测试问题
self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
self.driver = webdriver.Chrome(options=self.chrome_options)
self.driver.implicitly_wait(5)
self.driver.get("https://www.baidu.com")
def teardown(self):
self.driver.quit()
def test_baidu(self):
self.driver.find_element(By.ID,'kw').send_keys('霍格沃兹测试学院')
self.driver.find_element(By.ID,'su').click()
self.driver.find_element(By.LINK_TEXT,'霍格沃兹测试学院 - 主页')
```
## 隐式等待与显式等待
隐式等待,显示等待的优缺点
| | | |
| ---: | ---- | ---- |
| | | |
| | | |
| | | |
## web 控件定位与常见操作
css selector,优势是快一些,注意空格和>的区别

Xpath,注意/和//的区别
**对比Xpaht和css selector的语法,强化一下记忆**
## web 控件的交互进阶
ActionChains: 应用于PC端
TouchActions:应用于移动端
## 网页 frame 与多窗口处理
## selenium 多浏览器处理
```python
class Base:
def setup(self):
browser = os.getenv("browser")
if browser == "firefox":
self.driver = webdriver.Firefox()
elif browser == "headless":
self.driver = webdriver.PhantomJS
else:
self.driver = webdriver.Chrome()
```
## 执行 javascript 脚本
## 文件上传弹框处理
## page object 设计模式
引出page object的原因, 元素名称老是会改变。老该代码很麻烦。


**把操作细节和验证分开。**
官方文档介绍:https://www.selenium.dev/documentation/en/guidelines_and_recommendations/page_object_models/
Martin Fowler提出的思想:https://martinfowler.com/bliki/PageObject.html
## page object 原则
## [Web 企业微信实战【1】](https://ceshiren.com/t/topic/11771)
## [Web 企业微信实战【2】](https://ceshiren.com/t/topic/11827)
PageObject设计模式:业务场景和具体操作分层。
算法的作用:提升运行效率,节省内存空间
设计模式的作用:提升代码可维护性,可测性,可插拔
# 5. App 自动化测试
## appium 环境安装与架构介绍
## appium环境搭建

```shell
连接MuMu模拟器
adb connect 127.0.0.1:7555
adb shell
```
## [appium 第一个测试用例](https://ceshiren.com/t/topic/12652)
## appium 用例录制
```shell
adb logcat |grep -i displayed 查看app入口
adb shell dumpsys activity top 获取当前页面元素
adb shell am start -W -n com.xueqiu.android/.main.view.MainActivity 启动应用
```
## 元素定位方法与隐式等待
## app 控件定位


## app 控件交互
https://github.com/appium/appium-uiautomator2-server
## 触屏操作自动化
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/touch-actions.md
## 高级定位技巧
主要使用Xpath
## 显式等待机制
## 特殊控件 toast 识别
```
adb shell dumpsys window|grep mCurrent
```
## 属性获取与断言
## 参数化用例
## android webview 测试
## 微信小程序测试
https://ceshiren.com/t/topic/3994
## capability 使用进阶
## 企业微信移动 app 实战 1
https://ceshiren.com/t/topic/11907
## 客户端专项测试
# 5. 接口协议抓包分析与mock
## 常见接口协议解析

## 抓包分析 tcp 协议
## 使用 postman 发送请求
断言,变量(代码添加,点击编辑),cookie鉴权,参数传递(token鉴权),用例集,数据驱动(json,csv),代码导出。
## 使用 curl 发送请求
curl多用于脚本,nc tcp/udp协议发送

## 常用代理工具

## http/https 抓包分析
## 雪球抓包和mock实战
> ###### Charles

状态码:4xx 客户端问题,5xx服务端问题
弱网测试,breakpoint,rewrite(测前端非常好用)。
https://ceshiren.com/t/topic/12358
map local,map remote
> mitmproxy
# 6. 接口自动化测试
## 接口测试框架
推荐Requests框架
## 接口请求构造


## 接口测试断言
## json/xml 请求
## json/xml 响应断言

## schema 断言
## header cookie 处理
## 认证体系
## 企业微信接口测试实战
jsonpath比较适合复杂的查询。两层for循环最多,再多用jsonpath
封装思想参考requests.request方法的封装思路
Yapi,rap
# 7. docker 容器技术
## docker 常用命令
```shell
docker exec -it 28c811d36091 /bin/bash # 感觉先进去,再用Linux命令更舒服一些
```
## 搭建 Web 服务器 nginx
## 搭建测试用例管理平台 testlink
## 搭建持续集成平台 Jenkins
## docker-compose 使用
## docker 的 registry 介绍
```sh
sudo apt-key fingerprint 0EBFCD88 #校验key
root@1e3a71b80d70:/# apt-key fingerprint 0EBFCD88
# 返回结果
pub rsa4096 2017-02-22 [SCEA]
9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88
uid [ unknown] Docker Release (CE deb)
sub rsa4096 2017-02-22 [S]
```
> 安装Docker遇到的问题
1. **localectl set-locale LANG=en_US.UTF-8**
如何解决
要设置系统语言环境,请使用localectl命令。例如,如果您希望使用UTF-8编码的美国英语(US),则运行以下命令。
下载的centos docker镜像系统默认使用的是ISO/IEC 15897字符集
需要改成UTF-8.
**先安装所有的字符集**
```sh
dnf install langpacks-en glibc-all-langpacks -y
```
**设置字符集**
```sh
localectl set-locale LANG=en_US.UTF-8
```
2. **Docker容器里的centos、unbuntu无法使用 systemctl 命令的解决方案**
据说在 Linux Docker中无法使用 systemd(systemctl) 相关命令的原因是 1号进程不是 init ,而是其他例如 /bin/bash ,所以导致缺少相关文件无法运行。(System has not been booted with systemd as init system (PID 1). Can't operat)
解决方案:/sbin/init
例如:Ubuntu 18.04 ,
**docker run -tid --name test --privileged=true ubuntu:18.04 /sbin/init**
**docker exec -it test /bin/bash**
**PS:--privilaged=true一定要加上的。**
————————————————
## dockerfile 语法与指令
## docker 镜像构建
## 6月3日 直播课
### **搭建 selenium grid hub**
https://github.com/SeleniumHQ/docker-selenium
### **三个面试题**
1. --link hub的本质是 -e 复制环境变量到node,所以直接可以用 -e master节点的环境变量复制到node节点
2. IE 为什么没有docker?
3. 是否可以用docker 测试不同系统的兼容性?
4. 没安装抓包工具,怎么解决网络问题?
### **三种网络模式**
> 桥接网络

> Host

> **container**

在测试开发中,非常有用,
共享网络

共享文件目录

共享进程
故障注入
每个容器本质就是一个进程,被各种名称空间包裹着,相互打破名称空间的隔离,相互配合。service mesh。
## 6月6日 直播课


### 镜像构建
> 搭建镜像仓库
### Docketfile
的优势:有缓存,方便调试。缺点,每run一层就多一层IO开销
联合文件系统、镜像分层,一个RUN指令就是一层
为什么这样设计?复用基础镜像,节省磁盘空间。软件设计(解耦,复用)
只需下载app层就可以
## K8S简介
# 8. 持续集成实战
## CI实战
https://ceshiren.com/t/topic/13068
## Jenkins UI 自动化测试持续集成体系建设
https://ceshiren.com/t/topic/13064
# 9. 接口测试框架
## 测试用例自动生成
打造数据驱动的测试框架
- 企业微信文档 → swagger open api → generate client
- 企业微信文档 → 自定义yaml数据 → 数据驱动框架(httprunner mtf) 结合测试平台
- 企业微信文档 → api object python源代码 → tdd + api object风格的测试用例 大部分实践采用的方式
### swagger
### HttpRunner
### api object python源代码