数据库基本操作,构建测试框架的数据基石
接口测试脚本返回的结果需不需要去查询数据库?
- 校验数据库的操作可以放在单元测试里面,真正接口测试后期是不需要在代码里体现校验数据库的。在接口测试代码开发的阶段可以人工的对数据库的一些信息作出查询、修改、更新以便于代码的调试
- 接口测试不需要查询数据库吗?答案是需要,只是我们不是直接通过sql的语句对数据库进行操作,而是间接的通过其他接口来获取信息,如我在商品发布接口发布了一件衣服,那么我可以通过获取商品列表的接口来查询是否之前接口新增成功。
- 接口测试代码开发中应该把更多的精力放在代码编写上,如何还要增加数据库这方面的校验势必会耗费很多时间,总体效益来说不是很好。
接口测试(或者说作为测试人员)需要知道数据库基本操作吗?
添加表记录
在 MySQL 中,添加表记录是通过 INSERT 语句实现的。INSERT 语句允许你向数据库表中插入一条或多条新记录。下面是 INSERT 语句的基本语法和示例
INSERT INTO employees (id, first_name, last_name, chat_name)
VALUES (1, 'John', 'Doe', '软件测试微课堂');
如果你的表有自动递增的主键(例如 id),并且你不关心具体的 ID 值,你可以省略 id 列及其值:
INSERT INTO employees (first_name, last_name, chat_name)
VALUES ('Jane', 'Doe', '软件测试微课堂');
插入多行记录
你也可以一次性插入多行记录,只需要在 VALUES 后面列出多组值即可:
INSERT INTO employees (first_name, last_name, chat_name)
VALUES
('Michael', 'Smith', '软件测试微课堂'),
('Emily', 'Johnson', '软件测试微课堂');
表记录更新
在MySQL中,更新已存在的表记录是通过UPDATE
语句来实现的。UPDATE
语句允许你修改数据库表中满足特定条件的记录。下面是UPDATE
语句的基本语法和一些示例。
基本语法
UPDATE table_name
SET column1 = new_value1, column2 = new_value2,...
WHERE some_column = some_value;
这里,table_name
是你想要更新的表的名称,column1, column2, ...
是你想要修改的列名,new_value1, new_value2, ...
是你想要设置的新值,而WHERE
子句用于指定哪些记录应该被更新。
示例
假设你有一个名为employees
的表,其中包含id
, first_name
, last_name
, 和email
等列。现在,你想更新ID为1的员工的姓氏和电子邮件,你可以使用以下SQL语句:
UPDATE employees
SET last_name = 'NewLastName', email = 'new.email@example.com'
WHERE id = 1;
如果没有WHERE
子句,UPDATE
语句将更新表中的所有记录,这通常不是你想要的结果。因此,一定要谨慎使用WHERE
子句来精确地定位要更新的记录。
多条件更新
你也可以基于多个条件更新记录。例如,如果你想更新所有年龄大于30岁且部门为销售部的员工的工资,假设表中还有age
和department
列,你可以这样写:
UPDATE employees
SET salary = salary * 1.1 -- 增加10%的工资
WHERE age > 30 AND department = 'Sales';
注意事项
- 在执行
UPDATE
操作之前,确保你有适当的备份或事务控制机制,以防意外修改重要数据。 - 如果你在一个大的生产环境中执行更新操作,务必先在测试环境中试验,以避免影响真实数据。
- 总是检查你的
WHERE
子句,确保它正确地限定了你想要更新的记录。
删除表记录
基本语法
DELETE FROM table_name
WHERE condition;
这里,table_name
是你想要从中删除记录的表的名称,而 WHERE condition
是一个可选的子句,用于指定哪些记录应该被删除。如果不使用 WHERE
子句,那么该语句将删除表中的所有记录,这是非常危险的,因此在实际操作中应谨慎使用。
示例
假设你有一个名为 employees
的表,其中包含 id
, first_name
, last_name
, email
, 和 salary
等列。现在,你想删除 id
为 1 的员工记录,你可以使用以下 SQL 语句:
DELETE FROM employees
WHERE id = 1;
如果你想删除所有薪资低于 3000 的员工记录,你可以这样写:
DELETE FROM employees
WHERE salary < 3000;
注意事项
- 安全性:在执行任何
DELETE
操作之前,请确保你有适当的数据备份,或者在事务安全的环境中操作,以防万一出现错误。 - WHERE 子句的重要性:永远不要省略
WHERE
子句,除非你确实想删除整个表的所有记录。误操作可能导致重要数据丢失。 - 性能考虑:在大型表中删除大量记录可能会影响数据库性能,因此在生产环境中执行此类操作时应格外小心,并在非高峰时段进行。
删除表中的所有记录
如果你确实需要删除表中的所有记录,可以使用以下语句:
DELETE FROM employees;
但是,通常情况下,使用 TRUNCATE TABLE
语句会更高效,因为 TRUNCATE
不仅清空表,还会重置表的自动增量计数器,同时不记录删除事件的日志,从而提高了效率。不过,TRUNCATE
不能像 DELETE
那样配合 WHERE
子句使用,只能清空整个表。
TRUNCATE TABLE employees;
总之,在使用 DELETE
或 TRUNCATE
语句时,一定要小心谨慎,确保你清楚自己的操作将会产生什么后果。
查询表数据
在 MySQL 中,查询表记录主要通过 SELECT
语句来实现。SELECT
语句允许你从数据库表中检索数据,你可以选择查看所有记录或基于某些条件筛选出特定记录。下面是 SELECT
语句的基本语法和一些示例。
基本语法
SELECT column1, column2, ...
FROM table_name
WHERE condition;
这里,column1, column2, ...
是你想要检索的列名,table_name
是包含数据的表的名称,而 WHERE condition
是可选的,用于指定检索哪些记录。
示例
假设你有一个名为 employees
的表,其中包含 id
, first_name
, last_name
, email
, 和 salary
等列。现在,你想查询所有员工的姓名和电子邮件,你可以使用以下 SQL 语句:
SELECT first_name, last_name, email
FROM employees;
如果你想查询薪资超过 5000 的所有员工的信息,你可以添加 WHERE
子句:
SELECT *
FROM employees
WHERE salary > 5000;
更复杂的查询
你还可以结合其他 SQL 子句来创建更复杂的查询,例如 ORDER BY
, GROUP BY
, 和 JOIN
。
排序结果
如果你想按员工的姓氏字母顺序排序结果,可以使用 ORDER BY
子句:
SELECT *
FROM employees
ORDER BY last_name;
分组和聚合
如果你想要计算每个部门的平均薪资,可以使用 GROUP BY
和聚合函数 AVG()
:
SELECT department, AVG(salary) as average_salary
FROM employees
GROUP BY department;
注意事项
- 在处理大量数据时,合理使用
WHERE
子句和索引可以显著提高查询性能。 - 当从多个表中检索数据时,使用
JOIN
语句可以更有效地组合相关数据。
接口用例设计,确保功能覆盖的测试策略
咱们测试接口的话,肯定要写测试用例,写测试用例的话,就要有一个用例模板,那需要有哪些字段呢?
- 项目是哪个项目的
- 模块这个接口是属于哪个功能模块的
- 用例id
- 接口名称
- 用例标题用例是干嘛的
- 请求方式GET/POST
- 请求url url地址
- 请求参数
- 前置条件有依赖的时候,比如说要测登录失败3次的
- 结果验证预期结果
- 请求报文
- 返回报文
- 测试结果通过/失败
- 测试人员
源码开发工具,精挑细选的开发利器
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。
源码开发步骤,步步为营的编码指南
先建立项目,项目目录中一般包含主要源码存放位置,测试脚本存放位置,log存放位置,结果存放位置,测试需要的文件存放位置。一个项目代码的开始每个文件的源码编写都是有先后顺序的。
-
先准备好需要用到的一些文件,这里第一个文件就是配置文件ini,文件名为config.ini,这个文件的创建形式比较简单直接windows新建txt文件,修改文件后缀名为ini即可,查看windows的系统文件你会发现大多都是ini的文件格式,文件内容随便书写一些。
-
接下里我们需要做的是写一段代码去读取和写入这个ini配置文件,所以产生了readconfig.py文件。
-
接下来可能会再往log打印这一块去想,这一块内容哪个项目的源码都是差不多的,与其他模块的交互性没那么大,基本写好了后面调用就行,都不需要修改。
-
到这个时候是该想想我们的项目任务是什么了,没错是接口测试,那么自然而然就需要对接口做一次封装,于是产生了confighttp.py,当我们去调试这个文件的时候,就需要测试脚本来辅助,于是测试脚本的雏形初现了。
-
当我们写脚本的时候回发现这么脚本的好多地方太死板了,于是我们就会在common里写一些通用的方法来完善脚本。于是脚本慢慢的更加完善了。
-
脚本完善以后会想到项目的功能是接口测试,数据的核对是咋样的呢,首先想到的是粗暴的方法直接和数据库里的数据进行核对。那么configdb产生了。
-
好,脚本已经是很完美了,这个时候我们难免会多想,比如很多脚本咋办如何运行,如何统计我要的结果,这个时候测试主入口runall.py出现了。
-
Runall.py写着写着,又不高兴了,产生的这些结果能不能直接邮件发给我,或者其它更酷炫的方法呢,于是configemail.py出现了。至此一大块框架基本已经搭好了。
接口常见问题,避免陷阱的专家建议
问题1、传值缺少参数file
问题2、请求方式不支持
问题3、鉴权失败
import requests
# API的URL
url = "https://api.example.com/data"
# 请求头,通常包含鉴权信息
headers = {
"Authorization": "Bearer YOUR_ACCESS_TOKEN", # 这里使用的是Bearer Token鉴权方式
"Content-Type": "application/json"
}
# 请求体,如果有POST数据的话
data = {
"key": "value"
}
try:
# 发送GET请求
response = requests.get(url, headers=headers)
# 检查响应状态码
if response.status_code == 401:
print("请求失败,原因:鉴权失败")
elif response.status_code != 200:
print(f"请求失败,原因:未知错误,状态码 {response.status_code}")
else:
# 成功时处理响应数据
print("请求成功,响应数据:", response.json())
except requests.exceptions.RequestException as e:
# 处理网络请求异常
print("网络请求发生错误:", e)
文章原创首发于微信公众号 软件测试微课堂