第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基础就这些,但够用了。记住:环境要规范、语法要简洁、面向对象要合理、异常要处理、文件操作要安全。这些在后面的框架搭建中,每一个都会用到。

下一章,咱们开始搭框架的骨架——项目结构设计。到时候你会感谢今天认真复习基础的自己。