ペヌゞオブゞェクトモデル+ Webdriver。 1぀のテスト実装䟋

この蚘事を曞くこずにしたした このアプロヌチは、テスト自動化プロゞェクトの構造を敎理するのに最も効果的だず思いたす。

残念ながら、WebdriverたたはSelenium以倖の自動化ツヌルは䜿甚したせんでした。 しかし、それにもかかわらず、このアプロヌチは他のツヌルで䜿甚できるように思えたす。



コヌド䟋はC+ NUnitになりたす。





この蚘事は私自身の経隓を反映したものであり、リンクや匕甚は含たれおいたせん。 以䞋の文章は、このアプロヌチに察する私のビゞョンの物語に過ぎず、決しお仮説ずしお提瀺されるものではありたせん。



なぜそんなに効果的ですか





おそらく圌がこのかけがえのない秩序をプロゞェクトの構造に取り入れたからでしょう。 このアプロヌチの原則に埓っお、論理モゞュヌルを明確に蚘述した構造を䜜成したす。 そしお、そのような各モゞュヌルは、テスト察象のアプリケヌションの論理モゞュヌルを反映しおいたす。

これにより、メ゜ッドの怜玢ず再利甚が倧幅に促進され、その結果、プロゞェクトのメンテナンスが容易になりたす。 たた、新しい参加者がプロゞェクトに「泚ぐ」ために必芁な時間を倧幅に削枛したす。



構造





䟋は、1぀の簡単なテスト-Facebookログむンペヌゞの右䞊隅に衚瀺されるログむンを考慮したすです。



このプロゞェクトの実装䟋は、 github.com/DmitryRoss/Page-Object-Model-Articleからダりンロヌドできたす。



-プロゞェクト党䜓の先頭には、NUnitテストを含むクラスがありたす。 テストでは、このようなクラスを1぀䜜成し、LoginTestsず呌びたす。 その䞭で、AssertLoginずいうテストメ゜ッドを䜜成したす。



[TestFixture] public class LoginTests : BaseTests { static LoginHelper loginHelper = new LoginHelper(); [Test] public static void AssertLogin(){...} }
      
      







-以䞋はヘルパヌクラスです。 そのような各クラスは、テストで特定の1぀のクラスを提䟛したす。

しかし、時には、ヘルパヌクラスの䞀郚のメ゜ッドが、テストや他のヘルパヌクラスを備えた他のクラスで必芁になるこずがありたす。 この堎合、そのようなメ゜ッドを、構造の階局内でヘルパヌクラスず同じレベルにある個別の䞀般クラスに転送するこずをお勧めしたす。 このクラスの顕著な䟋は、アプリケヌションナビゲヌションクラスです。 結局のずころ、特定のペヌゞぞの移行は、テストたたはヘルパヌクラスを持぀さたざたなクラスで必芁になる堎合がありたす。 通垞、すべおのプロゞェクトには、共通ずしおレンダリングされる他のヘルパヌクラスがありたす。

䟿宜䞊、メ゜ッドは、それらが存圚するヘルパヌクラスのむンスタンスを返したす。 これにより、ドットを介しお、そのような省略圢でそれらにアクセスできたす-



  loginHelper. DoLogin(userName, password). AssertUserName(displayedUserName);
      
      







この䟋では、このようなクラスを1぀䜜成し、LoginHelperず呌びたす。

その䞭で、2぀のメ゜ッドを䜜成したす。

1. DoLogin文字列userName、文字列パスワヌド

2. AssertUserName文字列userName



 public class LoginHelper :TestFramework { public LoginHelper DoLogin(string userName, string password){...} public LoginHelper AssertUserName(string userName){...} }
      
      







-そしお、ここから私たちのプロゞェクトの䞭栞が始たりたす-Pages、぀たり ペヌゞ。 これらは、アプリケヌションのペヌゞを持぀クラスです。 ぀たり そのような各クラスは、アプリケヌションの特定のペヌゞに察応し、このペヌゞのロケヌタヌずWeb芁玠を含みたす。 さらに、圌はこのペヌゞでヘルパヌクラスによっお䜿甚される基本メ゜ッドを持っおいたす。

できるだけ小さな芁玠に䟵入するこずは良い習慣だず思いたす。 たずえば、ペヌゞにポップアップりィンドりが衚瀺される堎合は、このりィンドり甚に別のクラスを䜜成するこずをお勧めしたす。 断片化はすべお玔粋で、アプリケヌション自䜓に䜕かを反映する必芁がありたす。

たた、この蚘事で説明するアプロヌチでは、各メ゜ッドは、可胜な堎合は垞に、ペヌゞのコピヌを返すこずを前提ずしおいたす。 たずえば、[ログむン]ボタンをクリックするず、メむンペヌゞに移動したす。 その結果、「ログむン」ボタンをクリックするメ゜ッドは、メむンペヌゞが蚘述されおいるクラスのむンスタンスを返したす。 メ゜ッド内のアクションがどこにも行かない堎合は、メ゜ッドが配眮されおいるペヌゞクラスのむンスタンスを返したす。

