刚入行做软件测试那会儿,手动点来点去特别费时间。尤其是每次上线前 regression 测试,几十个功能点来回验证,眼睛都快看花了。后来项目节奏加快,产品经理三天两头改需求,再靠纯手工测试根本顶不住。这时候,我开始动手写自动化测试脚本。
从最简单的登录流程练起
很多人一上来就想搞全链路自动化,结果卡在环境配置就放弃了。我的建议是:挑一个稳定、高频、路径清晰的功能点开刀。比如系统的登录页面,输入账号密码,点击登录,跳转首页。这个流程简单,适合练手。
import pytest
from selenium import webdriver
def test_login():
driver = webdriver.Chrome()
driver.get("http://localhost:8080/login")
username_input = driver.find_element_by_id("username")
password_input = driver.find_element_by_id("password")
login_button = driver.find_element_by_id("login-btn")
username_input.send_keys("testuser")
password_input.send_keys("123456")
login_button.click()
assert "dashboard" in driver.current_url
driver.quit()
这段代码跑通之后,心里就有了底。虽然看着简单,但已经涵盖了自动化测试的核心步骤:启动浏览器、定位元素、操作行为、结果断言。
别怕报错,调试才是进步的关键
刚开始运行脚本,经常遇到找不到元素的问题。比如前端同事改了个 class 名,或者页面加载慢了一秒,脚本就挂了。这时候得学会加显式等待,而不是盲目用 time.sleep(5) 这种硬等。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "login-btn")))
这种写法更稳定,也更贴近实际场景。毕竟用户也不会傻等五秒,而是看到按钮出现就点。
把重复动作变成可复用的模块
写多了就会发现,每个测试都要打开浏览器、登录、关闭,代码重复率太高。干脆把登录封装成一个函数,多个测试用例直接调用。
def login_user(driver, username="testuser", password="123456"):
driver.get("/login")
driver.find_element_by_id("username").send_keys(username)
driver.find_element_by_id("password").send_keys(password)
driver.find_element_by_id("login-btn").click()
后来团队里新来的实习生也用这个函数写测试,效率一下子提上去了。组长开会还夸我们这波操作省了将近 40% 的回归时间。
结合 CI 才算真正落地
脚本写好了,不能只本地跑。我们把它接到 Jenkins 上,每次代码提交自动触发一轮核心流程测试。有次开发小哥改了个接口,忘了通知前端,结果自动化脚本第二天早上就报了错,避免了带到生产环境。
现在每天上班第一件事,不是打开网页点登录,而是先看一眼 Jenkins 的构建状态。绿色就安心,红色就得赶紧查日志。这种“被机器推着走”的感觉,其实挺踏实的。