通俗比喻:
面试题:如何用一行代码筛选出列表中的偶数?
代码:
nums = [1, 2, 3, 4]
evens = list(filter(lambda x: x % 2 == 0, nums)) # 筛选偶数
print(evens) # 输出: [2, 4]
通俗讲解:
lambda
是“临时工”:只用一次的小函数,适合简单逻辑。filter
是“筛子”:把符合条件的数据留下,不符合的丢掉。面试题:如何快速生成100个测试账号?
代码:
test_users = [f"user_{i}" for i in range(100)] # 生成100个用户名
print(test_users[:5]) # 输出: ['user_0', 'user_1', ..., 'user_4']
通俗讲解:
面试题:如何读取10GB的日志文件?
代码:
def read_log(file_path):
with open(file_path, "r") as f:
for line in f:
yield line # 一次只读一行,不占内存
for line in read_log("access.log"): # 逐行处理
if "ERROR" in line:
print("发现错误日志:", line)
通俗讲解:
yield
是“暂停键”:每次取数据时才计算,节省内存。面试题:如何设计通用的接口测试类?
代码:
class BaseTest:
def setup(self):
print("初始化测试环境")
def run(self):
self.setup()
self.execute()
class APITest(BaseTest):
def execute(self):
print("执行API测试逻辑")
test = APITest()
test.run() # 输出: 初始化 + 执行API逻辑
通俗讲解:
面试题:如何限制超时时间不能为负数?
代码:
class Config:
def __init__(self):
self._timeout = 5 # 私有属性
@property
def timeout(self):
return self._timeout
@timeout.setter
def timeout(self, value):
if value < 0:
raise ValueError("超时时间不能为负数") # 防止错误值
self._timeout = value
config = Config()
config.timeout = 10 # 正常设置
config.timeout = -1 # 报错!
通俗讲解:
@property
是“安全门”:控制属性的读写规则。面试题:如何并发执行100个接口请求?
代码:
import asyncio
import aiohttp
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
urls = ["https://httpbin.org/get"] * 100
async with aiohttp.ClientSession() as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks) # 并发执行
print(f"完成 {len(results)} 个请求")
asyncio.run(main())
通俗讲解:
async/await
是“多线程的升级版”:用更少资源做更多事。面试题:如何让同事知道参数类型?
代码:
from typing import List, Dict
def parse_response(data: Dict[str, str]) -> List[str]:
return [item for item in data.values()] # 返回字符串列表
result = parse_response({"a": "1", "b": "2"})
print(result) # 输出: ['1', '2']
通俗讲解:
面试题:如何确保数据库连接自动关闭?
代码:
class DBConnection:
def __enter__(self):
print("连接数据库")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("关闭数据库")
def query(self):
print("执行查询")
with DBConnection() as db:
db.query() # 输出: 连接 + 查询 + 关闭
通俗讲解:
with
是“自动开关”:进入时打开,离开时关闭。面试题:如何根据配置文件动态执行测试用例?
代码:
class TestCase:
def test_login(self):
print("执行登录测试")
case = TestCase()
method_name = "test_login"
if hasattr(case, method_name): # 检查是否有该方法
method = getattr(case, method_name) # 获取方法
method() # 输出: 执行登录测试
通俗讲解:
hasattr
和 getattr
是“探测器”:动态访问对象属性。面试题:如何测试接口失败时的逻辑?
代码:
from unittest.mock import patch
def fetch_data():
import requests
return requests.get("https://api.example.com/data").json()
@patch("requests.get") # 模拟 requests.get
def test_fetch_data(mock_get):
mock_get.return_value.status_code = 500 # 模拟接口失败
result = fetch_data()
assert result is None # 验证异常处理逻辑
test_fetch_data()
通俗讲解:
@patch
是“替身演员”:替换真实接口为模拟数据。高级特性 | 测试场景 | 通俗比喻 |
---|---|---|
装饰器 | 日志记录、自动重试 | “功能插件” |
异步编程 | 高并发压测 | “多个任务同时跑” |
类型注解 | 防止参数错误 | “代码说明书” |
pytest
编写参数化测试用例。掌握这些特性,不仅能让你的测试脚本更高效,还能在面试中展现技术深度。记住:代码是工具,解决问题才是目的!
行动指南:
- 用装饰器为测试用例添加日志。
- 用异步优化接口压测脚本。
- 用类型注解重构测试框架代码。
欢迎留言讨论你的面试题,我会持续更新更多实战内容!