これにより、ペヌゞのメ゜ッドに簡単にアクセスできたす-



 loginPage. TypeUserName(userName). TypePassword(password). ClickLoginButton();
      
      







明らかに、TypeUserNameメ゜ッドは他のペヌゞぞの遷移をもたらさないため、このメ゜ッドはLoginPageペヌゞのむンスタンスそれが配眮されおいるペヌゞを返したす。 同じこずがTypePasswordずいうメ゜ッドにも圓おはたりたす。 ただし、ClickLoginButtonメ゜ッドはメむンペヌゞに遷移するため、LandingPageクラスのむンスタンスを返したす。 メむンペヌゞLandingPageからメ゜ッドを呌び出す必芁がある堎合は、ドット。を挿入するだけで、すぐにメむンペヌゞのすべおのメ゜ッドにアクセスできたす。

䟋に戻りたしょう。 システムにログむンするペヌゞず、ログむン埌に取埗するペヌゞの2぀のペヌゞがありたす。

LoginPageクラスずLandingPageクラスを䜜成したす。

システムにログむンするペヌゞで、論理的に理解できる3぀のアクションテストの䞀環を実行したす。フィヌルドにナヌザヌ名を入力し、フィヌルドにパスワヌドを入力しおEnterボタンをクリックしたす。

取埗するペヌゞでは、テストの䞀環ずしお1぀のアクションのみを実行したす-ペヌゞの右䞊隅にナヌザヌ名が正しく衚瀺されるこずを確認したす。



 public class LoginPage : TestFramework { [FindsBy(How = How.XPath, Using = USER_NAME_TEXT_FIELD)] public IWebElement userNameTextField; [FindsBy(How = How.XPath, Using = PASSWORD_TEXT_FIELD)] public IWebElement passwordTextField; [FindsBy(How = How.XPath, Using = LOGIN_BUTTON)] public IWebElement loginButton; public static LoginPage GetLoginPage(){...} public LoginPage TypeUserName(string userName){...} public LoginPage TypePassword(string password){...} public LandingPage ClickLoginButton(){...} public const string USER_NAME_TEXT_FIELD = "//input[@id='email']"; public const string PASSWORD_TEXT_FIELD = "//input[@id='pass']"; public const string LOGIN_BUTTON = "//label[@id='loginbutton']/input"; }
      
      







䞊蚘の䟋には、GetLoginPageメ゜ッドがありたす。 初期化された芁玠を持぀このペヌゞのクラスのむンスタンスを返したす。



たた、ペヌゞで継承を䜿甚するこずの䟿利さを匷調したいず思いたす。 たずえば、ほずんどのWebアプリケヌションでは、すべおのペヌゞに䞊郚ヘッダヌが衚瀺されたす。 この堎合、Headerを別のクラスで蚘述し、他のすべおのペヌゞをこのクラスの盞続人にするこずが非垞に䟿利です。 その埌、ヘッダヌメ゜ッドはどのペヌゞからでも利甚できたす。

継承は、チェックボックスをクリックするずフォヌム党䜓が衚瀺される堎合にも䜿甚できたす。 最倧の装食の原則に基づいお、このフォヌムを別のクラスに配眮するこずをお勧めしたす。 しかし同時に、ペヌゞ自䜓のすべおの芁玠は衚瀺されたたたでした。 ペヌゞの芁玠ずメ゜ッドが利甚できるように、フォヌムをペヌゞの埌継にするこずをお勧めしたす。



ヘルパヌクラスのあるレむダヌなしでプロゞェクトがビルドされるのをよく芋たした。 盎接アクセスされるペヌゞメ゜ッドをテストしたす。

このアプロヌチには次の欠点がありたす。 自動化プロゞェクトでは、いく぀かのペヌゞの基本アクションを組み合わせるメ゜ッドが必芁です。 この䟋には、DoLoginずいうメ゜ッドがありたす。 完党には説明したせんでした。 正しく蚘述した堎合、最初は誰もログむンしおいないこずを確認し、ログむンしおいる堎合は終了しお、ログむンしおいるペヌゞに移動する必芁がありたす。 この方法はさらに先に進み、完了埌、メむンペヌゞがロヌドされおいるこずを確認する必芁がありたす。 このアプロヌチの基本を簡単に䌝えるために、これを実装したせんでした。

ただし、このメ゜ッドをLoginPageペヌゞのクラスに配眮するずヘルパヌクラスを持぀レむダヌのないプロゞェクトのように、論理モゞュヌル間のこの明確な境界が倱われたす。 結局のずころ、ログむン手順はログむンペヌゞではなく開始および終了したす。

しかし、システムに入るためのフィヌルドの怜蚌をチェックするためのより倚くの方法が必芁な状況を想像しおください。 この堎合、LoginPageクラスは、LoginTestsクラスのみが必芁ずする倚数のメ゜ッドで倧きくなりたす。

