测试工程师必备数据库知识详解(含重点示例)
1. 数据库基础概念
(1) 数据库类型
类型 | 特点 | 常见数据库 | 适用场景 |
---|---|---|---|
关系型数据库 | 数据以表格形式存储,支持SQL | MySQL, PostgreSQL, Oracle | 需要强一致性的业务(如银行交易) |
非关系型数据库 | 灵活的数据结构(JSON、键值对) | MongoDB, Redis | 高并发、灵活数据(如用户会话、缓存) |
示例:
- 测试电商系统时,订单数据用MySQL(关系型),用户购物车临时数据用Redis(非关系型)。
2. SQL查询核心语法(测试重点)
(1) 基础查询
-- 查询所有用户
SELECT * FROM users;
-- 查询特定条件(如状态为活跃的用户)
SELECT * FROM users WHERE status = 'active';
(2) 多表关联(JOIN)
-- 查询订单及对应的用户信息(内连接)
SELECT orders.id, users.name
FROM orders
INNER JOIN users ON orders.user_id = users.id;
-- 左连接(即使没有匹配也返回左表数据)
SELECT users.name, orders.id
FROM users
LEFT JOIN orders ON users.id = orders.user_id;
(3) 聚合与分组
-- 统计每个用户的订单数量
SELECT user_id, COUNT(*) as order_count
FROM orders
GROUP BY user_id;
-- 检查订单总金额是否超过1000元
SELECT user_id, SUM(amount) as total_amount
FROM orders
GROUP BY user_id
HAVING total_amount > 1000;
(4) 子查询
-- 查询没有下过单的用户
SELECT * FROM users
WHERE id NOT IN (SELECT DISTINCT user_id FROM orders);
3. 数据完整性测试
(1) 主键约束测试
场景:确保用户ID唯一,不能重复插入
-- 测试用例:插入重复ID
INSERT INTO users (id, name) VALUES (1, 'Alice'); -- 成功
INSERT INTO users (id, name) VALUES (1, 'Bob'); -- 应该报错!
(2) 外键约束测试
场景:订单必须关联真实用户
-- 测试用例:插入不存在的user_id
INSERT INTO orders (id, user_id, amount)
VALUES (100, 999, 50.00); -- 应该报错(user_id=999不存在)
(3) NULL约束测试
场景:用户名不能为空
-- 测试用例:插入NULL用户名
INSERT INTO users (id, name) VALUES (2, NULL); -- 应该报错!
4. 数据库性能测试
(1) 检查慢查询
-- 使用EXPLAIN分析查询性能
EXPLAIN SELECT * FROM orders WHERE user_id = 1001;
输出关键指标:
type=ALL
(全表扫描 → 需优化)type=index
(索引扫描 → 高效)
(2) 索引优化
-- 创建索引加速查询
CREATE INDEX idx_user_id ON orders(user_id);
-- 验证索引是否生效
EXPLAIN SELECT * FROM orders WHERE user_id = 1001; -- 应显示"Using index"
5. 自动化测试中的数据库验证
(1) Python + pytest 示例
import pymysql
def test_order_creation():
# 模拟用户下单
ui_add_order(user_id=1, product="Book")
# 数据库断言
conn = pymysql.connect(host="localhost", user="test", password="test", db="shop")
cursor = conn.cursor()
cursor.execute("SELECT COUNT(*) FROM orders WHERE user_id = 1")
result = cursor.fetchone()
assert result[0] == 1, "订单未正确插入数据库!"
(2) Java + JDBC 示例
@Test
public void testUserRegistration() {
// 模拟注册
registerUser("testuser", "password123");
// 数据库断言
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost/shop", "test", "test");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users WHERE username = 'testuser'");
assertTrue(rs.next(), "用户未成功注册!");
}
6. 高频测试场景示例
场景1:电商订单状态流转
-- 下单后状态应为"pending"
SELECT status FROM orders WHERE id = 1001; -- 预期: 'pending'
-- 支付后状态变为"paid"
UPDATE orders SET status = 'paid' WHERE id = 1001;
SELECT status FROM orders WHERE id = 1001; -- 预期: 'paid'
场景2:用户删除级联检查
-- 测试删除用户时,关联订单是否自动删除(需外键设置ON DELETE CASCADE)
DELETE FROM users WHERE id = 1001;
SELECT COUNT(*) FROM orders WHERE user_id = 1001; -- 预期: 0
总结:测试工程师数据库核心能力
技能 | 用途 | 示例 |
---|---|---|
SQL查询 | 验证数据准确性 | SELECT * FROM orders WHERE status = 'paid' |
约束测试 | 保证数据完整性 | 测试主键唯一性、外键关联 |
索引优化 | 提升查询性能 | CREATE INDEX idx_email ON users(email) |
自动化集成 | 在UI/API测试中校验数据库 | Python + pytest 数据库断言 |
学习建议:
- 使用 MySQL Workbench 或 DBeaver 练习SQL
- 在测试环境中模拟数据增删改查
- 结合Postman/Requests发API请求后,直接查库验证