测试工程基础 - 环境与工具基础详解
第一部分:Linux系统操作与Shell脚本
在测试工作中,你接触的软件服务(如Web服务器、数据库、中间件)绝大多数都运行在Linux服务器上。因此,与Linux服务器打交道是测试工程师的必备技能。
第1章 为什么测试工程师要学习Linux?
1. 服务端环境:公司的测试环境、预发布环境、生产环境,几乎都是Linux系统(如CentOS, Ubuntu)。
2. 查看日志:当系统出现问题时,你需要登录到Linux服务器上查看应用日志、系统日志来定位问题。
3. 环境部署与维护:需要懂得基本的命令来启动/停止服务、检查进程状态、修改配置文件等。
4. 性能监控:需要使用命令来监控服务器的CPU、内存、磁盘和网络状态。
小白理解:如果把软件比作一辆车,那么Linux就是这辆车运行的公路系统。你需要学会在公路上检查车况、处理故障。
第2章 Linux基础入门
2.1 连接Linux服务器
你通常不会直接坐在Linux服务器的显示器前操作,而是通过一个终端工具远程连接到服务器。最常用的协议是SSH。
· 工具推荐:
· Windows:PuTTY, Xshell, MobaXterm,或Windows Terminal。
· macOS/Linux:直接使用系统自带的Terminal终端,通过 ssh 命令连接。
· 连接命令示例:
```bash
ssh username@server_ip_address
# 例如:ssh tester@192.168.1.100
```
然后输入密码,即可登录。
2.2 Linux目录结构
登录后,你看到的是一个命令行界面。首先要理解Linux的目录结构,它像一个倒置的大树。
· /:根目录,所有目录的起点。
· /home:普通用户的家目录。你登录后一般会在这个目录下你自己的文件夹里,如 /home/tester。
· /root:系统管理员(root用户)的家目录。
· /etc:存放系统的配置文件。
· /var:存放经常变化的文件,如日志文件 (/var/log)。
· /usr:存放用户安装的应用程序和文件。
· /tmp:临时文件目录。
重要概念:绝对路径和相对路径。
· 绝对路径:从根目录 / 开始的完整路径,如 /home/tester/documents/file.txt。
· 相对路径:从当前所在目录开始的路径。例如,当前在 /home/tester,那么 documents/file.txt 就是相对路径。
第3章 Linux核心命令大全(测试工程师视角)
以下命令是测试工作中每天都会用到的,请务必熟练掌握。
3.1 文件与目录操作
```bash
# 查看当前所在目录
pwd
# 列出当前目录下的文件和子目录
ls
ls -l # 以详细信息方式列出(显示权限、大小、时间)
ls -la # 列出所有文件(包括隐藏文件)
# 切换目录
cd /home/tester # 切换到绝对路径
cd documents # 切换到当前目录下的documents子目录(相对路径)
cd .. # 切换到上一级目录
cd ~ # 切换到当前用户的家目录
cd - # 切换到上一个所在的目录
# 创建目录
mkdir test_dir # 创建名为test_dir的目录
mkdir -p parent/child # 递归创建多级目录
# 删除文件或目录
rm file.txt # 删除文件
rm -r directory_name # 递归删除目录及其内部所有内容(慎用!)
rm -rf directory_name # 强制递归删除,不提示(非常危险!慎用!)
# 复制文件或目录
cp file1.txt file2.txt # 复制file1.txt为file2.txt
cp file.txt /tmp/ # 复制文件到/tmp目录下
cp -r dir1 dir2 # 递归复制整个目录
# 移动或重命名文件/目录
mv old_name.txt new_name.txt # 重命名
mv file.txt /home/tester/ # 移动文件
# 查看文件内容
cat file.txt # 一次性显示整个文件内容(适合小文件)
less file.txt # 分页显示文件内容(可上下滚动,按 'q' 退出)
head -n 10 file.txt # 查看文件开头10行
tail -n 10 file.txt # 查看文件末尾10行
tail -f app.log # 实时追踪日志文件的更新(查看滚动的日志,极其常用!)
# 查找文件
find /home -name "*.log" # 在/home目录下查找所有.log结尾的文件
find /var/log -mtime -1 # 在/var/log目录下查找1天内修改过的文件
# 查找文件内容(grep命令 - 超级重要!)
grep "ERROR" app.log # 在app.log文件中查找包含"ERROR"的行
grep -r "NullPointerException" /var/log/ # 递归地在/var/log目录下所有文件中查找
cat app.log | grep "ERROR" | head -5 # 组合命令:先看app.log,然后过滤ERROR,再取前5行
```
3.2 系统管理与进程操作
```bash
# 查看系统进程
ps aux # 查看所有正在运行的进程
ps aux | grep java # 查找与java相关的进程
# 动态查看系统资源(类似Windows的任务管理器)
top
htop (如果系统安装了)
# 杀死进程
kill 1234 # 杀死进程ID为1234的进程
kill -9 1234 # 强制杀死进程(当普通kill无效时)
# 查看网络状态
netstat -tulpn # 查看所有监听的端口和对应的进程
ping google.com # 测试网络连通性
# 查看磁盘使用情况
df -h # 查看磁盘空间使用情况(人类可读的格式)
du -sh /home/tester # 查看指定目录的大小
```
3.3 文件权限与压缩
```bash
# 查看文件权限
ls -l file.txt
# 输出:-rw-r--r-- 1 tester users 1234 Oct 14 10:00 file.txt
# 第一个字符‘-’表示是文件,‘d’表示目录。
# 后面9个字符每3个一组,分别代表:文件所有者(u)、所属组(g)、其他人(o)的权限。
# r=读, w=写, x=执行。
# 修改文件权限
chmod 755 script.sh # 给script.sh设置权限:rwxr-xr-x
chmod +x script.sh # 给script.sh增加可执行权限
# 压缩与解压
tar -czf archive.tar.gz /path/to/dir # 将目录压缩为.tar.gz文件
tar -xzf archive.tar.gz # 解压.tar.gz文件
zip -r archive.zip /path/to/dir # 压缩为zip格式
unzip archive.zip # 解压zip文件
```
第4章 Shell脚本基础
Shell脚本就是将一系列Linux命令写在一个文件里,然后一次性执行。它可以自动化重复的任务。
4.1 第一个Shell脚本
1. 创建一个新文件,命名为 hello.sh。
2. 在文件里输入以下内容:
```bash
#!/bin/bash
# 这是一个注释
echo "Hello, World!" # 打印Hello, World!
echo "当前时间是:$(date)" # 打印当前时间
```
3. 给脚本添加执行权限:chmod +x hello.sh
4. 运行脚本:./hello.sh
4.2 脚本中的变量与流程控制
```bash
#!/bin/bash
# 定义变量(等号两边不能有空格!)
NAME="Tester"
COUNT=10
# 使用变量
echo "我的名字是:$NAME"
# 读取用户输入
echo "请输入你的年龄:"
read AGE
echo "你的年龄是:$AGE"
# 条件判断
if [ $AGE -gt 18 ]; then
echo "你已经是成年人了。"
else
echo "你还是个未成年人。"
fi
# 循环
for i in {1..5}; do
echo "这是第 $i 次循环"
done
# 使用命令行参数
# 运行脚本时:./script.sh arg1 arg2
echo "第一个参数是:$1"
echo "第二个参数是:$2"
```
测试场景联想:
· 写一个脚本,每天凌晨自动备份测试数据库。
· 写一个脚本,自动登录测试服务器,拉取最新的日志并搜索错误信息。
· 写一个脚本,一键启动/停止复杂的测试环境。
---
第二部分:MySQL数据库操作
绝大多数软件系统都使用数据库来持久化存储数据。测试工程师需要验证数据是否正确写入、更新或删除,也需要准备测试数据。
第5章 数据库与SQL基础
5.1 为什么测试要懂数据库?
1. 数据校验:在前端操作后,需要到数据库验证数据是否按预期存储。
2. 数据准备:构造一些难以通过前端创建的测试数据(如特定状态的数据)。
3. 问题定位:当出现Bug时,可以通过查询数据库来判断是前端问题、后端逻辑问题还是数据库本身的问题。
4. 理解业务:数据库的表结构往往直接反映了业务的核心逻辑。
核心概念:
· 数据库:一个数据仓库,里面有很多表。
· 表:类似于Excel表格,有行和列。
· 列:表的字段,定义了数据的类型(如 username, email)。
· 行:表的一条记录。
· SQL:用于管理和操作数据库的标准语言。
第6章 MySQL核心SQL命令
我们将通过一个典型的 users 用户表来学习。假设表结构如下:
· id (INT, 主键)
· username (VARCHAR)
· email (VARCHAR)
· age (INT)
· created_at (DATETIME)
6.1 连接MySQL数据库
```bash
# 在命令行连接
mysql -u username -p -h host_address database_name
# 例如:mysql -u tester -p -h 192.168.1.101 test_db
# 然后会提示你输入密码
```
6.2 增删改查
查 - SELECT(最最常用)
```sql
-- 查询users表的所有数据的所有字段
SELECT * FROM users;
-- 只查询特定的字段
SELECT id, username, email FROM users;
-- 带条件的查询 (WHERE子句)
SELECT * FROM users WHERE age > 18;
SELECT * FROM users WHERE username = 'alice';
SELECT * FROM users WHERE age BETWEEN 20 AND 30;
-- 模糊查询 (LIKE)
SELECT * FROM users WHERE username LIKE 'a%'; -- 查找以'a'开头的用户名
-- 排序 (ORDER BY)
SELECT * FROM users ORDER BY age DESC; -- 按年龄降序排列
SELECT * FROM users ORDER BY created_at ASC; -- 按创建时间升序排列
-- 限制返回条数 (LIMIT)
SELECT * FROM users LIMIT 10; -- 只返回前10条
SELECT * FROM users LIMIT 5, 10; -- 从第5条开始,返回10条(即第6-15条)
-- 去重查询 (DISTINCT)
SELECT DISTINCT age FROM users;
```
增 - INSERT
```sql
-- 插入一条完整的记录(所有字段都提供值)
INSERT INTO users VALUES (NULL, 'bob', 'bob@example.com', 25, NOW());
-- 插入一条记录,只提供部分字段的值(更安全、更常用的方式)
INSERT INTO users (username, email, age) VALUES ('charlie', 'charlie@example.com', 30);
```
改 - UPDATE
```sql
-- 更新数据 (一定要加WHERE条件,否则会更新整个表!)
UPDATE users SET age = 26 WHERE username = 'bob';
UPDATE users SET email = 'new_email@example.com', age = 31 WHERE id = 5;
```
删 - DELETE
```sql
-- 删除数据 (一定要加WHERE条件,否则会清空整个表!)
DELETE FROM users WHERE id = 10;
DELETE FROM users WHERE username = 'test_user';
```
6.3 高级查询
```sql
-- 聚合函数
SELECT COUNT(*) FROM users; -- 统计总用户数
SELECT MAX(age) FROM users; -- 最大年龄
SELECT AVG(age) FROM users; -- 平均年龄
-- 分组查询 (GROUP BY)
SELECT age, COUNT(*) FROM users GROUP BY age; -- 统计每个年龄的用户数量
-- 表连接 (JOIN) - 如果还有一张 orders 表,通过 user_id 关联
SELECT u.username, o.order_id, o.amount
FROM users u
JOIN orders o ON u.id = o.user_id;
```
6.4 数据导入与导出
```bash
# 导出整个数据库(备份)
mysqldump -u username -p database_name > backup.sql
# 导入SQL文件(恢复)
mysql -u username -p database_name < backup.sql
```
测试场景实战:
· 场景1:测试用户注册功能。在前端注册一个用户后,立刻到数据库执行 SELECT * FROM users WHERE username='新用户名'; 来验证数据是否正确插入。
· 场景2:测试一个需要“已充值”状态用户才能访问的功能。你可以直接在数据库里执行 UPDATE users SET balance=100 WHERE username='testuser'; 来快速构造测试数据。
· 场景3:一个订单列表不显示某些订单。你可以通过 SELECT 和 JOIN 查询,检查这些订单在数据库中的状态是否正确。
---
第三部分:Git版本控制
在现代软件开发中,多人协作是常态。Git是目前最流行的分布式版本控制系统,它可以帮助团队高效地管理代码和文档的变更。
第7章 Git的核心概念
7.1 为什么要用Git?
· 版本记录:保存每一次文件的修改记录,可以随时回滚到任何一个历史版本。
· 分支管理:可以创建不同的“分支”来开发新功能或修复Bug,而不会影响主线的稳定。
· 团队协作:多人可以同时工作在同一个项目上,然后合并彼此的修改。
· 备份:代码仓库通常存储在远程服务器(如GitHub, GitLab)上,相当于一个备份。
核心概念理解:
· 仓库:一个被Git管理的文件夹。
· 工作区:你电脑上能看到和编辑的文件。
· 暂存区:一个中间区域,临时存放你打算提交的更改。
· 提交:将暂存区的更改正式保存到仓库的历史记录中,形成一个版本。
· 分支:一条独立的时间线,你可以在分支上工作而不影响主线(master/main分支)。
· 远程仓库:存储在服务器上的仓库,用于团队共享和协作。
第8章 Git日常使用命令
8.1 本地仓库操作
```bash
# 初始化一个新的Git仓库
git init
# 克隆一个已存在的远程仓库(最常用的起步方式)
git clone https://github.com/username/project.git
# 查看当前文件状态(哪些文件被修改了,哪些已暂存)
git status
# 将文件的修改添加到暂存区
git add file.txt # 添加单个文件
git add . # 添加所有当前目录下的修改
# 提交更改到本地仓库
git commit -m "这里写本次提交的说明,要清晰明了"
# 查看提交历史
git log
git log --oneline # 简洁模式查看历史
```
8.2 远程仓库与协作
```bash
# 将本地提交推送到远程仓库
git push origin main # 推送到main分支
# 从远程仓库拉取最新代码
git pull origin main
# 查看远程仓库地址
git remote -v
```
8.3 分支管理
```bash
# 查看所有分支
git branch
# 创建新分支
git branch new_feature
# 切换分支
git checkout new_feature
# 或者 (更新版的命令)
git switch new_feature
# 创建并切换到新分支
git checkout -b new_feature
# 或者
git switch -c new_feature
# 合并分支 (例如,将new_feature分支合并到当前所在的主分支)
git merge new_feature
# 删除分支
git branch -d new_feature
```
8.4 解决冲突
当多个人修改了同一文件的同一部分时,在git pull 或 git merge 时就会产生冲突。
1. Git会标记出文件中有冲突的地方:
```
<<<<<<< HEAD
这是你本地的修改
=======
这是远程的修改
>>>>>>> branch_name
```
2. 你需要手动编辑这个文件,决定保留哪一部分(或者都保留),并删除 <<<<<<<, =======, >>>>>>> 这些标记。
3. 然后执行 git add 文件名 和 git commit 来完成合并。
第9章 Git在测试工作中的工作流
典型场景:你负责维护一个UI自动化测试脚本项目。
1. 第一天,获取代码:
```bash
git clone https://gitlab.company.com/qa/auto-test.git
cd auto-test
```
2. 开始一个新功能的测试脚本开发:
```bash
git checkout -b feature/login_test # 为‘登录测试’功能创建一个新分支
```
3. 日常开发与提交:
```bash
# ... 你编写了 login_test.py ...
git add .
git commit -m "新增用户登录功能的UI自动化测试用例"
git push origin feature/login_test # 将分支推送到远程,备份并共享
```
4. 功能完成,合并到主线:
· 在GitLab/GitHub上创建一个 Pull Request。
· 请你的同事代码评审。
· 评审通过后,将 feature/login_test 分支合并到 main 分支。
5. 同步最新代码:
```bash
git checkout main # 切换回主分支
git pull origin main # 拉取最新的代码(包含所有同事的提交)
```
最佳实践:
· 提交信息清晰:每次提交的说明都要能清晰地描述这次修改的目的。
· 频繁提交:将大任务拆分成小任务,每完成一个小任务就提交一次。
· 多使用分支:任何新的开发或Bug修复都应该在新的分支上进行,保持主分支的稳定。
· 先拉后推:在 git push 之前,先执行 git pull 来同步他人的修改,避免冲突。
---
总结与学习建议
环境与工具基础这一部分,为你搭建了一个专业的测试工作台:
· Linux是你与服务器交互的工作界面。
· MySQL是你窥探和数据校验的透视镜。
· Git是你与团队协同工作的时间机器和协作平台。
给小白的学习建议:
1. 搭建自己的实验环境:在个人电脑上安装虚拟机(如VirtualBox)并安装一个Linux系统(如Ubuntu Desktop),这是最好的练习方式。
2. 命令死记硬背不如常用:不要试图记住所有命令的参数。记住最常用的,其他的用到的时候再查。动手实践是唯一途径。
3. 给自己设定小任务:
· 在Linux上安装一个MySQL,并练习SQL。
· 在GitHub上注册账号,创建一个仓库,练习 clone, add, commit, push 的完整流程。
4. 联想测试场景:每学一个命令或工具,都思考一下“我在测试中什么时候会用到它?”,这样学习会更有目的性和趣味性。
你已经拥有了一个测试工程师的“工具箱”。在接下来的课程中,你将学会如何运用这些工具,去完成真正的测试任务。

