【亲身经历】软件测试笔试题(python、sql、功能测试)

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. 正向用例
  • 测试步骤

    1. 发送登录请求,使用正确的用户名和密码。

    2. 验证响应状态码为 200 OK

    3. 验证响应体包含 token 或 session_id

    4. 验证返回的用户信息(如用户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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值