2016-04-13 12 views
0

ここでは、セレニウムを使った私のエンドツーエンドテスト(私はセレンのジャンゴテストでは全く新しい)のスニペットです。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_メソッドを呼び出すmainメソッドを追加しました:

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で真の単体テストを書くべきではありません。代わりに、それを使用して1つまたは2つの大きな機能テストを記述します。最初から最後までユーザーインタラクション全体をキャプチャしてみてください。テストスイートを構造化して、高速で非セレン単位テストを個別に実行できるようにし、時々遅い機能テストを実行するだけです。

コードは正常ですが、このシナリオではtest_go_to_dashboardtest_createを1つの方法に組み合わせます。

+0

ありがとう:)私は大きなアプリケーションを使用する場合、主なアプリケーションの機能とテストを分割します。それは最初の失敗の後に終了し、私は残りのシナリオをテストすることができません。 –

+1

これはセレンのテストが脆弱である理由ですが、私はまだそれを行う正しい方法は、多くの反復アクションアサーションアクションアサーションを持つ単一の関数を書くことだと言っています。ターゲットとされた機能をすばやくフィードバックしたい場合は、セレンなしで単体テストを作成してください。 私がよく使っている例は次のとおりです。https://github.com/kevinharvey/jmad/blob/test-driven-django-development/jmad/jmad/tests.py#L47 – kevinharvey