1

找到了很多关于这个问题的主题,但没有找到任何简单描述的问题解决方法,所以用这个问题创建新主题,也许会得到更好的答案。

我为 LoginTest 创建了测试用例,为LegalPersonSearchTest创建了测试用例。这两个测试用例都在单独的文件login.pylegalPersonSearch.py

from utils.utils import *
from selenium import webdriver
from locators.locators import Locators
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
from pages.loginPage import LoginPage


class LoginTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
    cls.driver = webdriver.Firefox()
    cls.driver.implicitly_wait(10)
    cls.driver.maximize_window()
    cls.driver.get(URL)

def test_valid_login(self):
    driver = self.driver

    login = LoginPage(driver)
    login.fill_login_form(adminUsername, adminPassword)
    login.click_login_button()


if __name__ == '__main__':
    unittest.main()

我认为在测试之间打开新浏览器的原因是在第二个文件中声明驱动程序。

from selenium import webdriver
import unittest
from pages.legalPersonSearchPage import LegalPersonSearchPage

class LegalPersonSearchTest(unittest.TestCase):

@classmethod
def setUpClass(cls):
    cls.driver = webdriver.Firefox()

def test_valid_organization_search(self):
    driver = self.driver
    legal = LegalPersonSearchPage(driver)

    legal.open_legal_person_search_page()

@classmethod
def tearDown(cls):
    cls.driver.quit()


if __name__ == '__main__':
    unittest.main()

如何修改浏览器只打开一次的LoginTest ,而不是在测试之间?

我需要修改它,因为登录后(这是测试的 1/2)是测试的第二部分。它将完成,然后浏览器关闭并打开新的并重新登录。

正如有人告诉我的那样,最佳实践是将登录测试部分排除在整个测试之外。

4

1 回答 1

1

要回答您的一个问题 -driver被打开两次,因为您有两种不同setUp()的方法,一种用于您的每个课程 -LoginTestLegalPersonSearchTest. 当你运行时test_valid_login,你的setUpClass()方法会被调用,它会初始化driver. 然后,试运行。这个driver实例永远不会被拆除,所以窗口保持打开状态。

然后,test_valid_organization_search跑。这个类也有它自己的setUpClass()方法,它初始化另一个driver实例。所以现在你有两个驱动程序,它们都是在setUpClass()每个类文件的方法中打开的。

此设置正在产生您不希望的结果。我认为您稍微误解了“最佳做法是将登录测试部分排除在整个测试之外”的含义。

这并不意味着您需要编写两个单独的测试——一个用于登录,另一个用于测试其余功能。这实际上是一种不好的做法,因为您希望您的测试用例彼此独立运行——测试用例不应该依赖以前的测试用例来正确执行。

我认为您在这里寻找的解决方案是将登录功能写入您的setUp()方法,以便始终在测试用例开始之前执行登录。

这种方法将阻止您在测试中使用登录部分——这是您在此处提到的原始目标。

您可以通过删除重复setUp()方法并继承LoginTest到您的方法来调整您的类,LegalPersonSearchTest以便您只设置一次:

from utils.utils import *
from selenium import webdriver
from locators.locators import Locators
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import unittest
from pages.loginPage import LoginPage

# this is our "base" class
class LoginTest(unittest.TestCase):

driver = None # driver instance that we will inherit into LegalPersonSearchTest

# initialize driver, go to testing URL, etc.
def setUp(cls):
    cls.driver = webdriver.Firefox()
    cls.driver.implicitly_wait(10)
    cls.driver.maximize_window()
    cls.driver.get(URL)

    # call login here to login before test
    login_page = LoginPage(cls.driver)
    login_page .fill_login_form(adminUsername, adminPassword)
    login_page .click_login_button()

# move teardown into same class as setUp()
def tearDown(cls):
    cls.driver.quit()

我们已经声明了一个类变量driver,您可以将其传递给LegalPersonSearchTest. 我们还删除了__main__调用,因为我们需要的唯一入口点是test_方法LegalPersonSearchTest

from selenium import webdriver
import unittest
from pages.legalPersonSearchPage import LegalPersonSearchPage
from login_test import LoginTest # unsure of file name containing LoginTest class

class LegalPersonSearchTest(LoginTest): # inherit LoginTest here so we can use driver


def test_valid_organization_search(self):

    legal_page = LegalPersonSearchPage(self.driver)
    legal_page .open_legal_person_search_page()


if __name__ == '__main__':
    unittest.main()

我们在这里改变了一些东西:

  • 由指定的 main 方法的入口点__main__——我们只需要在一个地方,在测试用例级别 ( LegalPersonSearchTest)
  • 删除setUp()了导致创建多个驱动程序实例的重复方法调用(在您的问题描述中提到)
  • 在类中创建驱动程序的单个类实例LoginTest以传递给LegalPersonSearchTest
  • 修改setUp()LoginTest初始化驱动程序和登录的方法——这样您就不必为任何测试包含登录代码!

更新:做出以下评论的更改:

  • 从类中删除login了方法并将登录代码移到了下面——这将在每个测试用例之前执行LoginTestsetUp()
  • 修改为在初始化 PageObject 时test_valid_organization_search使用self.driver而不是driver

我已经根据我推送到我的 GitHub的这个示例 Python 测试架构进行了许多这些更改。我用作模板的文件是base_test_fixture.py(用于您的LoginTest)和test_web_driver.py用于您的LegalPersonSearchTest.

您可能会注意到base_test_fixture.py它还包含def _testInitialize()def _testCleanup()-- 这些方法可以在您的类中重写以执行要在您的方法之前运行的其他步骤。这里的想法是,如果您有多个包含测试用例的文件,但每个文件需要稍微不同的设置,那么您需要做的不仅仅是方法调用。您可以覆盖测试用例类中的和方法,这些方法将在实际方法之前之前执行。LegalPersonSearchTesttest_.py.pysetUp()testInitialize()testCleanup() setUp()test_

如果您对此有任何疑问,请告诉我——这需要解释很多,但是一旦您学习了这种架构,您就有了一种非常强大的方式来组织和执行您的测试用例。

于 2019-11-22T22:28:36.083 回答