基础知识
研发阶段常见的质量保证手段
❖ 代码评审code review
❖ 代码审计
❖ 单元测试
❖ 自动化冒烟测试
❖ 研发自测
Code Review代码评审
❖ 对源代码进行检查,以期发现问题的过程
❖ 价值点
- 代码规范约束,培养良好的代码习惯和追求
- 深入了解业务,知识和规范的传承
- 沟通设计思路并改进,互相评审防止烂代码烂设计进入
❖行业观点和落地
- 行业经验普遍认为代码评审是最有效的质量保证手段
- 借助标准的代码管理工具即可。比如gitlab的pr机制
- 整个过程测试工程师参与度低
代码审计
❖综合性的代码分析平台
❖IDE辅助功能
- xcode android studio 编辑器报警
- 阿里巴巴java开发手册ide插件支持
❖独立的静态分析工具
自动化测试框架选择
❖推荐Appium
- 跨语言
- 跨平台
- 底层多引擎可切换
- 生态丰富,社区强大
❖KIF Robotium Uiautomator1/2 更底层的框架
❖calabash也是同样优秀的方案
❖阿里开源的macaca性能更好
兼容性测试方法
❖商业服务方案
- 阿里MQC [免费+商业]
- 百度MTC [免费+商业]
- Testin [免费+商业]
❖私有部署方案
- stf平台 [开源]
- Appium grid方案 [开源]
- 迪原锐测盒子 [商业方案]
- Appetizer
服务端性能测试
❖加压工具
- Gor TcpCopy 线上导流
- 开源压力测试工具: JMeter ab Gatling nGrinder
- 商业压测工具:LoadRunner
❖监控工具
- influexDB+grafana graphite时序数据监控,监控系统资源
- elk 日志监控,监控应用级别log
第三方测试服务
- 商业性性能监控平台:听云 NewRelic OneApm
- 崩溃收集和分析平台:Bugly Fabric Flurry
- 内测与公测平台:pgyer fir.im testflight
- 兼容测试服务: mqc mtc testin
- 云压测服务:xmeter 云智慧压测宝
- 跨地域的可访问性测试:。。。。
Bash
1 2 3 4 5 6 7 8 9 10 |
# 变量定义 a=1 a="Hello world" # 变量使用 echo $a # echo ${a} # 命令行输入$,按下两次 Tab 会显示所有系统内置变量,如$PWD a=(1 2 3 4 5) # 数组 echo ${a[0]} # 按指定下标输出数组元素 echo ${a[*]} # 输出数组所有元素 echo ${#a[*]} # 数组长度 |
特殊符号的应用
- “” 双引号用于括起一段字符串值,如果里面有特殊字符,就进行替换。比如$var形式的变量,\n 转义等。
- ‘ 单引号也表示其内容是字符串值。保持原义。
- `反引号。用法比较独特,代表命令的输出。非常有用。
- \ 反斜线,某些情况下表示转义。
- $(ls) 表示执行ls后的结果。与 ``类似。不过可以嵌套。
- $(()) 对变量进行操作。比如相加$((a+b)) $((2+3))
- (()) 是整数扩展。把里面的变量当作整数去处理。
123((a=a+1))# 这一方法不支持浮点值运算,需使用下面的方法:awk 'BEGIN{print 1/3}' - :<<EOF here document
- {1..10} 等价于 seq 1 10。表示1到10
- () 子shell中运行
- {} 当前shell中执行
1 2 3 4 |
${var/pattern/string} # 字符串替换,仅第一个 ${var//pattern/string} # 字符串替换,替换所胡 $? # 上一个进程返回的状态,0为正常 [ 2 -eq 2 ] # 算术判断 eq|ne|gt|ge|lt|le;也可使用((10>=8))这种形式 |
字符串比较
- [ string1 = string2 ]如果两字符串相同,则结果为真
- [ string1 != string2 ] 如果两字符串不相同,则结果为真
- [ -n string ] 如果字符串不是空,则结果为真
- [ -z string ] 如果字符串是空,则结果为真
- [[ “xxxx” == x* ]] *在表达式中表示0或者多个字符
- [[ xxx == x?? ]] ?在表达式中表示单个字符
逻辑判断
1 2 |
-a # 与,同 && -o # 或,同 || |
系统内置的判断
- -d file 如果文件是一个子目录,则结果为真
- -e file 如果文件存在,则结果为真
- -f file 如果文件是一个普通文件,则结果为真
- -g file 如果文件的set-group-id被设置,则结果为真
- -r file 如果文件可读,则结果为真
- -s file 如果文件的长度不为0,则结果为真
- -u file 如果文件的set-user-id被设置,则结果为真
- -w file 如果文件可写,则结果为真
- -x file 如果文件可执行,则结果为真
逻辑控制
- 条件if
- if [ condition ] ; then …;fi
- if [ condition ] ; then …;else …;fi
- if [ condition ] ; then …;elif …;fi
- 简单的逻辑可以使用 && || 去替代
- 条件 case
- 用于条件太多的情况。每一个条件最后使用两个分号结尾,不可缺少。
1234567case $var inp1) ... ;;p2) ... ;;...pn) ... ;;*) ...;;esac
- 用于条件太多的情况。每一个条件最后使用两个分号结尾,不可缺少。
- For 循环
1234for(( c1 ; c2 ; c3 ));do... ;done
举例
12345for((i=0;i<10;i++));do echo $i;donefor f in $array[*];do.....done - While 循环
i=0;while [ $i -lt 3 ] ;do echo $i;((i=i+1));Done
一个有用的小技巧。一行行的读取文件内容 while read line;do echo $line;done < /tmp/tmp
()中的内容在子 shell 中执行;{}中的代码在当前 shell 中执行
break, continue
Shell 输入输出
- Read 用来读取输入,并赋值给变量,echo ,printf可以简单输出变量。
- > file 将输出重定向到另一个文件。>> 表示追加
- < file 输入重定向
- | 表示管道,也就是前一个命令的输出传入下一个命令的输入 grep
- 输入文件—标准输入0
- 输出文件—标准输出1
- 错误输出文件—标准错误2
- 使用 2>&1 >/tmp/tmp < /tmp/tmp
1 2 3 4 5 6 |
python -m CGIHTTPServer #FTP # python2 python -m SimpleHTTPServer 8888 # python3 python3 -m http.server 8888 |
移动端自动化测试方案
Android
- calabash-android
- MonkeyTalk
- Robotium
- UiAutomator
- selendroid
- Expresso
- Appium
iOS
- calabash-ios
- Frank
- UIAutomation
- ios-driver
- KeepItFunctional
- Expresso
- Appium
Appium 环境安装
1 2 3 4 |
npm install -g appium appium -g xxx.log # 记录日志 adb shell dumpsys activity activities |
生态工具:
- adb
- Appium Desktop
- Appium Server
- Appium Client
- Python
- Java
- Ruby
- Robotframework-appium
- AppCrawler 自动遍历工具
1 2 3 4 5 6 7 |
# 示例配置 { "platformName": "android", "deviceName": "emulator-5554", "appPackage": "com.xueqiu.android", "appActivity": "view.WelcomeActivityAlias" } |
1 |
pip install Appium-Python-Client |
单元测试
unittest 编写规范
- 测试模块首先 import unittest
- 测试类必须继承 unittest.TestCase
- 测试方法必须以 test_开头
- 模块名称、类名没有要求
- setUp、tearDown、setUpClass、tearDownClass、setUpModule、tearDownModule
PyCharm:Preferences > Tools > Python Integrated Tools > Testing > Default test runner 修改默认测试框架
pytest 优势
- 简单灵活,像写 Python 代码一样写测试用例
- 为测试方法输入不同参数化
- 自动重度失效的测试用例
- 支持 allure2测试报告
- 有很多第三方插件:http://plugincompat.herokuapp.com/
Pytest 编写规范
- 测试文件以 test_开头(也可以_test 结尾)
- 测试类以 Test 开头,且不能带有__init__方法
- 测试函数以 test_开头
pytest-sugar、pytest-assume( pytest.assume() )、pytest-rerunfails( pytest –reruns 3 xxx.py )、pytest-ordering( @pytest.mark.run(order=2) )、pytest-fixture(@pytest.fixture)
conftest.py 进行配置共享
https://pypi.org/search/?q=pytest
https://github.com/allure-framework/allure2/releases
参考代码:https://github.com/powerccna/vipstudent
https://github.com/linda883/testframework
HTMLTestRunner,下面Python 3兼容方案
1 2 3 4 5 6 |
第94行,将import StringIO修改成import io 第539行,将self.outputBuffer = StringIO.StringIO()修改成self.outputBuffer= io.StringIO() 第642行,将if not rmap.has_key(cls):修改成if not cls in rmap: 第766行,将uo = o.decode(‘latin-1‘)修改成uo = e 第775行,将ue = e.decode(‘latin-1‘)修改成ue = e 第631行,将print >> sys.stderr, ‘\nTime Elapsed: %s‘ %(self.stopTime-self.startTime)修改成print(sys.stderr, ‘\nTimeElapsed: %s‘ % (self.stopTime-self.startTime)) |