Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要关于测试类结构的建议(Python、Selenium)_Python_Selenium_Testing_Automated Tests_Qa - Fatal编程技术网

需要关于测试类结构的建议(Python、Selenium)

需要关于测试类结构的建议(Python、Selenium),python,selenium,testing,automated-tests,qa,Python,Selenium,Testing,Automated Tests,Qa,我目前正在开发QA测试系统,我正在使用Python和Selenium。我目前的项目结构如下: locators.py-包含页面上的所有定位器 例如: base page.py-基本页类 例如: pages.py-这里有我所有的页面类,下面是一个小示例: 例如: 类登录页(第页): “”登录页面类“” 还有一个users.py文件,但不需要显示这个文件。我希望您可以获得我在代码中实现的结构 现在开始我的实际任务/测试。我需要实现一个简单的场景: 用户1登录失败 用户2以管理员身份登录,并授予用户

我目前正在开发QA测试系统,我正在使用Python和Selenium。我目前的项目结构如下:

locators.py-包含页面上的所有定位器

例如:

base page.py-基本页类

例如:

pages.py-这里有我所有的页面类,下面是一个小示例:

例如:

类登录页(第页): “”登录页面类“”

还有一个users.py文件,但不需要显示这个文件。我希望您可以获得我在代码中实现的结构

现在开始我的实际任务/测试。我需要实现一个简单的场景:

  • 用户1登录失败
  • 用户2以管理员身份登录,并授予用户1登录权限
  • 用户1成功登录
  • 用户2再次登录并删除用户1,以便可以重复测试,并且 注销
这是我当前的实现,它工作得非常好,但出于某些原因,我对此感到不高兴。下面是代码: 例如:

代码在这个场景中运行得非常好,并成功地进行了测试。但是我感到不高兴,原因有两个,我需要建议:

  • 测试场景是在一个单一的测试方法中,我不能真正地 每个单独行动的多个断言(我可以,但我有 听说这是真的不现实),但我真的很想测试每一个 单独操作并提出适当的错误(例如:当 用户登录后,html报告“步骤2: 用户XXX成功登录“

  • 也许,我应该将场景拆分为多个函数 (测试有效登录()和测试无效登录()等)并实现一个
    TestSuite,它导入单个测试并运行它们 我不确定在这种情况下这是否是一个有效的解决方案

  • 我想知道是否有更有效的方法来做这件事(并且允许 以便于将来实现场景)


我只是需要关于如何处理我的测试结构的建议,因为我不确定这是否是一个好的解决方案(有些事情告诉我它不是),如果您能给我一些提示/想法,我将不胜感激。

您可以为您的测试创建一个基类(如PageTests类)并放置常用函数(登录、添加用户等)这里包含了您希望用于此步骤的所有断言和输出。
然后从该类继承实际的测试用例,只需调用适当的函数。这样,您就可以重复使用常用步骤,而无需重复代码,并在检查所有条件的同时保持测试场景整洁和最小化。

感谢您的想法,我们将尝试一下!
  class LoginPageLocators(object):
      """ Login Page Locators """

      USERNAME = (By.ID, 'username') #username text-box
      ....
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)
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"])
       """" 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()