自动化测试之模块化参数化
模块化与参数化一般需要配合使用,即在创建函数或类方法时为它们设置入参,从而使以根据不同的参数执行相应的操作。
这里通过一个邮箱登录的脚本来辅以说明。
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get("https://www.126.com")
# 邮箱的登录操作
time.sleep(1)
lbNormal = browser.find_element_by_link_text("密码登录")
if lbNormal:
lbNormal.click()
else:
pass
login_frame = browser.find_element_by_css_selector('iframe[id^="x-URS-iframe"]')
browser.switch_to_frame(login_frame)
email_user = browser.find_element_by_name("email")
email_user.clear()
email_user.send_keys("username")
email_passwd = browser.find_element_by_name("password")
email_passwd.clear()
email_passwd.send_keys("password")
browser.find_elements_by_id("dologin").click()
# Todo 在邮箱成功登录后可执行的一些操作
time.sleep(5)
# 退出
browser.find_element_by_link_text("退出").click()
time.sleep(1)
browser.quit()
假设要实现一个关于邮箱自动化测试的项目,可能每条测试用例都需要有登录操作和退出动作。大部分的测试都需要在登录之后进行,如收发邮件、查看、删除、检索邮件等等。在这里,我可以创建一个新的脚本MailModule.py
来存放登录和退出动作。
class Mail:
def __init__(self, driver):
self.driver = driver
def login(self):
"""登录"""
lbNormal = self.driver.find_element_by_link_text("密码登录")
if lbNormal:
lbNormal.click()
else:
pass
self.driver.switch_to_frame(self.driver.find_element_by_css_selector('iframe[id^="x-URS-iframe"]'))
self.driver.find_element_by_name("email").clear()
self.driver.find_element_by_name("email").send_keys("username")
self.driver.find_element_by_name("password").clear()
self.driver.find_element_by_name("password").send_keys("password")
self.driver.find_element_by_id("dologin").click()
def logout(self):
"""退出"""
self.driver.find_element_by_link_text("退出").click()
接下来,我们需要修改此前的mailtest.py脚本,测试调用Mail类中的login()
和logout()
方法。
import time
from selenium import webdriver
from MailModule import Mail
driver = webdriver.Chrome()
driver.get("https://www.126.com")
# 调用Mail类并接收driver驱动
mail = Mail(driver)
# 登录邮箱
mail.login()
# Todo 在邮箱成功登录后可执行的一些操作
time.sleep(5)
# 退出
mail.logout()
time.sleep(1)
driver.quit()
在编写测试用例过程中,如果需要用到登录动作、退出动作时,那么只需调用Mail类中的login()方法、logout()方法即可,这将大大提高测试代码的可复用性。
这里切换为另一个场景,若我们需要测试登录呢?虽然测试的步骤是固定的,但测试的数据(邮箱用户)不同,这时我们就都需要把login()方法参数化。
我们可以将MailModule.py脚本进行如下修改:
# …………
def login(self, username, password):
"""登录"""
lbNormal = self.driver.find_element_by_link_text("密码登录")
if lbNormal:
lbNormal.click()
else:
pass
self.driver.switch_to_frame(self.driver.find_element_by_css_selector('iframe[id^="x-URS-iframe"]'))
self.driver.find_element_by_name("email").clear()
self.driver.find_element_by_name("email").send_keys(username)
self.driver.find_element_by_name("password").clear()
self.driver.find_element_by_name("password").send_keys(password)
self.driver.find_element_by_id("dologin").click()
# …………
由此以来,我们就提高了login()方法的可用性,它不在使用一个固定的账号登录,而是根据被调用者传过来的用户名和密码执行登录动作。
在实际测试中,我们可以根据不同的测试需要来调用login()方法。
# 调用Mail类并接收driver驱动
mail = Mail(driver)
# 登录账户为空
mail.login("", "")
# 用户名为空的情况下登录邮箱
mail.login("", "password")
# 密码为空的情况下登录邮箱
mail.login("username", "")
# 用户名或密码错误的情况下登录邮箱
mail.login("user_error", "passwd_error")
# 管理员账户登录
mail.login("admin", "admin")