自动化测试之模块化参数化

自动化测试之模块化参数化

模块化与参数化一般需要配合使用,即在创建函数或类方法时为它们设置入参,从而使以根据不同的参数执行相应的操作。

这里通过一个邮箱登录的脚本来辅以说明。

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")

文章作者: &娴敲棋子&
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 &娴敲棋子& !
评论
  目录