【软件测试Linux】详细Linux介绍和各种命令的场景应用
Linux
- Linux介绍
- 1. 作用
- 2. 使用场景
- 3. 实际工作中如何利用Linux
- 命令行使用详解
- 1. 文件与目录操作
- 2. 日志查看和分析
- 3. 进程与系统监控
- 4. 网络操作
- 5. 压缩与解压
Linux介绍
1. 作用
与服务器设备进行交互(远程连接/命令的使用)
2. 使用场景
- **服务器环境测试**:后端服务(API、微服务、 数据库、中间件)都部署在Linux服务器上。可进行后端测试、性能测试和部署验证- **日志分析与问题定位**:程序出问题,第一反应就是`连接到服务器`上,使用命令`查看和分析日志`,快速定位Bug是前端还是后端- **环境搭建与维护**- **自动化测试脚本的执行**:很多自动化测试脚本需要在Linux环境下运行,更稳定且易于集成到CI/CD流程中- **性能监控与取证**:当需要分析服务器的性能瓶颈(CPU、内存、磁盘、网络)时,必须使用Linux命令来获取实时数据
3. 实际工作中如何利用Linux
- 拿到测试服务器权限:通常会从运维/开发那得到一个服务器的IP地址、端口号、用户名和密码
- 连接服务器
- 查看应用状态:检查你的被测服务是否正在运行
- 实时跟踪日志:当你在界面上操作一个功能的实现,可实时查看后台输出的日志,方便跟踪问题所在
- 搜索指定错误:当发现一个Bug时,去日志里搜索错误信息(如
NullPointerException
)或指定的请求ID - 部署测试包:将开发编译好的最新测试包,上传到服务器并替代旧版本
- 检查系统资源:测试过程中发现系统卡顿,立即排查是否服务器资源不足
命令行使用详解
1. 文件与目录操作
pwd
(print working directory) 显示你当前所在的目录的绝对路径- 例如:
pwd
-> 输出/home/tester
- 例如:
ls
(list) 列出目录下的文件和子目录- 关键选项:
-l
:以长格式显示(权限、所有者、大小、时间)
-a
: 显示所有文件,包括隐藏文件(以.
开头文件)
-h
: 与-l
结合,以易读的格式显示文件大小 - 场景:查看日志目录下有哪些文件,或文件的详细信息
- 例子:
ls /var/log
-> 列出/var/log
下的内容
ls -lah
-> 以详细、易读的方式列出当前目录所有文件
- 关键选项:
cd
切换目录- 例子:
cd /var/log/app
-> 进入绝对路径
cd ..
-> 返回上一级目录
cd
或cd~
-> 直接回到当前用户的家目录
- 例子:
cat
查看较小文件的所有内容- 场景:快速查看一个配置文件的内容或一个简短的日志文件
- 例子:
cat /etc/myapp/config.properties
less
/more
分页查看大文件的内容。less
比more
更强大- 场景:查看大型日志文件。可以翻页、搜索
- 用法 :
查看:less huge_file.log
进入后,按空格
向下翻页,按b
向上翻页,按/
然后输入关键字进行搜索,按q
退出
cp
复制文件或目录- 关键选项:
-r
: 递归复制,用于复制目录。只要你想复制的是一个目录(文件夹),而不是单个文件,就一定要加上-r
参数 - 场景 : 备份日志文件或配置文件
- 例子:
cp app.log app.log.bak
-> 复制一份app.log文件为app.log.bak
cp -r config/ config_backup/
-> 复制config整个目录为config_backup
- 关键选项:
mv
移动文件/目录 或 重命名文件/目录
- 例子:
mv old_name.log new_name.log
-> 重命名
mv error.log /tmp/
-> 移动文件到/tmp
目录下rm
删除文件/目录- 关键选项:
-r
: 递归删除,用于删除目录
-f
: 强制删除,不提醒 - 例子:
rm temp.file
-> 删除一个文件
rm -r temp_dir/
-> 删除一个目录
- 关键选项:
find
查找文件- 例子:
find /home -name "*.log"
: 在/home
目录下查找所有.log
结尾的文件
find . -mtime -1
:在当前目录查找最近1天内修改过的文件。用于查找刚生成的日志或报告
- 例子:
chmod
: 修改文件权限- 例子:
chmod +x script.sh
: 给script.sh文件添加可执行权限。当你从本地写了一个Shell脚本上传到服务器后,必须做这一步
- 例子:
2. 日志查看和分析
ssh
从本地电脑连接到远程Linux服务器上—加密的远程登录- 基本连接语法:
ssh [用户名]@[服务器IP地址] -p [端口号]
服务器IP地址:远程服务器的公网IP或内网IP地址
端口号:指定SSH服务的端口号,SSH默认端口是22(默认则可省)- 例子:( IP:192.168.1.100 用户名: testuser 密码: 123456 端口: 22 (默认)
- 基本连接语法:
# 方式一
ssh testuser@192.168.1.100
# 然后系统通知您输入密码:testuser@192.168.1.100's pasword:
# 输入123456,回车
#然后命令行提示符就会变成 testuser@hostname:~$# 方式二: 指定端口登录 如果服务器SSH端口不是22,比如2222
ssh testuser@192.168.1.100 -p 2222# 方式三:使用密钥对登录
# -i 选项指定私钥文件的路径
ssh -i ~/.ssh/my_private_key.pem ubuntu@47.100.100.100
输入
exit
或按Ctrl + D
来退出SSH连接,回到本地终端。
scp
基于SSH协议,用于在本地和远程服务器之间安全地传输文件- 语法:
# 1. 从本地复制文件到远程服务器
scp -P [端口号] [本地文件路径] [用户名]@[服务器IP]:[远程路径]# 例如:将本地的测试包上传到服务器的 /tmp/ 目录
scp -P 22 ./target/my-app.jar tester@192.168.1.100:/tmp/# 2. 从远程服务器复制文件到本地
scp -P [端口号] [用户名]@[服务器IP]:[远程文件路径] [本地路径]
# 从服务器下载日志文件到本地当前目录进行分析
scp -P 22 tester@192.168.1.100:/var/log/app.log ./
-
tail
查看文件末尾内容 (最新的、相关的信息总是在文件的末尾)- 关键选项:
-f
: 实时追踪文件的新增内容!!
- 场景:查看最新的日志记录。边复现Bug,边实时观察日志输出
- 例子:
tail -n 100 app.log
静态查看日志最后100行内容
tail -f app.log
动态地、实时的追踪新增日志内容。边操作功能,边实时观察,精准定位Bug!!
tail -f app.log | grep "ERROR"
组合命令, 实时追踪,但只显示包含ERROR的行
- 关键选项:
-
grep
文本搜索,过滤出重要信息- 例子:
grep "ERROR" application.log
: 搜索所有包含ERROR的行
grep -n "OrderID 12345" application.log
: 搜索包含 “OrderID 12345” 的行,并显示行号(-n)
grep -A 3 -B 3 "exception" application.log
: 搜索exception,并同时打印出与它匹配的前三行(-B)和后三行(-A), 这对于看错误上下文至关重要
-A num
:After 的缩写。显示匹配行之后的 num 行。
-B num
:Before 的缩写。显示匹配行之前的 num 行。
-C num
:Context 的缩写。显示匹配行前后各 num 行。(相当于 -A num -B num)
(如上例子:grep -C 3 "exception" application.log
- 例子:
-
awk
:强大的文本分析工具,可以提取字段。- 例子:
awk '{print $1}' application.log
:打印每一行的第一个字段(默认以空格分隔)。日志格式通常是固定的,比如第一列是时间,第二列是日志级别。
grep "HTTP" access.log | awk '{if($9=="500") print $0}'
:先找出所有访问日志,然后用awk判断如果第9个字段(状态码)是500,就打印整行。常用于统计接口500错误。
awk
默认使用空格和制表符作为分隔符,将每一行文本切分成多个部分,每个部分就是一个“字段”。
如日志内容:2024-05-27 10:01:23 [INFO] com.example.Service ...
用空格分割这一行:
$1
= 2024-05-27
$2 = 10:01:23
$3 = [INFO]
$4 = com.example.Service
…以此类推
执行 print $1,于是输出:2024-05-27
- 例子:
-
sed
:流编辑器,用于替换、删除文本。sed 's/foo/bar/g' file.txt
:将文件中的所有foo替换成bar。在写部署脚本时可能用到。
3. 进程与系统监控
ps
: 查看进程状态- 关键选项:
-e
: 显示所有进程
-f
: 显示完整格式(Full),包含详细信息(如启动命令、启动时间) - 测试场景:
检查你的被测服务(如java Jar包,Tomcat、Nginx)是否在运行
查看进程PID、CPU/内存占用率 - 例子:
ps -ef | grep java
: 查找所有和java相关进程的详细信息
- 关键选项:
# 输出示例:
# UID PID PPID C STIME TTY TIME CMD
# appuser 123 1 0 May25 ? 00:10:05 java -jar /opt/myapp/my-service.jar
PID 123 : 这个就是Java进程的ID,用kill时需要用到
CMD : 启动这个进程的命令,用于确认这是不是你要找的服务
top
/htop
动态实时监控各个进程的资源占用情况- 关键交互命令(在top运行后操作):
P
: 按CPU使用率排序
M
: 按内存使用率排序
q
:退出
1
: 显示所有CPU核心的详细使用情况 - 测试场景:
做性能测试时,实时观察服务器CPU、内存、负载是否达到瓶颈
发现系统卡顿,快速定位是哪个进程消耗了过的资源htop
:是top的增强班,无需记命令,支持鼠标点击
- 关键交互命令(在top运行后操作):
kill
终止进程- 关键信号:
15
:默认信号。礼貌请求进程终止,运行进程进行清理工作(保存状态、关闭文件)
9
: 强制终止。直接杀死进程,不给任何清理机会,可能导致数据丢失- 使用:
- 关键信号:
# 1. 先用ps找到要杀次的进程的PID,比如是123
ps -ef | grep my-service# 2. 先里面请求退出
ps kill 123# 3. 等待几秒后检查,如果进程还在,再强制杀死
kill -9 123
systemctl
系统服务器管理(守护进程),如启动、停止、重启、设置开机自启等。管理服务器的最佳方式。- 常用命令:
systemctl start
: 启动服务
systemctl stop
: 关闭服务
systemctl restart
: 重启服务。 测试最常用,部署新版本后重启服务
systemctl status
: 查看服务状态。 测试第一命令,看服务器是否正常跑
systemctl enable
: 设置服务开机自启
systemctl disable
: 禁止服务开机自启 - 例子:
- 常用命令:
# 查看Nginx 状态
systemctl status nginx
# 输出会显示 Active: active (running) since... 或者如果失败,会显示详细的错误信息。
# 刚更新了它的配置文件,重启改服务
systemctl restart nginx
df
查看报告文件系统的磁盘使用情况- 关键选项:
-h
: 以易读的单位显示(如G,M)。必须使用这个选项! - 测试场景:
排查"服务器无法写入日志”、“应用无法上传文件”等问题,十有八九就是磁盘满了
检查测试环境的磁盘空间是否充足 - 例子:
- 关键选项:
df -h# 输出示例:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 47G 1.0G 98% /# 可以看出根目录/的使用率98%了
free
查看内存使用- 关键选项:
-h
: 易读单位显示 - 测试场景:
性能测试时,监控内存使用量,判断是否存在内存泄漏
服务器卡顿,快速判断是否内存不足 - 例子: 重点关注available,表示内存大小
- 关键选项:
free -h# 输出示例:
# total used free shared buff/cache available
# Mem: 7.7G 3.2G 1.2G 100M 3.3G 4.0G
# Swap: 2.0G 0B 2.0G
4. 网络操作
ping
: 检查网络连通性- 测试场景:
快速判断测试服务器是否能访问外网
判断与数据库服务器之前是否通畅 - 例子 :
ping www.baidu.com # 测试与百度服务器的连通性,按ctrl+c终止
- 测试场景:
curl
: 命令行HTTP客户端,利用URL语法传输数据。是测试API接口最方便、快速的工具-
关键选项:
-X
:指定请求方法(GET
,POST
,PUT
,DELETE
)
-H
:指定请求头(Header)。Content-Type:所发送数据的格式
-d
:指定请求体(Body),用于POST/PUT等方法(向服务器提交或更新的数据)
-i
:(include)显示响应头(Response Headers)
-s
:静默模式,不显示进度和错误信息(适合用在脚本中) -
测试场景:
快速验证接口是否可达、返回状态码是否正确。无需打开Postman
在CI/CD流水线中,编写Shell脚本进行接口健康检查 -
例子:
-
# 1. 发送GET请求
curl http://localhost:8080/api/users# 2. 发送POST请求,带Content-Type请求头和请求头(传递的数据
curl -X POST http://localhost:8080/api/login -H "Content-Type:application/json" -d '{"username":"testuser", "password": "123456"}'# 3. 显示详细的响应头和信息
curl -i http://localhost:8080/health
# 输出示例:
HTTP/1.1 200 OK <--- 状态行(状态码+信息)
Content-Type: application/json <--- 响应头: body格式是JSON
Content-Length: 25 <--- 响应头: body长度是25字节
Date: Tue, 28 May 2024 02:00:00 GMT <--- 响应头: 服务器时间
Connection: keep-alive <--- 响应头: 保持连接{"status":"UP"} <--- 空行后的内容是响应体(Body)
5. 压缩与解压
tar
打包和解压- 关键选项:
-c
:创建新的归档文件。
-x
:从归档文件中提取文件。
-z
:通过gzip过滤归档(即用gzip压缩或解压)。
-v
:详细地列出处理的文件。
-f
:指定归档文件名。这个选项后面必须立刻跟文件名!c=create创建, x=extract解压, v=verbose显示详情, f=file指定文件名, z=gzip压缩
- 例子:
- 关键选项:
# 1. 打包并压缩:将 /opt/myapp/ 目录打包成 myapp-backup.tar.gz
tar -czvf myapp-backup.tar.gz /opt/myapp/# 2. 解压:将软件包解压到当前目录
tar -xzvf app-release.tar.gz# 3. 仅查看压缩包内容,不解压
tar -tzvf app-release.tar.gz