2016-04-13 60 views
0

這裏是我用於使用硒進行端到端測試的代碼片段(我在硒django測試中全新);在django硒測試期間持續登錄

from django.contrib.auth.models import User 
from django.contrib.staticfiles.testing import StaticLiveServerTestCase 
from selenium.webdriver.chrome.webdriver import WebDriver 

class MyTest(StaticLiveServerTestCase): 

    @classmethod 
    def setUpClass(cls): 
     super(DashboardTest, cls).setUpClass() 

     cls.selenium = WebDriver() 
     cls.user = User.objects.create_superuser(username=..., 
               password=..., 
               email=...) 
     time.sleep(1) 
     cls._login() 

    @classmethod 
    def _login(cls): 
     cls.selenium.get(
      '%s%s' % (cls.live_server_url, '/admin/login/?next=/')) 
     ... 

    def test_login(self): 
     self.selenium.implicitly_wait(10) 
     self.assertIn(self.username, 
         self.selenium.find_element_by_class_name("fixtop").text) 

    def test_go_to_dashboard(self): 
     query_json, saved_entry = self._create_entry() 
     self.selenium.get(
      '%s%s' % (
       self.live_server_url, '/dashboard/%d/' % saved_entry.id)) 
     # assert on displayed values 

    def self._create_entry(): 
     # create an entry using form and returns it 

    def test_create(self): 
     self.maxDiff = None 
     query_json, saved_entry = self._create_entry() 
     ... assert on displayed values 

我注意到,在每次測試之間登錄是不持續的。所以我可以在setUp中使用_login,但讓我的測試變慢。

那麼如何在測試之間保持持久登錄呢?測試這些測試(djnago硒測試)的最佳做法是什麼?

回答

0

kevinharvey指出我的解決方案!終於找到了一種方法來減少測試時間和跟蹤所有測試:

我已經改名開始test.._test_..所有方法,並補充說調用每個_test_方法的主要方法:

def test_main(self): 
    for attr in dir(self): 
     # call each test and avoid recursive call 
     if attr.startswith('_test_') and attr != self.test_main.__name__: 
      with self.subTest("subtest %s " % attr): 
       self.selenium.get(self.live_server_url) 
       getattr(self, attr)() 

這方式,我可以單獨測試(調試)每種方法:)

1

通過Selenium的瀏覽器測試時間很慢。但是,它們非常有價值,因爲它們是您實現真正用戶體驗自動化的最佳選擇。

你不應該嘗試用Selenium編寫真正的單元測試。相反,用它來寫一個或兩個大功能測試。嘗試從頭到尾捕捉整個用戶交互。然後構建您的測試套件,以便您可以單獨運行快速的非Selenium單元測試,並且有時只需運行緩慢的功能測試。

您的代碼看起來很好,但在這種情況下,您可以將test_go_to_dashboardtest_create合併爲一種方法。

+0

謝謝:)我分裂測試對主要應用程序功能,因爲如果我使用大型測試;它會在第一次失敗後退出,我將無法測試我的其他場景。 –

+1

對。這就是爲什麼Selenium測試很脆弱,但我仍然認爲正確的做法是編寫一個具有大量重複action-assertion-action-assertion的函數。如果您想要針對目標功能提供快速反饋,請在沒有Selenium的情況下編寫單元測試。 下面是一個我使用很多的例子:https://github.com/kevinharvey/jmad/blob/test-driven-django-development/jmad/jmad/tests.py#L47 – kevinharvey

相關問題