1、用任何一门编程语言,计算1~100的乘积?
result = 0
for i in range(1,101):
result *= i
print(result)
2、写一个sql查询,差employee表中,salary排名第二的记录?
分析:查询排名第二salary,可以先试用max查询最大的,然后再比max小的值中,筛选出
最大的max的salary即可。
select salary * from employee salary =
(
select * from employee where
salary =
(select MAX(salary) from employee)
);
3、[a]->[b],[a]->[c],[b]->[c],[c]->[d],[b]->[e], 括号表示状态,请说明覆盖其中的用例有多少条。
分析:将状态,使用流程图分析,可以得到有以下三条路径
a --> b --> e 覆盖 [a]->[b] 和 [b]->[e]
a --> b --> c --> d 覆盖 [a]->[b] 和 [b]->[c] 和 [c]->[d]
a --> c --> d 覆盖[a]->[c] 和 [c]->[d]
结论:最小有3条用例,此类问题可转化为流程图来分析。
4、api接口测试中,以登录为例,你封装了哪些模块?
1. 请求构造封装
目的:统一管理接口请求参数,避免重复代码。
实现方式:
def build_login_request(username, password, endpoint="/api/login"):
return {
"url": f"{BASE_URL}{endpoint}",
"headers": {"Content-Type": "application/json"},
"json": {"username": username, "password": password}
}
使用场景:
-
不同测试用例只需传入不同
username
和password
。 -
支持动态调整接口路径(如不同环境的URL)。
2. 响应验证封装
目的:标准化响应校验逻辑,分离断言细节。
实现方式:
def validate_login_response(response, expected_status=200, expect_token=True):
assert response.status_code == expected_status
if expect_token:
assert "token" in response.json()
assert len(response.json()["token"]) > 0
else:
assert "error" in response.json()
使用场景:
-
验证成功登录(状态码200且返回有效token)。
-
验证失败登录(如状态码401,返回错误信息)。
3. 数据驱动封装
目的:分离测试数据与逻辑,支持多场景覆盖。
实现方式(以pytest为例):
import pytest
test_data = [
("valid_user", "valid_pass", 200, True),
("invalid_user", "wrong_pass", 401, False),
("", "empty_username", 400, False)
]
@pytest.mark.parametrize("username, password, status, expect_token", test_data)
def test_login(username, password, status, expect_token):
request = build_login_request(username, password)
response = requests.post(**request)
validate_login_response(response, status, expect_token)
使用场景:
-
覆盖正向、反向、边界值等测试场景。
-
数据与逻辑解耦,便于维护和扩展。
4. 认证管理封装
目的:全局管理Token,供其他接口复用。
实现方式:
class AuthManager:
def __init__(self):
self.token = None
def get_token(self):
if not self.token:
self.login()
return self.token
def login(self):
request = build_login_request("admin", "admin123")
response = requests.post(**request)
self.token = response.json()["token"]
使用场景:
-
其他测试用例通过
AuthManager().get_token()
直接获取有效Token。 -
自动处理Token过期或刷新逻辑(如加入重试机制)。
5. 环境配置封装
目的:隔离不同环境配置,提升测试灵活性。
实现方式(使用配置文件):
# config.yaml
environments:
dev:
base_url: "http://dev.example.com"
test:
base_url: "http://test.example.com"
import yaml
class ConfigLoader:
def __init__(self, env="test"):
with open("config.yaml") as f:
self.config = yaml.safe_load(f)["environments"][env]
BASE_URL = ConfigLoader().config["base_url"]
使用场景:
-
切换测试环境时只需修改
env
参数。 -
集中管理API路径、超时时间等配置。
6. 错误处理与日志封装
目的:统一处理异常,记录测试过程。
实现方式:
import logging
def log_response(response):
logging.info(f"Request URL: {response.request.url}")
logging.info(f"Response Code: {response.status_code}")
logging.info(f"Response Body: {response.text}")
def safe_request(method, **kwargs):
try:
response = requests.request(method, **kwargs)
log_response(response)
return response
except requests.exceptions.RequestException as e:
logging.error(f"Request Failed: {str(e)}")
raise
使用场景:
-
统一记录请求日志,便于排查问题。
-
异常捕获与重试机制(如网络波动)。
7. 性能与安全扩展封装
目的:覆盖非功能测试需求。
实现方式示例:
# 压力测试封装
def test_login_load():
from locust import HttpUser, task
class LoginUser(HttpUser):
@task
def login(self):
self.client.post("/api/login", json={"username": "user", "password": "pass"})
# 安全测试封装
def test_sql_injection():
payload = {"username": "admin'--", "password": "any"}
response = requests.post(f"{BASE_URL}/api/login", json=payload)
assert response.status_code == 400 # 应拦截SQL注入
总结
通过以上封装,登录接口自动化测试可实现:
-
高复用性:通用逻辑(请求、验证、配置)一次编写,多处调用。
-
易维护性:数据、配置、逻辑分离,修改成本低。
-
扩展性:轻松支持性能、安全等非功能测试。
-
可读性:测试用例聚焦业务场景,而非底层细节。
5、以登录成功为例,可以测试哪些?
一、基础功能验证
1. 正向用例
-
测试步骤:
-
发送登录请求,使用正确的用户名和密码。
-
验证响应状态码为
200 OK
。 -
验证响应体包含
token
或session_id
。 -
验证返回的用户信息(如用户ID、角色)是否与预期一致。
-
-
示例代码(Python + requests):
def test_login_success(): data = {"username": "valid_user", "password": "valid_password"} response = requests.post(LOGIN_URL, json=data) assert response.status_code == 200 assert "token" in response.json() assert response.json()["user_id"] == "expected_user_id"
2. 数据验证
-
响应数据完整性:
-
验证返回的
token
格式(如JWT格式是否符合规范)。 -
验证时间戳(如
expires_in
是否合理)。
-
-
示例断言:
# 验证 token 是否有效(如调用其他接口) headers = {"Authorization": f"Bearer {token}"} profile_response = requests.get(PROFILE_URL, headers=headers) assert profile_response.status_code == 200
二、性能测试
1. 响应时间
-
验证登录接口的响应时间在合理范围内(如 ≤ 500ms)。
-
示例代码(Locust性能测试):
from locust import HttpUser, task class LoginUser(HttpUser): @task def login(self): self.client.post("/login", json={"username": "user", "password": "pass"})
2. 高并发场景
-
模拟多用户并发登录,验证系统稳定性。
-
关注指标:
-
成功率(应保持 100%)。
-
错误率(无超时或5xx错误)。
-
三、兼容性测试
1. 客户端兼容性
-
验证不同客户端登录成功:
-
浏览器(Chrome、Safari、Firefox)。
-
移动端(iOS/Android App、H5)。
-
命令行工具(如Postman、CURL)。
-
2. 协议兼容性
-
验证不同HTTP方法(如POST/PUT)是否支持(若设计允许)。
-
验证HTTP/HTTPS协议是否均可用。
四、安全性验证
1. 敏感信息保护
-
验证响应中不返回明文密码。
-
验证
token
是否通过HTTPS传输,且标记为Secure
和HttpOnly
。
2. 会话管理
-
验证同一用户多次登录生成的
token
是否不同(防止会话固定攻击)。 -
验证旧
token
是否在退出后失效。
五、异常场景下的成功恢复
1. 网络中断恢复
-
模拟登录过程中断网后恢复,验证是否自动重试成功。
-
工具:使用Charles/Fiddler模拟网络中断。
2. 弱网环境
-
在低速网络下验证登录功能(如2G网络)。
六、自动化集成
1. 数据驱动测试
-
使用参数化覆盖多种登录成功场景:
@pytest.mark.parametrize("username, password", [ ("admin", "Admin@123"), # 管理员账号 ("user", "User#456"), # 普通用户 ("test", "Test!789") # 特殊字符密码 ]) def test_login_success(username, password): # 测试逻辑同上
2. Pipeline集成
-
将登录测试集成到CI/CD流程,确保每次部署后核心功能正常。
七、测试后清理
-
退出机制验证:
-
调用退出接口,验证
token
是否失效。 -
验证再次使用失效
token
访问受保护接口返回401 Unauthorized
。
-