我们平常使用的网站、APP和桌面客户端等软件,都离不开一个叫做数据库的东西的助力,数据库就像一个商店的仓库,如果没有这个仓库,那么商店就不能提供给顾客任何实质性的物品。目前数据库技术已经渗透到比如政务,金融,银行,医疗,军工,互联网行业等,而随着软件体量的增长,曾经被忽略的数据库功能、性能和安全都越来越急需得到更多的质量保障。
相信很多测试小伙伴一开始做功能测试(黑盒测试)时,更多地关注的是前端UI、主要功能和逻辑的实现,而忽略了数据库的测试,或者说在数据库这块只是进行简单的增删改查检查就草草结束了。其实数据库要测试的方面有很多,今天就列举一些和大家分享。
首先我们来认识一下目前主流的数据库:
项目开发中主要还是用的关系型数据库:
比如MySQL,Oracle,Microsoft SQL Server,DB2,Microsoft Access等
当然除了关系型数据库还有非关系型数据库:比如Redis,MongoDB等。
关系型数据库:使用表格(表)来组织数据,表之间通过关系建立连接,数据以结构化的行和列存储,遵循固定的模式(模式定义在数据库的表结构中),使用表格的行和列,表格之间通过外键建立关系,每个表有固定的列,行必须符合表的结构。强调数据一致性,保证任何时刻数据库都处于一致的状态。
非关系型数据库:使用各种数据模型,例如文档、键值对、列族、图等。数据可以以非结构化或半结构化的形式存储,而且不需要遵循固定的模式,数据结构更灵活,不同类型的数据可以存储在同一数据库中,而且每个记录可以有不同的字段,可能在一定程度上牺牲一致性以获取更高的性能和可用性。
对于数据库的操作主要集中:
一、增删改查模块
增删改查相信大家都是会做的,这边我就捎带提一下即可,有一点倒是需要强调,就是要检查一下字段边界和数据量边界,测试在字段的边界值上插入、更新或删除数据。测试在大型数据集上执行操作的性能和正确性。
二、数据库索引
验证数据库中的索引是否被正确使用。测试索引对查询性能的影响,包括索引的创建和删除。
1)测试基本的SELECT查询,包括涉及索引的查询和不涉及索引的查询。比较有索引和无索引情况下的查询性能,以确定索引对查询速度的影响。
2)验证索引对于排序操作的性能影响。测试涉及ORDER BY子句的查询,以确保索引在排序操作中的有效性。
3)如果使用了分区表,测试分区索引的性能。确保分区索引在查询时能够提供高效的性能。
三、数据库视图
测试数据库视图定义是否反映了用户的需求,视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
1)检查视图的返回列是否与设计时定义的列一致。确保视图返回的数据类型符合预期。
2)如果视图接受参数,测试不同参数组合的情况。确保参数化视图在各种情况下都能正确工作。
3)测试视图与其他表或视图的连接是否正确。确保关联的数据能够正确地合并到视图中。
二、空数据库测试
将数据库表中所有的内容全部清空或者在系统喂数据前就进行测试,只留下一个管理员账户信息,检查系统的所有功能操作是否能够正常实现
五、测试数据库中数据的正确性或者完整性
测试数据库中数据的正确性和完整性是数据库测试中非常重要的一部分,涉及确保数据符合预期值、遵循业务规则和约束。
1)测试数据库表中的主键约束,确保每个记录都具有唯一的主键值。验证外键约束,确保外键引用的数据在关联表中存在。
2)确保设置了唯一性约束的字段中不允许重复值。确保设置了唯一性约束的字段中不允许重复值。
3)验证设置了默认值的字段在没有明确提供值的情况下是否能够正确地使用默认值。确保默认值符合业务规则和预期。
4)验证检查约束,确保字段值满足指定的条件。测试插入或更新数据时检查约束的行为。
5)确保每个字段的数据类型符合设计规范。测试插入或更新数据时数据类型的强制性。
6)如果数据库需要存储历史数据,测试历史数据的准确性和完整性。确保历史数据的时间戳和版本号等信息的正确性。
7)测试更新或删除数据时,确保数据的相关性和完整性得到维护。验证关联数据的级联更新或删除行为。
六、除了测试数据外,还要关注好数据库设计准则
数据库设计是确保数据库能够有效存储和管理数据的关键步骤。数据库设计的准则有:明确定义业务需求、标识实体和关系、规范化数据模型、选择适当的数据类型、保持数据的完整性、考虑性能需求、建立适当的索引、灵活考虑数据库范式、考虑安全性、版本控制数据库模式、数据库文档设计、性能测试和优化、备份和恢复策略等等方面,当你成为测试经验丰富后,是可以从这些维度出发给开发提提数据库的设计建议了。
七、数据库压力测试
在日常操作中的某一时刻,是否能够可以有效的承受来自多个用户的并发访问,并保持正常工作的过程。这种情况,可以借助于相关的测试工具来实现。
八、数据库SQL语句优化
这点在面试过程也是可能被问到的,为了你能全方面掌握SQL优化方法,我这边尽量说得详细点。数据库SQL语句优化是提高数据库查询性能的重要步骤,以下是一些常见的SQL语句优化技巧:
1)要使用索引:
- 在查询中使用适当的索引,以加速数据检索。确保索引覆盖查询,以避免回表操作。
例:使用索引
SELECT * FROM users WHERE username = 'john';
避免全表扫描
SELECT * FROM users WHERE username = 'john' AND status = 'active';
2)避免使用SELECT :
只选择实际需要的列,而不是使用`SELECT *`,以减小数据传输量。
例:只选择需要的列
SELECT user_id, username FROM users WHERE status = 'active';
3)使用JOIN时选择适当的连接方式:
根据实际需要选择INNER JOIN、LEFT JOIN、RIGHT JOIN等连接方式,以减小结果集。
例:使用INNER JOIN
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
4)优化子查询:
尽量避免在查询中使用过多的子查询,可以考虑使用JOIN或其他连接方式替代。
例:使用JOIN替代子查询
SELECT product_name
FROM products
WHERE category_id IN (SELECT category_id FROM categories WHERE category_name = 'Electronics');
使用JOIN
SELECT products.product_name
FROM products
INNER JOIN categories ON products.category_id = categories.category_id
WHERE categories.category_name = 'Electronics';
5)合理使用索引列:
在索引中选择最常用于过滤和排序的列。避免在大型表上创建过多的索引。
例:在 WHERE 和 ORDER BY 中使用索引列
CREATE INDEX idx_last_name ON employees(last_name);
SELECT * FROM employees WHERE last_name = 'Smith' ORDER BY hire_date;
6)使用EXISTS替代IN:
在子查询中,使用`EXISTS`代替`IN`,因为`EXISTS`通常在子查询找到匹配项后立即返回。
例:使用EXISTS替代IN
SELECT customer_name
FROM customers
WHERE EXISTS (SELECT 1 FROM orders WHERE orders.customer_id = customers.customer_id);
7)合理使用数据库缓存:
使用适当的缓存机制,例如缓存查询结果或使用缓存工具,以避免相同的查询频繁访问数据库。
8)分页查询优化:
对于分页查询,使用`LIMIT`和`OFFSET`来限制返回的行数,避免一次性检索大量数据。
例:分页查询
SELECT * FROM products ORDER BY product_id LIMIT 10 OFFSET 20;
9)统计和分析执行计划:
使用数据库提供的工具分析和优化查询执行计划,以便了解查询的瓶颈和潜在问题。
例:查看执行计划
EXPLAIN SELECT * FROM orders WHERE customer_id = 123;
10)定期维护和优化:
定期进行数据库表的统计、索引的重建和数据库的优化,以确保数据库保持高性能状态。
这些优化技巧应根据具体的数据库系统和应用场景进行调整。对于复杂的查询和大型数据集,可能需要更深入的优化策略和工具。
总结:数据库测试是确保数据库系统正常运行、数据一致性、性能可靠以及安全可靠的关键流程。通过进行全面的数据库测试,企业可以确保其数据库系统能够可靠地支持业务需求,并能够及时、准确地提供数据。这有助于提高系统稳定性,减少潜在的安全风险,以及优化数据库性能。