第2章:Python基础回顾
好,咱们直接进入正题。这一章我打算带大家快速过一遍Python的核心基础。别觉得枯燥,这些内容在自动化框架里天天都要用。我自己带团队时发现,很多同学框架写不好,根子就在基础不牢。
2.1 Python环境搭建
先说环境。我个人习惯用pyenv来管理Python版本。为什么?因为项目多了你就知道,有的依赖Python 3.8,有的要3.10,手动切换太痛苦了。
推荐方案:
- macOS/Linux:pyenv + virtualenv
- Windows:直接装Anaconda,省心
安装完记得验证一下:
python --version
pip --version
💡 小技巧:我习惯在项目根目录放一个.python-version文件,团队其他人clone下来自动切版本,避免「在我电脑上能跑啊」的尴尬。
2.2 基础语法速览
Python的语法,说白了就是「优雅」。我见过太多人把Python写成Java,那真叫一个难受。
变量与数据类型
Python是动态类型,你不需要声明类型。但注意,这不代表你可以乱来。
name = "自动化框架" # 字符串
version = 2.0 # 浮点数
is_ready = True # 布尔值
modules = [] # 列表
⚠️ 我曾经踩过一个坑:在循环里用可变对象做默认参数。比如 def add_item(item, target=[]),这个列表会被所有调用共享,结果数据全乱了。
控制流
if-else、for、while,这些大家都熟。我重点说一个:列表推导式。这玩意儿写好了,代码能少一半。
# 传统写法
result = []
for i in range(10):
if i % 2 == 0:
result.append(i * 2)
# 推导式写法
result = [i * 2 for i in range(10) if i % 2 == 0]
2.3 面向对象编程
自动化框架里,面向对象是核心。你想想看,一个测试用例、一个页面对象、一个配置管理,哪个不是类?
类与实例
class TestCase:
def __init__(self, name, steps):
self.name = name
self.steps = steps
def run(self):
print(f"执行测试用例:{self.name}")
for step in self.steps:
step.execute()
关键点:
- __init__是构造方法,别拼错
- self必须显式写,这是Python的特色
- 属性用self.xxx访问
继承与多态
我在项目中遇到过这样的场景:有Web测试、API测试、移动端测试,但它们的执行流程很像。这时候用继承就对了。
class BaseTest:
def setup(self):
print("初始化环境")
def teardown(self):
print("清理环境")
def execute(self):
self.setup()
self.run_test()
self.teardown()
class WebTest(BaseTest):
def run_test(self):
print("执行Web测试")
class APITest(BaseTest):
def run_test(self):
print("执行API测试")
💡 记住:继承是为了复用,不是为了炫技。我见过有人为了用继承,硬把不相关的类扯上关系,结果改一个全崩。
2.4 异常处理
自动化测试跑起来,什么妖魔鬼怪都可能遇到。网络超时、元素找不到、数据格式不对...没有异常处理,脚本就是一次性用品。
try-except 结构
try:
element = driver.find_element(By.ID, "submit")
element.click()
except NoSuchElementException:
print("元素没找到,截图保存")
driver.save_screenshot("error.png")
except TimeoutException:
print("页面加载超时,重试")
driver.refresh()
except Exception as e:
print(f"未知错误:{e}")
raise
finally:
print("清理资源")
⚠️ 我曾经犯过一个错:在except里直接pass。结果测试报告全是绿的,实际上用例根本没跑。记住:异常要么处理,要么抛出去,别沉默。
自定义异常
框架大了,内置异常不够用。我习惯定义自己的异常类:
class FrameworkException(Exception):
"""框架基础异常"""
pass
class ConfigError(FrameworkException):
"""配置错误"""
pass
class TestDataError(FrameworkException):
"""测试数据错误"""
pass
2.5 文件操作
自动化框架离不开文件:配置文件、测试数据、日志、报告...全是文件。
读写文本文件
with语句是标配,它会自动关闭文件,省心。
# 读文件
with open("config.ini", "r", encoding="utf-8") as f:
content = f.read()
# 写文件
with open("report.html", "w", encoding="utf-8") as f:
f.write("<h1>测试报告</h1>")
JSON操作
自动化框架里,JSON是最常用的数据格式。配置、测试数据、接口响应,全是JSON。
import json
# 读取JSON配置
with open("config.json", "r") as f:
config = json.load(f)
# 写入测试结果
result = {"passed": 10, "failed": 2, "skipped": 1}
with open("result.json", "w") as f:
json.dump(result, f, indent=2, ensure_ascii=False)
💡 我习惯把文件操作封装成工具类,这样到处都能复用。比如:
class FileUtil:
@staticmethod
def read_json(path):
with open(path, "r") as f:
return json.load(f)
@staticmethod
def write_json(path, data):
with open(path, "w") as f:
json.dump(data, f, indent=2)
路径处理
路径问题坑过我好几次。Windows用反斜杠,Linux用正斜杠,硬编码就是找死。
import os
from pathlib import Path
# 推荐用pathlib
base_dir = Path(__file__).parent
config_path = base_dir / "config" / "test_config.json"
# 或者用os.path
config_path = os.path.join(os.path.dirname(__file__), "config", "test_config.json")
本章小结:
Python基础就这些,但够用了。记住:环境要规范、语法要简洁、面向对象要合理、异常要处理、文件操作要安全。这些在后面的框架搭建中,每一个都会用到。
下一章,咱们开始搭框架的骨架——项目结构设计。到时候你会感谢今天认真复习基础的自己。