软件测试从入门到精通 · 第26篇
很多测试新人在面试时会被问到一个问题:“你会Linux吗?”
有人回答:“会一点,会看日志。”面试官追问:“怎么看一个10GB的日志文件中某个关键字出现了多少次?”很多人就答不上来了。
在互联网公司中,90%以上的服务端应用跑在Linux上。不管你做功能测试、接口测试还是性能测试,如果不会基本的Linux操作,排查问题会非常受限。
但这并不意味着你需要成为一个Linux运维专家。对测试工程师来说,Linux的学习目标是掌握日常工作最常用的命令和操作思路。这篇文章就聚焦于测试工作中真正用得到的Linux知识。读完本文,你将能够独立登录服务器、查看日志分析问题、部署测试环境、编写简单的自动化脚本。
测试工程师接触Linux的典型场景:
查看日志定位问题:测试环境报错了,查看报错日志。
部署测试环境:新版本需要重新部署war包或jar包。
验证数据:想知道数据库里到底有没有这条记录。
性能测试:压测时需要查看服务器的CPU、内存、磁盘。
环境问题排查:测试环境起不来,需要看进程是否在运行、端口是否被占用。
Docker容器管理:测试环境部署在容器中,需要查看容器状态、重启容器、查看容器日志。
文件传输:从本地上传测试包到服务器,或从服务器下载日志文件。
这些场景都不需要深入的Linux知识,但必须会基础操作。
一、连接Linux服务器
Linux服务器通常没有图形界面,所有操作都通过终端完成。第一步就是用 SSH(Secure Shell)协议远程登录到服务器。
SSH连接
SSH是远程连接Linux服务器的标准协议,加密传输,比Telnet等明文协议安全得多。连接时需要提供服务器的IP地址、用户名和密码或密钥。
# 基本格式ssh user@host# 示例:用密码登录ssh root@192.168.1.100# 首次连接会出现确认提示“The authenticity of host...can't be established”# 输入yes确认即可,断开连接输入exit或按Ctrl+D# 使用密钥登录(推荐,无需每次输密码)ssh -i ~/.ssh/id_rsa root@192.168.1.100# 设置密钥登录(一次配置,后续免密)ssh-copy-id root@192.168.1.100 # 将本机公钥传到服务器
如果经常连接多台服务器,每次都输完整的ssh user@ip很麻烦。推荐配置~/.ssh/config文件,用简短别名代替IP,也可以在配置中指定密钥文件和端口:
# ~/.ssh/config示例Host test-server # 别名,之后直接用ssh test-server HostName 192.168.1.100 # 实际IP地址 User root # 登录用户名 Port 22 # SSH端口(默认22) IdentityFile ~/.ssh/id_rsa # 使用的私钥文件# 配置后只需输入简短别名即可连接ssh test-server
文件传输(SCP)
连接服务器后,经常需要将本地的测试包或数据文件上传到服务器,或者把服务器的日志文件下载到本地做分析。scp命令基于SSH协议,安全可靠:
# 本地上传到服务器scp app.jar root@192.168.1.100:/home/deploy/# 从服务器下载到本地scp root@192.168.1.100:/home/logs/app.log ./app.log# 递归传输整个目录(上传多个文件时常用)scp -r testdata/ root@192.168.1.100:/home/testdata/
常用SSH客户端
如果不想用命令行,也可以使用图形化的SSH客户端,对于Windows用户尤其方便:
Xshell(Windows):功能强大,国产企业常用。
SecureCRT(Windows/Mac):老牌工具。
Termius(全平台):界面美观,支持移动端。
Windows Terminal+SSH(Windows):免费、轻量。
iTerm2(Mac):Mac用户首选。
二、核心命令分类精讲
Linux有数百个命令,但测试工程师日常用到的不超过20个。下面按使用场景分类讲解,每个命令都会说明什么时候用和为什么要这样用。
2.1 目录和文件操作
这是进入Linux世界的第一步,你需要知道自己在哪个目录、目录里有什么文件、如何创建和删除文件。这些命令和Windows的文件管理器做的事情本质上一样,只是没有图形界面。
# 查看当前目录pwd # 输出:/home/testuser # 不知道自己在哪里时,先敲pwd# 切换目录cd /usr/local # 进入指定目录cd .. # 返回上一级cd ~ # 返回home目录cd - # 返回上一次所在的目录(非常常用!)# 列出文件ls # 列出当前目录文件ls -l # 详细信息(权限、大小、时间)ls -la # 包括隐藏文件ls -lh # 人类可读的大小(KB/MB/GB)ls -lt # 按修改时间排序(最新的在最前)# 创建目录mkdir test # 创建test目录mkdir -p a/b/c # 递归创建多层目录# 创建文件touch test.log # 创建空文件# 复制cp file1 file2 # 复制文件cp -r dir1 dir2 # 递归复制目录# 移动/重命名mv old.txt new.txt # 重命名mv file.txt /tmp/ # 移动到/tmp# 删除(慎用!)rm file.txt # 删除文件rm -rf directory/ # 强制递归删除目录--高危操作!
2.2 文件查看命令
这是测试工程师使用频率最高的命令集。你登录服务器的首要任务通常是查看日志文件。日志文件可能很大(GB级别),用对了工具才能快速找到想要的条目。
# cat-查看小文件全部内容cat application.properties # 查看配置文件(只适合几十行的小文件)# less-分页查看大文件(推荐!)less app.log # 打开大日志文件,可以上下翻页,不会卡死# 进入less后的操作:# 空格键→翻到下一页# b,翻回上一页# /关键字,搜索关键词(按n跳到下一个匹配,N跳到上一个)# q,退出# G,跳到最后一行(看最新的日志)# g,跳到第一行# head-查看文件头部head -n 20 app.log # 只看前20行,适合看日志格式、表头# tail-查看文件尾部(最常用!)tail -f app.log # 实时监控日志输出(Ctrl+C退出) # 部署完重启服务后,用这个看日志有没有滚动tail -n 100 app.log # 看最后100行,适合刚登录时快速扫一眼tail -f app.log | grep ERROR # 实时监控中只显示错误日志(组合技!)
2.3 日志查看三大核心命令
测试工程师看日志,90%的情况用这三个命令的组合就能搞定:
grep:根据关键词过滤行。
awk:按列截取数据。
sort/uniq:排序和去重统计。
# grep-文本搜索(日志分析中最常用的命令)grep "ERROR" app.log # 最基本的用法:搜索包含ERROR的行grep -i "error" app.log # 忽略大小写,匹配ERROR/error/Errorgrep -n "ERROR" app.log # 显示行号,方便定位代码grep -C 5 "ERROR" app.log # 显示匹配行前后各5行,看错误上下文grep "$(date +%Y-%m-%d)" app.log | grep "ERROR" # 组合搜索:先筛当天的,再筛错误的grep -c "ERROR" app.log # 统计出现次数(不列出内容,只输出数字)grep -v "DEBUG" app.log # 反向匹配——排除DEBUG行,只看其他级别# awk-文本处理(按列提取数据)awk '{print $1, $4}' app.log # 打印第1列和第4列,默认空格分隔awk -F',' '{print $2}' data.csv # 以逗号分隔,取第2列(处理CSV)# 实际组合:统计日志中每个接口的调用次数grep "API调用" app.log | awk '{print $5}' | sort | uniq -c | sort -rn
实战场景
用户反馈下单失败,你登录测试服务器:
# 1.先看最新日志tail -f /home/logs/app.log# 2.搜索用户的订单号grep "ORDER20240520001" /home/logs/app.log# 3.查看这个订单相关的错误日志grep "ORDER20240520001" /home/logs/app.log | grep -i "error\|exception\|fail"# 4.看错误周围的上下文grep -C 10 "ORDER20240520001" /home/logs/app.log | grep -A 5 "ERROR"# 5.统计这个错误出现了多少次grep -c "NullPointerException" /home/logs/app.log
2.4 权限管理
Linux使用权限系统控制谁能读、写、执行文件。测试过程中,你常会遇到Permission denied错误,这时就需要检查文件权限。权限分为三组:文件所有者(user)、同组用户(group)、其他用户(others),每组可以是r(读)、w(写)、x(执行)的组合。
# 查看权限ls -l # 输出示例:-rw-r--r-- 1 root root 1024 May 20 10:00 file.txt # rw- (所有者可读写) r-- (同组只读) r-- (其他人只读) # 第一个字符:-普通文件,d目录# 修改权限chmod 755 script.sh # 所有者rwx,同组r-x,其他人r-xchmod +x script.sh # 加执行权限,Shell脚本部署后经常需要这步# 数字权限速查:# 7 = rwx (读+写+执行)# 5 = r-x (读+执行)# 4 = r-- (只读)# 常用:755 (可执行文件) /644 (普通文件)
2.5 进程管理
测试环境出问题时,第一步往往是看服务进程是否还活着。进程就是正在运行的程序,每个进程有一个唯一的PID(进程ID)。ps查看当前系统上有哪些进程,top像任务管理器一样实时监控资源占用。
# 查看进程ps -ef | grep java # 列出所有Java进程(管道符+grep过滤)ps -ef | grep nginx # 查看nginx进程是否在运行# 实时进程监控top # 类似任务管理器,按CPU或内存排序# top界面中:# PID,进程ID# %CPU,CPU占用率(过高说明有性能问题)# %MEM,内存占用率# 按q退出# 杀掉进程kill 12345 # 发送SIGTERM信号,让进程自行清理后退出kill -9 12345 # 发送SIGKILL信号,强制杀掉——注意这不会给进程善后的机会
2.6 网络相关
测试环境部署完成后,你需要验证服务端口是否已经启动,或者排查端口被占用的原因。以下命令覆盖了测试中最常见的网络排查场景。
# 查看端口占用(哪个进程在监听这个端口?)netstat -tlnp | grep 8080 # 查看8080端口被哪个进程占用(需sudo)netstat -anp | grep 3306 # 查看MySQL端口所有连接(需sudo)ss -tlnp | grep 8080 # 替代netstat,无root也可查看端口监听状态# 测试端口是否通(验证服务是否可访问)telnet 192.168.1.100 8080 # 测试能否连上(如无telnet可用nc)nc -zv 192.168.1.100 8080 # telnet的现代替代命令curl http://localhost:8080/health # 测试HTTP接口是否返回正常# 查看IPip addr # 查看本机IP(推荐)ifconfig # 旧命令,部分系统需安装net-tools
2.7 磁盘和内存
压测时要关注服务器资源情况。磁盘满了日志写不进去、内存不够导致OOM被杀,都是测试中常见的问题。
# 磁盘空间df -h # 查看磁盘使用情况(重点看Use%列,超过80%需要关注)du -sh /home/logs/ # 查看某个目录的大小,找出占用空间最大的目录# 内存free -h # 查看内存使用情况# 关注available列:实际可用内存(不是free列)# available=free+可回收的缓存,这才是真正能用的内存
2.8 服务管理(systemctl)
现代Linux用systemd管理系统的各种后台服务。相比手动kill PID+nohup ... &,systemctl提供了标准化的服务管理方式,启动、停止、查看状态都可以一键完成。
# 查看服务状态systemctl status nginx # 查看nginx是否在运行、有无错误日志systemctl status docker # 查看docker服务状态# 启动/停止/重启服务sudo systemctl start nginx # 启动nginxsudo systemctl stop nginx # 停止nginxsudo systemctl restart nginx # 重启nginx(修改配置后常用)# 设置开机自启sudo systemctl enable nginx # 启用开机自动启动sudo systemctl disable nginx # 取消开机自启# 查看系统日志journalctl -u nginx # 查看nginx的系统日志(包含启动失败的原因)journalctl -u nginx --since "1 hour ago" # 只看最近1小时的日志journalctl -f # 实时监控系统日志(类似tail -f)
2.9 压缩与解压
拿到测试包后第一件事通常是解压,或者在部署前需要先压缩再传输。tar和zip是最常见的两种格式。
# tar.gz(Linux上最常见的压缩格式)tar -xzf app.tar.gz # 解压(x=解压,z=gzip,f=文件)tar -czf app.tar.gz /home/deploy/ # 压缩(c=创建压缩包)# zip(Windows和Linux通用的格式)unzip app.zip # 解压zip -r app.zip /home/deploy/ # 压缩(-r递归,包含子目录)# 查看压缩包内容(不解压)tar -tzf app.tar.gz # 列出tar.gz中的文件列表unzip -l app.zip # 列出zip中的文件列表
三、环境部署基础
测试工程师经常需要自己部署测试环境。新版本打好了包,你需要上传到服务器、停旧服务、备份、启动新版本。下面是最常用的几种部署场景。
3.1 部署Java应用
Java后端服务通常打包为.jar(Spring Boot微服务)或.war(传统Web应用)。部署步骤一般是:上传→停旧→备份→启动。其中nohup保证终端关闭后进程继续运行,2>&1将错误输出也重定向到日志文件方便排查。
# 1.上传jar包到服务器scp app.jar root@192.168.1.100:/home/deploy/# 2.停止旧服务ps -ef | grep app.jar # 先找到旧进程的PID。kill <PID> # 发送终止信号。# 3.备份旧版本(保留一个历史版本,方便回滚)mv app.jar app.jar.bak.$(date +%Y%m%d)# 注意:若同一天重复部署,备份文件会重名覆盖;需要保留多份时可加时分秒# mv app.jar app.jar.bak.$(date +%Y%m%d%H%M%S)# 4.启动新版本nohup java -jar app.jar --spring.profiles.active=test > app.log 2>&1 &# 参数说明:# nohup:即使关闭终端窗口,进程也不退出。# > app.log:把原本输出到屏幕的信息写入app.log文件。# 2>&1:把错误信息(stderr)也写入同一个日志文件。# &:放到后台运行,不占用当前终端。
3.2 使用systemctl管理服务
如果应用已经注册为系统服务(通过systemd管理),用systemctl来管理比手动kill+nohup更规范。它能一键启停、查看运行状态,而且系统重启后可以自动拉起服务。
# 启动/停止/重启sudo systemctl start myappsudo systemctl stop myappsudo systemctl restart myapp# 查看运行状态(含最近日志)systemctl status myapp# 设置开机自启sudo systemctl enable myapp
3.3 使用Docker部署
越来越多的项目使用容器化部署。Docker将应用和依赖打包在一起,部署时只需要拉取镜像、启动容器,不需要手动配置JDK版本、环境变量等。对测试人员来说,最基本的操作是查看容器状态、重启容器和查看容器日志。
# 查看容器状态docker ps # 查看当前运行中的容器docker ps -a # 查看所有容器(含已停止的)# 管理容器生命周期docker start <容器名>docker stop <容器名>docker restart <容器名># 查看容器日志docker logs -f <容器名> # 类似tail -f,实时跟踪容器输出# 使用docker-compose部署整套环境docker-compose up -d # 后台启动所有服务docker-compose down # 停止并移除所有服务docker-compose logs -f # 查看所有服务的合并日志
docker-compose(V1)是独立安装的旧命令。
新版Docker内置docker compose(V2)。
二者参数相同,V2无需单独安装compose插件。
3.4 环境变量管理
应用启动时通常需要读取环境变量来配置数据库地址、密钥、运行模式等。部署或调试时,你可能需要查看当前环境变量、临时修改或永久写入配置。
# 查看环境变量echo $JAVA_HOME # 查看单个变量的值env | grep JAVA # 搜索所有包含JAVA的环境变量# 临时设置(仅当前终端会话有效,关闭终端后失效)export JAVA_HOME=/usr/lib/jvm/java-11# 永久设置(写入用户配置文件,每次登录自动生效)echo 'export JAVA_HOME=/usr/lib/jvm/java-11' >> ~/.bashrcsource ~/.bashrc # 使配置立即生效,不用重新登录
3.5 查看服务状态
部署完成后,需要通过以下步骤逐一确认服务是否正常启动:
# 1.确认进程在运行ps -ef | grep app.jar# 2.查看日志确认启动成功(Spring Boot启动完成会输出Started)tail -f app.log | grep "Started"# 3.检查端口是否在监听netstat -tlnp | grep 8080# 4.用curl测试接口是否正常响应curl http://localhost:8080/api/health
四、Shell脚本入门
当你需要重复执行一组Linux命令时(比如每天部署测试环境),把它们写成一个Shell脚本,就可以一次编写、反复使用。Shell脚本本质上就是把多条命令按顺序写到一个.sh文件里,加上变量、条件判断等控制逻辑。
4.1 第一个脚本
#!/bin/bash# 文件名:deploy.sh# 功能:一键部署测试环境echo "=== 开始部署 ==="# 停止旧服务echo "停止旧服务..."PID=$(ps -ef | grep app.jar | grep -v grep | awk '{print $2}')if [ -n "$PID" ]; then kill $PID echo "已停止旧服务"fi# 备份echo "备份旧版本..."mv /home/deploy/app.jar /home/deploy/backup/app.jar.$(date +%Y%m%d)# 启动新版本echo "启动新版本..."nohup java -jar /home/deploy/app.jar > /home/logs/app.log 2>&1 &echo "=== 部署完成,请检查日志 ==="
使用脚本:
chmod +x deploy.sh # 给脚本添加执行权限(只需一次)./deploy.sh # 执行脚本bash deploy.sh # 也可用bash执行(无需执行权限)bash -x deploy.sh # 调试模式,逐行打印执行过程
变量引用加双引号("$LOG_FILE"),避免文件名含空格时脚本出错。
调试脚本用bash -x script.sh,可以逐行打印执行过程,快速定位问题。
第一行#!/bin/bash告诉系统用哪个解释器来执行脚本。
4.2 常用脚本:日志分析
这个脚本自动统计当天的错误日志,输出ERROR总数、异常类型分布和最近10条错误。适合每天早上跑一遍,快速掌握测试环境的运行状态。
#!/bin/bash# 文件名:check_error.sh# 功能:统计当天错误日志LOG_FILE="/home/logs/app.log"TODAY=$(date +%Y-%m-%d)echo "=== ${TODAY} 错误日志统计 ==="# 统计各种错误类型echo "ERROR总数:"grep "$TODAY" "$LOG_FILE" | grep -c "ERROR"echo ""echo "异常统计:"grep "$TODAY" "$LOG_FILE" | grep "Exception" | awk -F':' '{print $NF}' | sort | uniq -c | sort -rnecho ""echo "最近10条ERROR:"grep "$TODAY" "$LOG_FILE" | grep "ERROR" | tail -10
4.3 定时任务(crontab)
测试环境中经常需要定时执行任务:每天凌晨清理过期日志、每小时检查服务健康状态、每周末备份数据。crontab是Linux内置的定时任务工具,格式为“分 时 日 月 周 命令”,用*表示“每”。
# 编辑当前用户的定时任务crontab -e# 五个时间字段的含义:# ┌─ 分钟 (0-59)# │ ┌─ 小时 (0-23)# │ │ ┌─ 日 (1-31)# │ │ │ ┌─ 月 (1-12)# │ │ │ │ ┌─ 星期 (0-7, 0和7都表示周日)# * * * * * 命令# 示例:每天凌晨3点清理一周前的日志0 3 * * * /home/scripts/clean_logs.sh# 示例:每小时执行一次健康检查0 * * * * /home/scripts/health_check.sh# 示例:每天早8点到晚8点,每30分钟检查一次*/30 8-20 * * * /home/scripts/check.sh# 查看当前已有的定时任务列表crontab -l
五、vim基础操作
服务器上没有图形界面,修改配置文件只能用vim。vim有两种常用模式:普通模式(默认,按键盘触发命令)和编辑模式(按i进入,此时可以输入文字)。不需要成为vim高手,会以下操作就能应付日常工作:
vim文件名 # 用vim打开文件(如果文件不存在则新建)按i键 # 进入编辑模式,此时可以输入文字编辑内容... # 随意修改文件内容按Esc键 # 退出编辑模式,回到普通模式:w # 保存文件(write):q # 退出vim(quit):wq # 保存并退出:q! # 不保存,强制退出(修改了但不想保存时用)/关键字 # 在文件中搜索指定文字(按n跳到下一个,N跳到上一个):%s/旧文本/新文本/g # 全局替换。把文件中所有旧文本替换为新文本dd # 删除光标所在的当前行yy # 复制当前行p # 粘贴到光标后面u # 撤销上一步操作gg # 跳到文件第一行Shift+G # 跳到文件最后一行:set number # 显示行号,方便定位# 如果按了Ctrl+S导致键盘无响应,按Ctrl+Q解除冻结# (不少新手误按Ctrl+S以为vim卡死了,其实只是终端暂停了输出)
六、测试工程师Linux能力CheckList
必须掌握:
加分项:
修改权限(chmod)
压缩解压(tar/zip)
服务管理(systemctl)
Docker容器管理
环境变量配置(export/env)
磁盘内存查看(df/free)
写简单的Shell脚本
定时任务(crontab)
写在最后
Linux对测试工程师来说,不是加分项,而是必备技能。你不需要成为运维专家,但要能做到独立登录服务器、找到日志、分析问题、重启服务。这能帮助你在工作中减少对他人的依赖,独立定位和解决问题。
下一篇,我们学习Git——代码版本管理的入门到测试日常使用。
本文为《软件测试从入门到精通》系列第26篇,本系列持续更新中。