python - 需要有关测试类结构的建议(Python、Selenium)
问题描述
我目前正在开发 QA 测试系统,我正在使用 Python 和 Selenium。我目前的项目结构是这样的:
locators.py - 包含页面上的所有定位器
例子:
class LoginPageLocators(object):
""" Login Page Locators """
USERNAME = (By.ID, 'username') #username text-box
....
basePage.py - 基页类
例子:
class Page(object):
def __init__(self, driver, base_url):
self.base_url = base_url
self.driver = driver
self.timeout = 30
def find_element(self, *locator):
"""
This method finds an element on the page with the appropriate locator
:param locator:
:return: element on page:
"""
return self.driver.find_element(*locator)
pages.py - 这里有我所有的页面类,这是一个小例子:
例子:
class LoginPage(Page): """"登录页面类"""
def __init__(self, driver):
self.locator = LoginPageLocators
super().__init__(driver)
def enter_username(self, user):
"""
This function enters the username of the user about to log in
:param user:
:return: fills the username textbox:
"""
self.find_element(*self.locator.USERNAME).send_keys(users.users.get_user(user)["username"])
还有一个users.py文件,不过这个就不用展示了。我希望你能得到我在我的代码中实现的结构。
现在进行我的实际任务/测试。我需要实现一个简单的场景:
- 用户1登录失败
- 用户 2 以管理员身份登录并授予用户 1 登录权限
- 用户1登录成功
- 用户2再次登录,删除用户1,可以重复测试,然后注销
这是我目前的实现,效果很好,但出于某种原因我对此不满意。这是代码: 示例:
"""" This module contains the actual tests """
# skipping imports ...
class PageTests(unittest.TestCase):
# efficient set up
@classmethod
def setUpClass(inst):
inst.driver = webdriver.Chrome()
inst.driver.get("http://localhost:9696")
def test_scenario_01(self):
# Setting up page objects
login_page = LoginPage(self.driver)
main_menu = MainMenu(self.driver)
permissions_manager = PermissionsManager(self.driver)
# Assert login of user is unsuccessful
login_page.login("selen003")
self.assertIn("http://localhost:9696/login?reason=incorrect", login_page.get_url(), "User already exists")
# Admin log in and assign permission to User
login_page.login("selen001")
self.assertIn("http://localhost:9696/profile/", login_page.get_url(), "Unsuccessful Admin login")
main_menu.click_pm()
permissions_manager.add_user("selen003")
time.sleep(3)
permissions_manager.logout()
# Attempt login of User again
login_page.login("selen003")
main_menu.logout()
# Delete user, so the test can be re-done
permissions_manager.delete_user("selen001", "selen003")
@classmethod
def tearDownClass(inst):
inst.driver.quit()
if __name__ == "__main__":
unittest.main()
该代码在这种情况下运行得非常好,并成功通过了测试。然而,由于几个原因,我感到不开心,我需要建议:
测试场景是在一个单独的测试方法中,我不能真正为每个单独的动作放置多个断言(我可以,但我听说这真的不切实际),但我真的很想测试每个单独的动作并提高适当的错误(例如:当用户登录时,会在html报告中给出一条消息“STEP 2:用户XXX成功登录”
也许,我应该将场景拆分为多个函数(test_valid_login()、test_invalid_login() 等)并实现一个
TestSuite,它可以导入各个测试并运行它们。但是我不确定在这种情况下这是否是一个有效的解决方案我想知道是否有更有效的方法来做到这一点(并允许将来更容易地实现场景)
我只需要关于如何处理我的测试结构的建议,因为我不确定这是否是一个好的解决方案(有些东西告诉我它不是),如果你能给我一些提示/想法,我将不胜感激。
解决方案
您可以为您的测试创建一个基类(如 PageTests 类)并将常用功能(登录、添加用户、...)与您希望在此步骤中拥有的所有断言和输出一起放在那里。然后从这个类继承你的实际测试用例并调用适当的函数。通过这种方式,您可以重复使用常用步骤而无需重复代码,并在检查所有条件的同时保持测试场景的整洁和最小化。
推荐阅读
- postgresql - 无法重置 postgresql 数据库的密码
- sql-server - 当前年份的第一天和最近一个季度的最后一天的 SSIS 表达式
- mongodb - “上下文中没有事务”异常来自哪里?
- google-apps-script - Google Script onEdit(e) 函数和行范围
- html - 为什么@media only screen and (min-width: 768px) 也适用于小于768px的屏幕宽度
- c# - 我可以在安装 NuGet 包时添加这些 .dll 吗?
- python - 根据行内值和列标题在 pandas 数据框中设置值
- java - 嵌套循环的代码调整以获得更好的性能
- c++ - 什么是固有的安全漏洞
标题? - html - Zendesk 谈话链接