【问题标题】:Selenium Tests very slow in between individual tests硒测试在个别测试之间非常慢
【发布时间】:2016-05-02 18:13:14
【问题描述】:

我使用 Django 1.4、Selenium 2.53.1 和 Chrome Webdriver 2.21 作为我的测试网络驱动程序来测试我的 Django 应用程序。

我这样初始化我的类:

class SeleniumTest(LiveServerTestCase):

@classmethod
def setUpClass(cls):
    cls.display = Display(visible=0, size=(800, 600))
    cls.display.start()
    cls.driver = webdriver.Chrome()
    cls.driver.set_page_load_timeout(15)
    cls.driver.maximize_window()
    super(SeleniumTest, cls).setUpClass()

def setUp(self):

    settings.SESSION_ENGINE = 'django.contrib.sessions.backends.db'
    engine = import_module(settings.SESSION_ENGINE)
    self.sessionStore = engine.SessionStore()
    self.sessionStore.save()
    username = 'hello'
    password = 'hello'
    self.cad_user, created = User.objects.get_or_create(username=username, email='hello@hello.com')
    self.cad_user.set_password(password)
    self.cad_user.save()

    try:
        self.get_url('login')
        if self.driver.title == 'Login':
            self.driver.find_element_by_id('id_username').send_keys(username)
            self.driver.find_element_by_id('id_password').send_keys(password)
            self.driver.find_element_by_css_selector('input[type="submit"]').click()

下面是我的一个测试示例。它会测试一个包含多个级别的下拉菜单,这些下拉菜单会在您将鼠标移到它们上方并检查它们是否指向正确的链接

def dropdown_check(self, header_ids, choice_id, title):
    choice = self.driver.find_element_by_id(choice_id)
    mouse = webdriver.ActionChains(self.driver)
    for header_id in header_ids:
        header_element = self.driver.find_element_by_id(header_id)
        WebDriverWait(self.driver, 1).until(EC.element_to_be_clickable((By.ID, header_id)))
        mouse.move_to_element(header_element)
        mouse.perform()
    WebDriverWait(self.driver, 1).until(EC.element_to_be_clickable((By.ID, choice_id)))
    choice.click()
    self.assertEquals(self.driver.title, title)

def test_my_status_navigation(self):
    self.dropdown_check(['menubar_my_status'], 'menubar_my_status', 'User Status')

我已经尝试过这些事情:

  1. 我已经为每个测试的代码计时,它们只需要不到一秒钟的时间。
  2. 我还为 setup 和 setupclass 方法计时,它们最多需要 2 秒。
  3. 我已将 set_page_load_timeout 设置为 0,它不会改变总体执行时间。
  4. 我通过每轮添加一个额外的测试来运行测试,发现每次测试都会增加大约 40 秒的总测试套件时间。

鉴于此,整个 8 项测试套件需要 300 多秒,我不知道为什么。我确信 Webdriver 的加载需要一些时间,但是在每个单独的测试结束后,我可以看到 Webdriver 只是坐在那里什么都不做。

【问题讨论】:

  • 不知道细节很难回答。您能否展示您的测试,如何初始化 webdriver,selenium 和 django 的版本,您使用的是什么浏览器和版本?谢谢。
  • @alecxe 我已经用你提到的内容更新了问题!我希望这会有所帮助
  • 非常感谢。会不会是虚拟显示的启动占用了大部分时间?您能否衡量对绩效产生最大负面影响的因素?
  • @alecxe 我通常在没有虚拟显示器的情况下运行(当我开发时),它需要相同的时间。我刚查了一下,整个setUpClass方法只需要2秒。
  • @alecxe 这也是我遇到的问题之一,我不确定如何使用 django 测试来测试/观察哪些行正在运行以查看影响性能的因素。

标签: django python-2.7 selenium selenium-webdriver


【解决方案1】:

最大的问题是LiveServerTestCase 是 Django 项目中所有测试用例中最慢的。它继承自TransactionTestCase

TransactionTestCase 继承自 SimpleTestCase 添加一些 特定于数据库的功能:

在每次测试开始时将数据库重置为已知状态 以简化测试和使用 ORM。

Django的TestCase类是一个比较常用的子类 使用数据库事务工具的 TransactionTestCase 加快将数据库重置为已知状态的过程 每个测试的开始。

因此,您的每个测试都会导致数据库被完全重置,这真的很慢。一种解决方案是使用 -k 或 --keep 选项。

./manage.py test -k myapp

这将使您的测试执行时间至少缩短 100 秒。

还有另一种解决方案不能适用于所有条件,因为 TestCase 不能用于 Selenium 测试。但是,您可以编写连接到开发服务器的独立 selenium 测试以加快某些测试。在这种情况下,您使用来自 python 的unittest.TestCase 而不是django.test.testcases.TestCase。这听起来完全令人困惑,所以让我举个例子!

from unittest import TestCase
from selenium import webdriver

class SeleniumTest(TestCase):


    def setUp(self):
        # usual code to setup drivers etc

    def testSomething(self):
        self.driver.get('localhost:8000/somepage')

        # now you are connecting directly to the development server.  
        # this approach is not suitable for all requirements but 
        # very fast compared to using a LiveServerTestCase

最后但同样重要的是:通常您根本不需要 LiveServerTestCase 或 selenium 测试。使用 django test client 更快更容易

【讨论】:

  • 用一个例子更新了我的答案。
【解决方案2】:

我已将其范围缩小到与 Django 以及它如何与数据库交互有关的内容,因为我使用了 setupsetUpClass 以及我的测试方法:

def setUpClass(cls):
    pass

并且总体时间不会改变,将数据库更改为 sqlite3 会显着减少总测试时间,但会出现一些错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多