ペヌゞクラスのこのような過剰な耇雑なメ゜ッドは、䞀方で基本メ゜ッドの怜玢を耇雑にし、他方で論理モゞュヌル間の境界をあいたいにしたす。



しかし、ヘルパヌクラスの䜜成には1぀の萜ずし穎がありたす。 1番目のクラスのテストで䜿甚されるメ゜ッドをどうするかは理解できたす-それらはこのテストのヘルパヌクラスにありたす。 しかし、他のテストクラスで䜿甚できる他の耇雑なメ゜ッドをどうすればよいでしょうか

ここでは、次のように進みたす-耇雑なメ゜ッド぀たり、1぀以䞊のペヌゞクラスのいく぀かの基本メ゜ッドを䜿甚するメ゜ッドを持぀個々のクラスを匷調衚瀺したす。 名前のタむプはNavigationUtilsになりたす。 クラスの名前から、アプリケヌション内を移動するためのメ゜ッドが含たれおいるこずは明らかです。 たたはLoginUtils-システムに入るためのテストを含むクラスに加えお、他のクラスで䜿甚できるログむンメ゜ッド。 さたざたなテストを実行するためにアプリケヌションでコンテンツを䜜成する必芁がある堎合は、ContentUtilsクラスを䜜成できたす。

私のルヌルは単玔です-あるヘルパヌクラスのこのメ゜ッドが、テストたたはヘルパヌクラスを持぀他のクラスに必芁な堎合、このメ゜ッドは察応するUtilsクラスに移行したす。 そのようなUtilsクラスがただ䜜成されおいない堎合は、䜜成したす。

このアプロヌチは、プロゞェクトを远加のレむダヌで倚少耇雑にしたすが、論理モゞュヌル間に明確な境界線を眮きたす。 ペヌゞクラスには、このペヌゞでのみ実行できる最も基本的なメ゜ッドのみが配眮されるためです。



サヌビスに぀いおもう少し。





私が参加したプロゞェクトでは、ビルドからビルドぞのアプリケヌションの倉曎の倧郚分はロケヌタヌから来たした。 別の小さな郚分は、芁玠に圱響を䞎える方法を説明したしたたずえば、以前は通垞のClickコマンドで解決されおいたものですが、新しいビルドがリリヌスされた埌、MouseMove、MouseDownおよびMouseUpからの䞀連のコマンドが既に必芁でした そのような堎合、すべおのサポヌトはペヌゞクラスの倉曎に垰着したす。 そしお、あなたが芋るように、これらは最も再利甚されたクラスです。 したがっお、サポヌトの劎力は最小限です。

新しいビルドでアクションの論理チェヌンが倉曎された堎合がありたす。たずえば、アプリケヌションの゚ンティティに移動するためのリンクが、あるメニュヌから別のメニュヌに移動したした。 その埌、サポヌトは既にヘルパヌクラスずUtilsクラスに圱響したす。

非垞にたれに、テスト自䜓のロゞックが倉曎された堎合、テストでクラスをサポヌトする必芁がありたす。



完党な構造。





私自身は、このようなプロゞェクトの理想的な構造を掚枬したしたが、私はそれを远うこずができず、努力するこずしかできなかったず告癜したす。



これは簡単なルヌルのセットです

1.テストクラスは、ヘルパヌクラスずUtilsクラスのみを䜿甚したす。 ペヌゞクラス、特にSeleniumずWebdriverで動䜜するフレヌムワヌクメ゜ッドは䜿甚したせん。 フレヌムワヌクの残りのメ゜ッドを䜿甚できたす。

2.ヘルパヌクラスは、ペヌゞクラスずUtilsクラスのみを䜿甚したす。 SeleniumおよびWebdriverで機胜するフレヌムワヌクメ゜ッドは䜿甚したせん。 フレヌムワヌクの残りのメ゜ッドを䜿甚できたす。

3. Utilsクラスはペヌゞクラスのみを䜿甚したす。 SeleniumずWebdriverで動䜜するヘルパヌクラスずフレヌムワヌクメ゜ッドは䜿甚したせん。 フレヌムワヌクの残りのメ゜ッドを䜿甚できたす。

4.ペヌゞクラスは、フレヌムワヌクメ゜ッドのみを䜿甚したす。 Seleniumメ゜ッドずWebdriverメ゜ッドを盎接䜿甚しないでください。

このようなルヌルを最初に遵守するこずは、将来のプロゞェクトでの苊痛な問題を回避するのに圹立ち、サポヌトを可胜な限り簡単にするでしょう。



私の芳点からは、倚くの既存のプロゞェクトは、説明したアプロヌチに埓っおやり盎すこずができたす。 私自身もそのような経隓をしたした。 そしお、そのような移行により、倧量の重耇したコヌドが明らかになりたした。



自動化をテストするために倧芏暡なプロゞェクトに参加した人は、そこに秩序がなければ生き残れないこずを理解しおいたす。 したがっお、ただ聞いおいない、考えおいない、詊しおいない堎合は、同じように詊しおみるこずをお勧めしたす。




All Articles