注:本贴为录播课件内容补充贴,缺少的内容可以在回复区里进行反馈
1、Linux系统与shell环境准备
ls: 列出目录
cd:切换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
cp: 复制文件或目录
rm: 移除文件或目录
mv: 移动文件与目录,或修改文件与目录的名称
Shell基础
常见的shell
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh
运行shell
-
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本 -
/bin/sh test.sh
Linux常用命令
文件
ls: 列出目录
cd:切换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
cp: 复制文件或目录
rm: 移除文件或目录
mv: 移动文件与目录,或修改文件与目录的名称
文件权限
r 读权限read 4
w 写权限write 2
x 操作权限execute 1
chmod 777 test,修改test文件属性
网络
netstat:打印Linux网络系统的状态信息
-t 列出所有tcp
-u 列出所有udp
-l 只显示监听端口
-n 以数字形式显示地址和端口号
-p 显示进程的pid和名字
性能
top:持续监视系统性能
ps:查看进程信息
-aux 显示所有进程,包括用户,分组情况
Linux 常用命令之 性能统计
CPU
- 查看 CPU 信息:cat /proc/cpuinfo
- 负载信息:top
测试系统负载
{ yes > /dev/null & } && sleep 30 && ps -ef|grep yes|awk '{print $2}'|xargs kill
for i in $(seq 0 $(($(cat /proc/cpuinfo |grep processor|wc -l)-1))); do taskset -c $i yes > /dev/null & done && sleep 60 && ps -ef|grep yes|awk '{print $2}'|xargs kill
top
-
-d 间隔时间,top -4 每隔4秒更新一次
-
-n 获取多次cpu的执行情况 ,top –n 4 只更新4次
-
-p 获取指定端口的进程的数据
-
-b 批处理模式
-
Tasks:进程总数
-
running:正在运行的进程数
-
sleeping:睡眠的进程数
-
stopped:停止的进程数
-
zombie:僵尸进程数
-
Cpu:
- us(user time):用户空间占用 CPU 百分比
- sy(system time):内核空间占用 CPU 百分比
- ni(nice):改变过优先级的进程占用CPU的百分比
- id(idle):空闲CPU百分比
- wa:IO等待占用CPU的百分比
- hi:硬中断(Hardware IRQ)占用CPU的百分比
- si:软中断(Software Interrupts)占用CPU的百分比
-
进程
- PR:进程优先级
- NI:nice值。负值表示高优先级,正值表示低优先级
- VIRT:进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES:进程使用的、未被换出的物理内存大小,单位kb
- SHR:共享内存大小,单位kb
- S:进程状态:D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程
- %CPU:上次更新到现在的CPU时间占用百分比
- %MEM:进程使用的物理内存百分比
- TIME+:进程使用的CPU时间总计,单位1/100秒
- COMMAND:命令名/命令行
内存
free -m
total used free shared buff/cache available
Mem: 7934 2135 3125 64 2673 5437
Swap: 2047 0 2047
total 总物理内存
used 已经使用的物理内存
free 没有使用过的物理内存
shared 多进程共享内存
buff/cache 读写缓存内存,这部分内存是当空闲来用的,当free内存不足时,linux内核会将此内存释放
buffer是即将要被写入磁盘的,而cache是被从磁盘中读出来的。
available 还能被“应用程序"使用的物理内存
IO
安装
- Ubuntu:
- apt install -y sysstat
- apt install iftop
- apt install strace
- CentOS
- yum install -y sysstat
- yum install -y epel-release
- yum install -y iftop
- yum install strace
硬盘IO
- 写:dd if=/dev/zero bs=1024 count=4096000 of=test.iso
- 读:dd if=test.iso bs=64k |dd of=/dev/null
- bs:设置读/写缓冲区的字节数
- /dev/null,空设备,是一个特殊的设备文件,它丢弃一切写入其中的数据 。
- /dev/zero 是一个特殊的文件,当你读它的时候,它会提供无限的空字符。
iostat 1
avg-cpu: %user %nice %system %iowait %steal %idle
0.11 0.03 0.23 0.00 0.00 99.63
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
loop0 0.00 0.01 0.00 497 0
-c 只看cpu
-d 只看硬盘
- 块设备(磁盘)的状况
- tps:每秒进程下发的IO读、写请求数量
- kB_read/s:每秒从驱动器读入的数据量
- kB_wrtn/s:每秒从驱动器写入的数据量
- kB_read:读入数据总量
- kB_wrtn:写入数据总量
网络 IO
- iftop
- 不进行DNS反解析:iftop -n -i eth0
- => 代表发送数据
- <= 代表接收数据
- TX (Transmission):发送
- RX (Reception):接收
- TOTAL 全部的流量
- cum(cumulative):目前累积流量
- peak:峰值流量
- rates:平均值,2秒,10秒和40秒的平均流量
- t 切换显示状态,接受、发送数据,p显示端口
- 下载文件:http://mirrors.aliyun.com/centos/8.2.2004/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso
Linux 常用命令之 统计命令
sort
- sort 常用参数
- -b:忽略开头的空白字符
- -f:将小写字母看作为写字母
- -h:根据存储容量排序(KB、MB、GB)
- -n:按数字排序
- -o:把结果写入文件
- -r:以相反的顺序来排序
- -t:指定分隔符。默认为空格
- -V:按照数字版本排序
- -k:指定排序的关键字,与 -t 参数配合使用
- 参考:https://wangchujiang.com/linux-command/c/sort.html
uniq
- uniq 常用参数(只检查上下行是否重复)
- -c:统计重复出现的次数
- -d:所有邻近的重复行只被打印一次。重复次数要>=2次
- -D:所有邻近的重复行将全部打印
- -f:跳过对前n个列的比较
- -s:跳过对前n个字符的比较
- -w:只对每行前n个字符进行比较
wc
- wc 常用参数
- -c:统计字节数:chars
- -l:统计行数
- -w:统计单词数
- -L:打印最长行的长度
3、Linux三剑客与管道使用
管道
Linux提供管道符“|”将两个命令隔开,管道符左边命令的输出就会作为管道符右边命令的输入
正则
正则表达式就是记录文本规则的代码
演练环境
举例
找出所有的hi单词 \bhi\b
hi单词后面有lucy单词 \bhi\b.*\blucy\b
以0开头,然后是两个数字,然后是一个连字号“-”,最后是8个数字 0\d{2}-\d{8}
grep
根据用户指定的模式(pattern)对目标文本进行过滤,显示被模式匹配到的行
选项
-v 显示不被pattern匹配到的行
-i 忽略字符大小写
-n 显示匹配的行号
-c 统计匹配的行数
-o 仅显示匹配到的字符串
-E 使用ERE,相当于egrep
sed
sed是流编辑器,一次处理一行内容
sed [-hn…][-e][-f<script文件>][文本文件]
-h 显示帮助。
-n 仅显示script处理后的结果。
sed [-hnV][-e][-f<script文件>][文本文件]
-e 以选项中指定的script来处理输入的文本文件。
-f<script文件> 以选项中指定的script文件来处理输入的文本文件。
a :新增 sed -e ‘4 a newline’
c :取代 sed -e ‘2,5c No 2-5 number’
d :删除 sed -e '2,5d’
i :插入 sed -e ‘2i newline’
p :打印 sed -n ‘/root/p’
s :取代 sed -e 's/old/new/g’
awk
把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行后续处理
awk ‘pattern + action’ [filenames]
-pattern 正则表达式
-action 对匹配到的内容执行的命令(默认为输出每行内容)
FILENAME awk浏览的文件名
BEGIN 处理文本之前要执行的操作
END 处理文本之后要执行的操作
FS 设置输入域分隔符,等价于命令行 -F选项
NF 浏览记录的域的个数(列数)
NR 已读的记录数(行数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符
$0 整条记录
$1 表示当前行的第一个域…以此类推
Bash编程语法
变量
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
变量类型
字符串:your_name=“hogwarts”
拼接字符串:greeting=“hello, “$your_name” !”
数组 array_name=(value0 value1 value2 value3)
取数组 valuen=${array_name[n]}
单独赋值 array_name[0]=value0
控制语句
if
比较两个变量的大小并输出不同的值
i f [ $a -eq $b ]; then echo “equal”; elif [ $a -lt $b ];then echo “small”; elif [ $a -gt $b ];then echo “big”;fi
for
循环读取文件内容并输出
for i in $(cat dir.txt);do echo $i;done
while
循环读取文件内容并输出
while read line;do echo $line;done<dir.txt
Bash脚本编写
read
read命令是用于从终端或者文件中读取输入的内部命令
读取整行输入
每行末尾的换行符不被读入
使用
从标准输入读取输入并赋值给变量
read var
从标准输入读取多个内容
read var1 var2 var3
不指定变量(默认赋值给REPLY)
read
脚本传参
$0 脚本名称
$1~$n 获取参数
$# 传递到脚本的参数个数
$$ 脚本运行的当前进程ID号
$* 以一个单字符串显示所有向脚本传递的参数
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
算数运算
a=10 b=20
+ 加法 `expr $a + $b` 结果为 30
- 减法 `expr $a - $b` 结果为 -10
* 乘法 `expr $a \* $b` 结果为 200
/ 除法 `expr $b / $a` 结果为 2
a=10 b=20
% 取余 `expr $a % $b` 结果为 10
= 赋值 a=$b 将把变量 b 的值赋给 a
== 相等 相同则返回 true:[ $a == $b ] 返回 false
!= 不相等 不相同则返回 true:[ $a != $b ] 返回 true
-eq 检测相等 [ $a -eq $b ] 返回 false
-ne 检测不相等 [ $a -ne $b ] 返回 true
-gt 检测左边是否大于右边 [ $a -gt $b ] 返回 false
-lt 检测左边是否小于右边 [ $a -lt $b ] 返回 true
-ge 检测左边是否大于等于右边 [ $a -ge $b ] 返回 false
-le 检测左边是否小于等于右边 [ $a -le $b ] 返回 true
Python环境
官方地址下载python安装包 : https://www.python.org/
Python安装文档(windows系统):Python和PyCharm环境安装配置 - #4,来自 hogwarts-yunlong
官方地址下载pycharm安装包
安装包
pip install 包名==版本号
pip install selenium==2.39.0
pip install -i 镜像地址 --trusted-host 镜像地址对应的host
举例:pip3 install jupyter -i Simple Index --trusted-host pypi.douban.com
国内的pip源
阿里云:Simple Index
清华:Simple Index
豆瓣:Simple Index
2,基础的数据类型
Python官方参考文档
allure:https://demo.qameta.io/allure/#
windows/mac通用安装方法
https://github.com/allure-framework/allure2/releases 下载allure2.7.zip包,
解压->进入bin目录->运行allure.bat,
把bin目录加入PATH环境变量
Mac 可以使用brew安装:
brew install allure
官网:http://allure.qatools.ru/
文档:Allure Framework
生成报告
安装allure-pytest插件
pip install allure-pytest
运行:
在测试执行期间收集结果
pytest [测试文件] -s –q --alluredir=./result/ (—alluredir这个选项 用于指定存储测试结果的路径)
查看测试报告
方式一:测试完成后查看实际报告, 在线看报告,会直接打开默认浏览器展示当前报告
allure serve ./result/ (注意这里的serve书写)
方式二:从结果生成报告,这是一个启动tomcat的服务,需要两个步骤:生成报告,打开报告
生成报告
allure generate ./result/ -o ./report/ --clean (注意:覆盖路径加–clean )
打开报告
allure open -h 127.0.0.1 -p 8883 ./report/
allure运行不同的测试用例
按features运⾏行行测试你⽤用例例
pytest --alluredir= log/report/xml --allure_features=测试登录功能,测试我的自选 testcases/alluredemo
按story运⾏测试⽤例
pytest --alluredir= log/report/xml --allure_stories=测试已登录的场景 testcases/alluredemo
按severity运⾏测试⽤例
pytest --alluredir= log/testreport/xml --allure_severities=blocker testcases/alluredemo
前端自动化测试-截图
场景:
前端自动化测试经常需要附加图片或html,在适当的地方,适当的时机截图
解决:
@allure.attach显示许多不同类型的提供的附件,可以补充测试,步骤或测试结果。
步骤:
在测试报告里附加网页:
allure.attach(body(内容), name, attachment_type, extension):
allure.attach(‘ 首页’, ‘这是错误页的结果信息’, allure.attachment_type.HTML)
在测试报告里附加图片:
allure.attach.file(source, name, attachment_type, extension):
allure.attach.file(“./result/b.png”, attachment_type=allure.attachment_type.PNG)
pytest-html生成报告
- 安装:
- pip install pytest-html
- 生成html报告
- pytest -v -s --html=report.html - - self-contained-html
selenium
简介
Selenium支持web浏览器的自动化。它主要由三个工具构成:WebDriver、IDE、Grid
官方网站
- Driver的介绍
- Driver的下载
selenium IDE
官网:
Chrome插件:
https://chrome.google.com/webstore/detail/selenium-ide/mooikfkahbdckldjjndioackbalphokd
Firefox插件:
github release:
https://github.com/SeleniumHQ/selenium-ide/releases
其它版本:
https://addons.mozilla.org/en-GB/firefox/addon/selenium-ide/versions/
注意:Chrome插件在国内无法下载,Firefox可以直接下载。
- 安装完成后,通过在浏览器的菜单栏中点击它的图标来启动它:
- 如果没看到图标,首先确保是否安装了Selenium IDE扩展插件,其次,可以在下面的地址访问所有插件:
- Chrome: chrome://extensions
- Firefox: about:addons
扩展
代码导出:
常见问题:
Python selenium
小白入门:https://selenium-python.readthedocs.io/
Actions
官方文档
https://selenium-python.readthedocs.io/api.html
ActionChains:执行PC端的鼠标点击,双击,右键,拖拽等事件
TouchActions:模拟PC和移动端的点击,滑动,拖拽,多点触控等多种手势操作
TouchAction
https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html
frame演示
多frame切换案例:
打开包含frame的web页面 菜鸟教程在线编辑器
打印’请拖拽我’元素的文本
打印’点击运行’元素的文本
def test_framedeal_1(self):
self.driver.get(“https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
self.driver.switch_to.frame("iframeResult")
print(self.driver.find_element_by_id("droppable").text)
self.driver.switch_to.parent_frame()
print(self.driver.find_element_by_id("submitBTN").text)
多浏览器支持
browser = os.getenv("browser").lower()
if browser == 'firefox':
self.driver = webdriver.firefox()
elif browser == 'headless':
self.driver = webdriver.PhantomJS()
else:
self.driver = webdriver.Chrome()
启动Chrome debug
- 正常启动chrome的debug模式
alert窗口
测试案例:
打开网页 菜鸟教程在线编辑器
操作窗口右侧页面, 将元素1拖拽到元素2
这时候会有一个alert弹框,点击弹框中的’确定’
然后再按’点击运行’
关闭网页
def test_framedeal(self):
self.driver.switch_to.frame("iframeResult")
action = ActionChains(self.driver)
action.click_and_hold(self.driver.find_element_by_id("draggable"))\
.move_to_element(self.driver.find_element_by_id("droppable")).release().perform()
self.driver.switch_to.alert.accept()
# self.driver.switch_to.default_content()
self.driver.switch_to.parent_frame()
print(self.driver.find_element_by_id("submitBTN").text)
self.driver.find_element_by_id("submitBTN").click()
time.sleep(3)
pageobject
2013 Martin Flower PageObject
2015 Selenium https://github.com/SeleniumHQ/ selenium/wiki/PageObjects
2020 /documentation/test_practices/encouraged/page_object_models/
原则
appium
环境
安装JDK (1.8版本)
官网下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html
-
安装 SDK
-
下载 sdk
- Android studio地址 https://developer.android.com/studio/index.html
- 中文官网下载地址:http://tools.android-studio.org/index.php/sdk
-
下载 sdk
安装appium desktop (appium server + appium inspector工具)
下载对应操作系统的安装包:https://github.com/appium/appium-desktop/releases
如果不需要appium inspector ,也可以通过 npm直接安装appium
官方安装(不推荐)
npm install -g appium
淘宝提供(推荐)
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install -g appium
运行
appium (不报错说明安装成功)
安装appium python client
方式一:Pip install appium-python-client(推荐)
方式二:下载源码包:
下载地址:https://github.com/appium/python-client
https://pypi.python.org/pypi/Appium-Python-Client
解压后在命令行中进入python-client-master目录,该目录下包含setup.py文件
执行命令python setup.py install命令安装客户端
获取app的信息
app信息
获取当前界面元素:adb shell dumpsys activity top (推荐)(重点)
获取任务列表:adb shell dumpsys activity activities
app入口
adb logcat |grep -i displayed (推荐)(重点)
aapt dump badging mobike.apk | grep launchable-activity
apkanalyzer 最新版本的sdk中才有
启动应用
adb shell am start -W -n com.xueqiu.android/.view.WelcomeActivityAlias -S (重点)
capability
app控件交互
-
get_attribute()方法能获取的属性,元素的属性几乎都能获取到,属性名称和 uiautomatorviewer 里面的一致
-
TouchAction 用法
高级定位技巧
- TouchAction 用法
uiautomator
get_attribute
assert断言
hamrest
appium纯web页面
手机端
被测浏览器:(不可以是第三方浏览器) ’Safari’ for iOS and ‘Chrome’, ‘Chromium’, or ‘Browser’ for Android,
PC端
安装Chrome浏览器(或chromium),并且能登录https://www.google.com/
下载对应手机浏览器对应的driver版本
国内镜像地址:CNPM Binaries Mirror
appium github:https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md
客户端代码:
desirecapability
“browser” = “Browser” 或者“browser” = ”Chrome”
“chromedriverExecutable” = “指定driver地址”
Mac Chromedriver 默认地址:
/Applications/Appium.app/Contents/Resources/app/node_modules/appium/node_modules/appium-chromedriver/chromedriver/mac/
获取webdriver版本
查看手机浏览器的版本
adb shell pm list package |grep webview
adb shell pm dump com.android.browser|grep version
adb shell pm dump com.android.chrome|grep version
adb shell pm dump com.android.webview|grep version
- chrome://inspect/
appium混合应用
PC:
浏览器能访问 https://www.google.com/
chromedriver下载对应的版本
https://github.com/appium/appium/blob/master/docs/en/writing-running-appium/web/chromedriver.md
手机端
应用代码需要打开webview开关
代码
appPackage, appActivity
desirecapability里面添加:chromedriverExecutable:driver路径
webdriver开关
monkey
adb shell monkey 100 对所有包随机操作
adb shell monkey -p com.xueqiu.android 100 对指定包
adb shell monkey -p com.xueqiu.android -s 20 80 时间种子
adb shell monkey -p com.xueqiu.android -vv -s 20 80 详细日志
时间延迟
adb shell monkey -p com.xueqiu.android --throttle 5000 100
事件百分比
adb shell monkey -p com.xueqiu.android --pct-touch 10 1000
–pct-touch:触摸事件,比如点击
–pct-motion:动作事件,比如滑动(直线)
–pct-trackball:轨迹事件,比如移动+点击,曲线滑动
–pct-majornav:主要导航事件,比如回退按键、菜单按键:
maxim
https://github.com/zhangzhao4444/Maxim
adb push framework.jar /sdcard
adb push monkey.jar /sdcard
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 60 -v -v
stf
启动
docker run -d --name rethinkdb -v /srv/rethinkdb:/data --net host rethinkdb rethinkdb --bind all --cache-size 8192 --http-port 8090
docker run -d --name stf --net host openstf/stf stf local --allow-remote
获取dom结构
windows
adb shell “uiautomator dump && cat /sdcard/window_dump.xml” | clip
adb shell “uiautomator dump && cat /sdcard/window_dump.xml” > tmp.xml
Mac
adb shell “uiautomator dump && cat /sdcard/window_dump.xml” | pbcopy
selenium Grid
官网:https://www.selenium.dev/downloads/
hub
java -jar selenium-server-standalone-3.141.59.jar -role hub
node
java -jar selenium-server-standalone-3.141.59.jar -role node -port 5677
配置文件启动node
java -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
https://www.selenium.dev/documentation/en/grid/setting_up_your_own_grid/
耗电量
git clone https://github.com/google/battery-historian.git
cd battery-historian
go get -d -u github.com/google/battery-historian/…
go run setup.go
go run cmd/battery-historian/battery-historian.go
- 清理耗电量数据
adb shell dumpsys batterystats --reset
adb shell dumpsys batterystats --enable full-wake-history - 运行测试用例/手工操作
- 收集数据
Android 7.0:adb bugreport bugreport.zip
Android6.0:adb bugreport > bugreport.txt
弱网
- 使用charles模拟弱网
- https://www.charlesproxy.com/download/
网络流量
Active interfaces:
iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId=“GoogleGuest”}]
Active UID interfaces:
iface=wlan0 ident=[{type=WIFI, subType=COMBINED, networkId=“GoogleGuest”}]
adb shell dumpsys package com.xueqiu.android | grep userId
userId=10007 gids=[3003, 1028, 1015]
app启动性能
adb shell am force-stop $package
adb shell screenrecord --bugreport --time-limit 30 /data/local/tmp/xueqiu.mp4 &
adb shell am start -S -W $package/.view.WelcomeActivityAlias
wait
adb pull /data/local/tmp/xueqiu.mp4 .
ffmpeg -i xueqiu.mp4 xueqiu.gif
ffmpeg -i xueqiu.mp4 -r 10 frames_%03d.jpg
CPU统计
H5 性能分析
appium/selenium的ExecuteScript Api
注⼊js
return JSON.stringify(window.performance.timing)
JSON.stringify(window.performance.getEntriesByName (document.querySelector(“img”).src)[0], null, 2)
postman
接口测试框架
数据驱动
jmeter安装
jmeter分布式
influxDB
InfluxDB 是一个用 Go 语言开发的开源分布式时序数据库。
新建容器网络:docker network create grafana
运行容器:docker run -d --name=influxdb --network grafana -p 8086:8086 -v ${PWD}/influxdb/:/var/lib/influxdb/ influxdb:1.7.10
创建数据库
第一种方式:curl -i -XPOST http://localhost:8086/query --data-urlencode “q=CREATE DATABASE jmeter”
第二种方式:docker exec -it influxdb influx,执行语句 create database jmeter;
简单使用
show databases;
use jmeter;
show measurements;
select * from jmeter limit 3;
性能监控体系
部署Prometheus
配置文件:https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yml
运行:docker run -d --name prometheus --network grafana -p 9090:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml
部署node_exporter
下载地址: https://github.com/prometheus/node_exporter/releases
配置Grafana
配置 Prometheus 数据源
配置面板:https://grafana.com/grafana/dashboards/8919
docker file
常用指令
FROM:基础镜像,FROM 命令必须是 Dockerfile 的首个命令。
LABEL:为镜像生成元数据标签信息。
USER:指定运行容器时的用户名或 UID,后续 RUN 也会使用指定用户。
RUN:RUN 命令是 Dockerfile 执行命令的核心部分。它接受命令作为参数并用于创建镜像。每条 RUN 命令在当前基础镜像上执行,并且会提交一个新镜像层。
WORKDIR:设置 CMD 指明的命令的运行目录。为后续的 RUN、CMD、ENTRYPOINT、ADD 指令配置工作目录。
ENV:容器启动的环境变量。
ARG:构建环境的环境变量。
COPY:复制文件
CMD:容器运行时执行的默认命令。
ENTRYPOINT:指定容器的“入口”。
HEALTHCHECK:容器健康状态检查。
Jenkinsfile语法
Declarative pipeline 示例代码
pipline{
agent{
node{
label "myslave"
customWorkspace "myWorkspace"
}
}
}
Declarative pipeline 示例代码
stages{
stage('git pull souce code'){
steps{
echo "sync updated code"
git "https://github.com/princeqjzh/iPipeline.git"
}
}
}
Declarative pipeline 示例代码
post {
success {
echo 'goodbye pipeline success!'
sleep 2
}
always {
echo 'always say goodbye'
}
}
Declarative pipeline 示例代码
environment {
hlw = 'hello world'
}
stages {
stage('Print environment_1'){
steps {
echo hlw
}
}
}
options {
timeout(time: 30, unit: 'SECONDS')
buildDiscarder(logRotator(numToKeepStr: '2'))
retry(5)
}
parameters {
string(name: 'PERSON', defaultValue: 'Jenkins', description: '输入的文本参数')
}
stages {
stage('Test Parameters'){
steps {
echo "Hello ${params.PERSON}"
}
}
}
Jenkinsfile 语法 Scripts pipeline
流程控制之 – if/else
node {
stage('Example') {
if (env.BRANCH_NAME == 'master') {
echo 'I only execute on the master branch'
} else {
echo 'I execute elsewhere'
}
}
}
流程控制之 – try/catch
node{
echo "This is test stage which run on the slave agent."
try {
echo "This is in the try block."
}catch (exc) {
echo "Something failed, I'm in the catch block."
}finally {
echo "Finally, I'm in the finally block."
}
}
pipline
pipeline {
agent any
stages {
stage('begin'){
steps {
echo 'Hello pipeline'
}
}
}
post {
always {
echo 'say goodbay'
}
}
}
测试平台开发
测试平台前端
vue.js 安装
-
CDN
-
NPM
通过webpack和CLI安装使用
安装node.js环境
https://nodejs.org/zh-cn/download/
组件库的使用
ElementUI
https://element.eleme.io/#/
BootstrapVue
https://bootstrap-vue.org/
Vuetify
https://vuetifyjs.com/zh-Hans/
axios
安装
$ npm install axios
VSCode插件
Vetur:VSCode支持VUE的工具,有语法高亮、格式化、错误检查、自动完成等功能。
JavaScript (ES6) code snippets:包含VSCode的ES6语法中的JavaScript代码段。
(推荐)Auto Close Tag:自动添加HTML/XML结束标签。
(推荐)Auto Rename Tag:自动重命名对应的HTML/XML标签。
Highlight Matching Tag:突出显示匹配的开始和结束标签。
测试平台后端
Jenkins调用
Jenkins调用-maven依赖
<dependency>
<groupId>com.offbytwo.jenkins</groupId>
<artifactId>jenkins-client</artifactId>
<version>0.3.8</version>
</dependency>
常用类-JenkinsHttpClient
- 封装了调用JenkinsAPI的底层方法。
- JenkinsHttpClient(URI uri, String username, String password)
- get(String path)
- getFile(URI path)
- post(String path, boolean crumbFlag)
- post(String path, D data, Class cls)
- post_xml(String path, String xml_data, boolean crumbFlag)
等等
常用类-JenkinsServer
- 封装了调用JenkinsAPI的语义级别的方法。
- JenkinsServer(JenkinsHttpConnection client)
- getJob(String jobName)
- createJob(String jobName, String jobXml, Boolean crumbFlag)
- updateJob(String jobName, String jobXml, boolean crumbFlag)
- getJobXml(String jobName)
- deleteJob(FolderJob folder, String jobName, boolean crumbFlag)
等等
常用类-Job
- Jenkins中job对应的实体类,有很多实用的语义级别的方法。
- Job(String name, String url)
- build(Job job)
- build(Job job, Map<String, String> params)
- getFileFromWorkspace(String fileName)
- setClient(JenkinsHttpConnection client)
springboot
-
使用IDE的插件进行快速创建
restful风格的接口实现方式
-
SpringBootApplication:springboot主类,用来加载springboot各种特性
-
RestController:Spring会转换返回值并自动将其写入HTTP响应
-
RequestMapping: 用于类和方法,在方法级别时,用于处理HTTP 的各种方法
-
RequestBody:将request body中的json/xml对象解析成该参数类型的Javabean对象
-
PathVariable:处理动态的 URI,URI 的值可以作为控制器中处理方法的参数
-
Post/Put/Get/DeleteMapping:在方法的级别上使用,在方法级别时,用于处理HTTP 的各种方法
-
RequestParam:处理get请求的参数
lombok使用
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
集成swagger-配置类
@Configuration
@EnableSwagger2
public class SwaggerConfig {
}
集成swagger-配置项
@Bean
public Docket docket() {
//header
//apiInfo
}
private ApiInfo apiInfo() {
}
常用配置介绍
server:
port: 8093
connection-timeout: 18000000
servlet
session:
timeout: 30m #30分钟,测试的话时间不能太短,否则不准。m(分钟),s(秒),h(小时),不写单位默认毫秒
spring:
application:
name: aitest
springboot多环境配置
<profiles>
<!--开发环境-->
<profile>
<id>dev</id>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>
简单运行脚本
test_start_8097.sh
nohup java -Xms256m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=128m -server -Dserver.port=8012 -jar aitest-mini.jar 'aitest-mini' --spring.profiles.active=dev >>./test_info_8097.log 2>&1 &
- ps -ef | grep aitest-mini #查询已经存在的aitest-mini进程,进程号为10179
- kill -9 10179 # 停止该进程
- sh test_start_8099.sh #执行启动命令
- tail -f test_info_8099.log #实时查看服务输出日志
Cors跨域资源共享
https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Access_control_CORS
数据持久化技术
mybatis配置
- springboot集成mybatis配置
- mybatis相关配置
- sql语句打印配置
@MapperScan(“com.hogwartstest.aitestmini.dao”)
tk.mybatis使用-mapper统一父类
mybatis的mapper的统一父类,用于简单sql语句的快速编码
public interface MySqlExtensionMapper<T> extends Mapper<T>, MySqlMapper<T>, IdsMapper<T> {
}
持久化常见注解
-
Table:表对应的实体类标识,name属性为表名
-
Id:主键标识
-
GeneratedValue(strategy = GenerationType.IDENTITY):配置主键为自增策略
-
Column:列名标识,当类属性与表字段不符时,用name属性标识表字段
-
Transient:标识此字段不进行持久化
mybatis常见特性
-
#{createUserId}
-
${createUserId}
-
concat(‘%’, #{params.caseSign}, ‘%’):MySQL函数,返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。