前言
数据库在软件测试面试中基本属于必考内容,最多的就是手写 SQL 或口述 SQL,面试官会给你出一个场景,比如班级、分数、课程之类的,一般考察表查询语句居多,例如多表查询、连接查询、子查询等。
作为测试,数据库在日常工作中的权重占比还是比较大的,主要有以下几个应用场景:
1、项目部署及部署完后数据的准备
开发配置好环境,但是没有连接数据库,就需要我们自己新建数据库并连接。
已经建好数据库,但是没有创建数据表,就需要我们自己创建数据表。
已经创建好数据库和数据表,但是数据表中没有数据,就需要我们自己添加数据。
数据表中有数据,但是数据量不够,开发只提供一两条样例数据,测试就需要大量造数据。
项目的后台管理没有注册功能,就需要我们自己手动向数据表中插入用户名和密码。
2、在前端页面增删改查,查看数据库是否做了相应更新,核对数据存储的准确性
例1:在 CRM 项目中,新建客户以后,在数据库的表中查看是否与新建的客户信息一致。
例2:支付交易产生的订单可以从数据库中查看订单是否真实存储,数据信息是否一致。
3、对数据直接操作来满足测试用例所需的极限场景
比如有些场景像 CRM 项目中的新建客户功能,我们只是要验证一个输入框的边界值,但是却需要在前端页面一直新建,一直提交保存,每次新建都需要填写暂时不需要测试的必填项,太麻烦,就可以直接去修改数据表中对应的字段值。
4、性能测试或自动化测试通过脚本产生大量数据时,查看数据库是否批量有效存储
5、通过操作数据库优化测试用例,提升测试效率
6、前端输入框字段报错时,可能是数据库参数类型设置有误或字段长度不够,就可以打开数据库查看字段参数类型和长度是否正确
7、性能测试,通过优化 SQL 语句或表结构来提高系统的性能,例如慢查询等
8、造数据场景,构造某些用例的前置条件
例1:统计年盈利额,需要 1~12 月都需要数据,不可能一个需求测一年吧,就可以在数据库中直接插入数据。
例2:手机号注册时,通过改数据库表字段非唯一状态来重复使用一个手机号,进行反复注册。
例3:通过修改金额、价格等用来做支付测试,比如原本需要 100¥,就可以通过修改数据为 0.01¥。
例4:会员积分,就可以在数据库直接修改积分,看是否达到会员。
9、理解如何通过接口操作数据库
10、做测试结构分析时,可以通过数据库搞清楚数据流向,哪个表放哪个字段什么时候在哪里展示
……
仅列举了一些日常工作中比较常见的场景。
紧接着,就来介绍一下数据库以及常用的 SQL 语句。
数据表的增删改查
增(insert)
-- 插入数据
INSERT INTO user_info ( user_id, user_name, PASSWORD, user_nick, card_num )
VALUES
( 1, 'zhangsan', 'abc123', 'zhangsanfeng', 124567894651329785 ),
( 2, 'lisi', '122bbb', 'limochou', 124567894651324567 ),
( 3, 'wangwu', '123aaa', 'wangbaiwan', 214567894651324567 ),
( 4, 'liuqi', '12aaa', 'liuchuanfeng', 214563356651324567 ),
( 5, 'zhangliu', '12aaa', 'zhangwuji', 214563356658966567 );
删(delete)
语法:
delete from 表名 where 条件
delete 语句不能删除某一列的值。(可以使用 update 表名 set username = “” where userid = 1)
使用 delete 语句仅删除符合 where 条件的行的数据,不删除表中其他行和表本身。
truncate user_info_table(直接把数据清空掉)
drop 和 delete 的区别:
drop 是删除数据库、数据表、数据表中的某一列。
delete 是删除某一行数据。
改(update)
语法:
update [表名] set [列名]=[新值] where [列名]=[某值];
update 语法可以新增、更新原有表行中的各列。
set 子句指示要修改哪些列和要给予哪些值。
where 子句指定应更新哪些行。如果没有 where 子句,则更新所有的行。
查(select)
例1:
现有下表
where子句
-- 1. 满足价格大于等于9的所有信息
SELECT * FROM order_info WHERE price >= 9;
-- 2. 查找满足product_id在1002和1003之间的
SELECT * FROM order_info WHERE product_id BETWEEN 1002 AND 1003;
-- 3. 查找user_id在1、3、5这三个数内的信息
SELECT * FROM order_info WHERE user_id IN (1,3,5);
-- 4. 查找订单状态是已支付的信息
SELECT * FROM order_info WHERE order_status = 'pay';
-- 5. 查找用户名类似于已li开头的信息
SELECT * FROM user_info WHERE user_name LIKE 'li%';
-- 6. 查找用户名中第二个字母是h的信息
SELECT * FROM user_info WHERE user_name LIKE '_h%';
-- 7. 查找用户名中第二个字母不是h的信息
SELECT * FROM user_info WHERE user_name NOT LIKE '_h%';
-- 8. 查找用户名中最后一个字母以i结尾的信息
SELECT * FROM user_info WHERE user_name LIKE '%i';
-- 9. 查找价格大于8,并且订单状态是已支付的所有信息
SELECT * FROM order_info WHERE price > 8 AND order_status = 'pay';
-- 10.查找用户表中user_nick为null的信息
SELECT * FROM user_info WHERE user_nick IS NULL;
-- 11.查找用户表中user_nick为 not null的信息
SELECT * FROM user_info WHERE user_nick IS NOT NULL;
聚合函数
-- 1. 查找订单表中最大的价格,查找订单表中最小的价格
SELECT MAX(price),MIN(price) FROM order_info;
-- 2. 查找订单表中user_id=2的最小价格
SELECT MIN(price) FROM order_info WHERE user_id = 2;
-- 3. 分别列出订单表中user_id=2的最小价格和最大价格
SELECT MIN(price),MAX(price) FROM order_info WHERE user_id = 2;
-- 4. 分别列出订单表中user_id=2的最小价格和最大价格,并把最小价格的展示结果的列名改为"min_price"
SELECT MIN(price) AS min_price,MAX(price) FROM order_info WHERE user_id = 2;
-- 5. 求订单表的价格的平均值,求订单表中user_id=2的价格的平均值
SELECT AVG(price) FROM order_info;
SELECT AVG(price) FROM order_info WHERE user_id = 2;
-- 6. 分别列出订单表中user_id=2的价格的平均值、最小值、最大值
SELECT AVG(price),MIN(price),MAX(price) FROM order_info WHERE user_id = 2;
-- 7. 求订单表中user_id=1的价格的总和
SELECT SUM(price) FROM order_info WHERE user_id = 1;
-- 8. 求订单表中user_id=1或者user_id=3的价格总和
SELECT SUM(price) FROM order_info WHERE user_id = 1 OR user_id = 3;
分组
-- 1.首先筛选状态为已支付的订单,然后按照user_id分组,分组后每一组对支付金额进行求和,最终展示user_id和对应组求和金额
SELECT user_id,SUM(price) FROM order_info WHERE order_status = 'pay' GROUP BY user_id;
-- 2.首先筛选状态为支付的订单,然后按照user_id分组,分组后每一组对支付金额进行求和,再过滤求和金额大于10的,最终展示user_id和对应组的求和金额
SELECT user_id,SUM(price) FROM order_info WHERE order_status = 'pay' GROUP BY user_id HAVING SUM(price) > 10;
数据表连接查询和子查询
-- 1.查询订单表中的价格大于10元的用户的昵称(小提示:用户昵称在用户表中,订单价格在订单表中)
SELECT a.user_nick FROM user_info a INNER JOIN order_info b ON a.user_id = b.user_id WHERE b.price > 10;
SELECT user_nick FROM user_info WHERE user_id IN (SELECT user_id FROM order_info WHERE price > 10);
-- 2.查询用户名以l开头的用户买过的所有订单id和对应价格(小提示:订单id和对应价格在订单表中,用户名在用户表中)
SELECT o.order_id,o.price FROM order_info o WHERE o.user_id IN (SELECT user_id FROM user_info u WHERE u.user_name LIKE 'l%');
例2:
现有下2表
-- 1.修改供应商id为4的供应商名称为‘hongshuangxi’
UPDATE suppliers_info SET supplier_name = 'hongshuangxi' WHERE supplier_id = 4;
-- 2.查询商品重量大于0.10的商品的名称
SELECT product_name FROM products_info WHERE weight > 0.10;
-- 3.查询商品名称以字母p开头的商品的所有信息
SELECT * FROM products_info WHERE product_name like 'p%';
-- 4.查询商品重量大于0.10,小于0.20的商品名称
SELECT product_name FROM products_info WHERE weight > 0.10 AND weight < 0.20;
-- 5.按照商品分类统计各自的商品总个数,显示每个分类和其对应的商品总个数
SELECT classification,COUNT(classification) FROM products_info GROUP BY classification;
-- 6.将所有商品的名称按照商品重量由高到低显示
SELECT product_name,weight FROM products_info ORDER BY weight DESC;
-- 7.显示所有商品的信息,在右边显示有供应商的商品对应的供应商信息
SELECT * FROM products_info a LEFT JOIN suppliers_info b ON a.supplier_id = b.supplier_id;
-- 8.显示重量大于等于0.15的商品的供应商的联系人和手机号
SELECT s.contacts,s.contacts_phone_num FROM suppliers_info s INNER JOIN products_info p ON s.supplier_id = p.supplier_id and p.weight >= 0.15;
感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取