2012-03-08 26 views
0

大きなWebサイトのテストフレームワークを作成しています。現在、UIドライバのモデリング作業中です。私はブラウザとモバイルデバイス用のエミュレータとドライバを抽象化したUIセッションを持っています。このオブジェクトはまた、ページオブジェクトの履歴を含むブラウザセッションに関する状態情報を保持します。ページオブジェクトの先頭は現在のページです。私の問題は、私のページオブジェクトがブラウザからデータを読み込むのを遅らせることです(データを抽出したかどうかを確認するgetterで設定されたプロパティ、もしそうでなければ、現在のページかどうか、もしそうならば、ブラウザを使用してページオブジェクトにキャッシュする)が、セッションによって提供される抽象レイヤーにアクセスする必要があることを意味します。呼び出し元に基づいた呼び出し元の振る舞いを、リフレクションなしで呼び出し元をPythonでメンバーにする方法

最初の考えは、セッションをページに固定していただけですが、循環参照が作成されていますが、これは悪いことです。私はまた、ページ用の複数のインターフェースを定義しようと考えていましたが、本当にうまくいくか見えませんでした。私が本当に必要とするのは、セッションでコールを傍受し、セッションを引数としてセッションを取る隠しゲッターにページをリダイレクトさせてもらうことですが、それを行う方法を理解することはできませんでした。

情報やアクセスを得るために私がここで使用できる良い解決策やデザインパターンはありますか?私は循環参照を持たずに、または遅延読み込みを断念する必要はありません。私はインターフェイスをより複雑にしたくない場合があります。時にはメソッドを呼び出したり、同じ情報にアクセスするためにプロパティやメンバを呼び出すこともあります(その考え方は、背後の派手なフットワークを隠し、フレームワークを単純なものにすることです)。

私はCurrentPageクラスを実際に持っていますが、これはすべて、ナビゲートイベントでセッションによって設定されたクラス変数にcurrent_pageを格納しているため、current_pageを唯一の魔法のグローバルスタイルのアクセサにすることができると思います実際にページからデータを取得し、特別なインターフェイスを使用してセッションオブジェクトを格納する方法もありますが、それは私にとっては魅力的ではないようです。

誰もが何か提案がありますか?

+1

なぜ独自のフレームワークを作成していますか?セレンなどがあなたのニーズを満たしていない理由はありますか? – Daenyth

+0

@Daenythドメイン固有のロジックを実装するために、セレンの上にあります。前述のとおり、複数のエミュレータやブラウザドライバも抽象化しているため、同じフレームワークでモバイルテストを行うことができます。もちろん、それはポイントのそばに完全にあります... –

答えて

1

あなたは言った:

は「当然の最初のアイデアは、ちょうどページでセッションを貼り付けましたが、それは悪い循環参照を作成します。」

しかし、それは当てはまりません。循環参照は、非循環の方法と同じようにすぐにガベージ・コレクションを収集することはなく、__del__メソッドは呼び出されませんが、これらの制限を認識し、それらと矛盾する必要がない限り、循環参照は問題ありません。参照:

http://docs.python.org/reference/datamodel.html#object.__del__

ページがセッションへの参照を格納持つことは問題ないはずです。

編集:あなたはセッション内部構築する必要はありません限り

# session.py 
import page 
class Session(object): 
    def __init__(self): 
     self.page_list = [] 
    def addPage(self, url): 
     self.page_list.append(page.Page(self, url)) 

# page.py 
class Page(object): 
    def __init__(self, session, url): 
     self.session = session 
     self.url = url 

:セッションとページが別のファイルにあり、円形輸入が問題となっている場合、あなたはこのようなアプローチを使用することができますpage.pyの場合は、資本Sセッション(クラス)は必要ないため、これをまったくインポートする必要はありません。それが変更された場合は、次のようなことができます:

# page.py 
class Page(object): 
    # ... 
    def something(self): 
     import session 
     self.other_session = session.Session() 
+0

私はちょうどこれと一緒に行くと思います。私は本当にそれが好きではありませんが、それは迅速かつ汚れて動作します... –

+0

循環参照を使用することを嫌っている理由は不明です。あなたが詳細にカバーしていない、あなたの問題に対する追加の制限や制約がありますか? –

+0

私の過去の経験は、コードが維持され、機能が追加されると、循環参照が循環輸入に変わり、循環輸入が循環頭痛を引き起こすという経緯があります。 –

関連する問題