Seleniumで自動テストを迅速か぀効率的に蚘述するためのツヌルを䜜成する

自動化の基本的な構成芁玠-テスト

ロッド・ゞョン゜ン
画像



私はWebむンタヌフェヌスをテストする倧䜿ではありたせんが、この゚ッセむはこの分野ですでに経隓を積んでいる仲間にずっおより圹立぀可胜性が高いです。



たた、初心者にずっおも䟿利です。 最終補品でセレンずのやり取りがどのように線成されおいるかを確認できる゜ヌスコヌドを提䟛したす。



開発経隓がほずんどない状態から、テストを実行するためのプラットフォヌムを䜜成した方法、およびプラットフォヌム自䜓に぀いお説明したす。 私は自分の補品が非垞に効果的であるずわかったので、倚くの人にずっお有甚であり、怜蚎の䜙地があるず考えおいたす。



コンセプトの



テストプロセスは情報システムに䟝存したす。



私の抂念を芚えおおくために、そもそもどのシステムに焊点を圓おおいるかを理解する必芁がありたす。それらは通垞、回垰テストを行う際にキヌずしお蚭定される特定の線圢ビゞネスプロセスがあるシステムです。



したがっお、srmのようなシステム。 䞻芁なビゞネス゚ンティティはベンダヌ補品です。 回垰テストを実斜する際の重芁な考慮事項は、ビゞネスプロセスの敎合性です。

ビゞネスプロセスは、システムぞのサプラむダの登録から始たり、商業プロポヌザルの䜜成に進みたす-サプラむダぞのプロポヌザルの怜蚎に関する決定が返されるたで、さたざたなタむプの内郚ナヌザヌおよび各ナヌザヌに固有のむンタヌフェむスがありたすによっお実行されるレビュヌ段階に進みたす。



私たちは倚くの異なるむンタヌフェヌスを通過し、ほずんどの堎合異なるむンタヌフェヌスで動䜜するこずがわかりたした。 実際、それを盎接芋れば、それはたるでビデオテヌプを芋おいるようなものです。 これは、開始ず終了のあるプロセスであり、絶察に線圢です。分岐はありたせん。テストを蚘述するずきに、期埅される結果が垞にわかりたす。 ぀たり すでにこの図を芋お、テストを倚態的にするこずは成功しないず結論付けるこずができたす。 これを考慮しお、テストを実行するためのプラットフォヌムを䜜成するずきに、テストを蚘述する速床を蚭定する重芁な芁玠を決めたした。



私が自分のために蚭定した抂念



  1. 自動テストはできるだけ早く䜜成する必芁がありたす。 定性的にこれを達成する堎合、信頌性や䜿いやすさなど、他の偎面は自分でやっおくるはずです。
  2. テストは宣蚀的に宣蚀し、コヌドずは別に実行する必芁がありたす。 私は別のオプションさえ芋たせんでした。 これにより、曞き蟌み速床が向䞊したす。 既補のむンタヌプリタヌがあれば、私たちのプラットフォヌムで、埌から远加する必芁はありたせん。もう䞀床コヌドにアクセスする必芁はありたせん。䞀般的に、IDEを䜿甚しお完成したプラットフォヌムを忘れるこずができたす。 そのため、テストの保守が簡単になりたす。 この圢匏では、曞くこずを孊びやすくなりたす。なぜなら、 開発スキルは必芁ありたせんが、マヌクアップ蚀語の理解のみが必芁です。 この圢匏では、プロセスのすべおの参加者が理解できたす。


最初に拒吊するこずにしたこず



  1. システムをテストフレヌムワヌクでラップしないでください。 テストフレヌムワヌクなしでプロセスの実行を開始できたす。 「あなたは自転車を発明したい」-倚くの人が蚀うでしょう。 違うず思う。 䞀般的に䜿甚されるテストフレヌムワヌクは、䞻に内郚からコヌドをテストするために䜜成されたもので、倖郚からシステムの倖郚郚分をテストしたす。 ロヌドバむクを持っおいるようなもので、オフロヌドの山を䞋る必芁がありたす倱瀌ですが、思考の流れが反映されおいたす。 䞀般に、ブラックゞャックず...でフレヌムワヌクを自分で蚘述したすたずえば、JUnit 5はすでにそのようなタスクにはるかに適合しおいるこずは承知しおいたすが。
  2. セレンのラッパヌの䜿甚を拒吊。 実際、キヌラむブラリ自䜓は小さいです。 その機胜の5を䜿甚する必芁があるこずを理解するには、完党にシャベルで凊理するのに数時間かかりたす。 より少ないコヌドを曞き、トむレに慣れる方法を探しおどこにでも。 珟代の䞖界では、この欲求はしばしば䞍条理に぀ながり、ほずんど垞に柔軟性を損ないたす぀たり、アヌキテクチャフレヌムワヌクのケヌスではなく、「コヌドを少なくする」アプロヌチです。
  3. 結果の矎しいプレれンテヌションは必芁ありたせん。 このアむテムを導入したのは、 私はか぀おこれに盎面しおいたせん。 自動テストが完了したら、2぀のこずを知る必芁がありたす党䜓的な結果正/負、および゚ラヌがあったかどうか-正確に。 おそらく、ただ統蚈を保持する必芁がありたす。 結果の点で他のすべおは絶察に䞍可欠ではありたせん。 矎しいデザむンを重芁なプラスず考えるか、初期段階でこの矎しいデザむンに時間を費やすこずは䜙分なショヌです。


いく぀かの詳现を完党に明確にするために、䌚瀟の開発レベルずツヌルの䜜成条件に぀いおもう少しお話したす。



いく぀かの機密事項のため、私は勀務先の䌚瀟を開瀺したせん。



圓瀟では、開発が長幎にわたっおすでに存圚しおいるため、すべおのプロセスが長い間確立されおいたす。 しかし、それらは珟圚の傟向よりもはるかに遅れおいたす。

ITのすべおの代衚者は、コヌドをテストでカバヌし、将来の機胜の芁件を調敎する際に自動テスト甚のスクリプトを䜜成する必芁があるこず、柔軟なテクノロゞヌが時間ずリ゜ヌスを倧幅に節玄するこず、そしお単に呜を奪い単玔化するCIが必芁であるこずを理解しおいたす。 しかし、これたでのずころ、これはすべおゆっくりず私たちに届いおいたす...



゜フトりェア品質管理サヌビスも同様です。「䞊から」のプロセスを芋るず、すべおのテストが手動で実行されたす。これが開発プロセス党䜓の「ボトルネック」です。



組立説明



プラットフォヌムは、JDK 12を䜿甚しおJavaで蚘述されおいたす



䞻芁むンフラツヌル-Selenium Web Driver、OJDBC



アプリケヌションを機胜させるには、FireFoxブラりザヌバヌゞョン52をPCにむンストヌルする必芁がありたす



アプリケヌションビルド構成



画像



アプリケヌションでは、3぀のフォルダヌず2぀のファむルが必芁です。



• BuildKitフォルダヌ-含たれるもの





• レポヌトフォルダヌ-アプリケヌションがテストケヌスを完了するず、レポヌトが保存されたす。 たた、゚ラヌが発生した堎合にスクリヌンショットが保存されるErrorScreensフォルダヌも含たれおいる必芁がありたす。



• TestSuiteフォルダヌ-Webパッケヌゞ、javascript、䞀連のテストケヌスこのフォルダヌぞの入力に぀いおは、別途詳しく説明したす



•config.propertiesファむル-Oracleデヌタベヌスに接続するための構成ず、WebDriverWaitに察する明瀺的な期埅倀が含たれおいたす



•starter.bat-アプリケヌションを起動するファむル最埌にパラメヌタずしおTestCaseずいう名前を入力するず、TestCaseを手動で指定せずにアプリケヌションを自動的に起動できたす。



アプリケヌションの簡単な説明



アプリケヌションは、パラメヌタTestCaseずいう名前を䜿甚しお、たたはパラメヌタなしで起動できたす。この堎合、テストケヌスの名前をコン゜ヌルに自分で入力する必芁がありたす。



パラメヌタヌなしで実行するbatファむルの䞀般的な内容の䟋start "AutoTest launcher"cd\ BuildKit \ jdk-12 \ bin \ java.exe -Xmx768M -jar --enable-previewcd\ BuildKit \ SprintAutoTest.jar



アプリケヌションの䞀般的な起動時に、「\ TestSuite \ TestCase」ディレクトリにあるxmlファむルを確認したすサブフォルダヌの内容は衚瀺されたせん。 この堎合、構造の正確性に察するxmlファむルのプラむマリ怜蚌が行われ぀たり、xmlマヌクアップの芳点からのすべおのタグが正しい、「testCaseName」タグに瀺された名前が取埗されたす。その埌、ナヌザヌは䜿甚可胜なテストの可胜な名前の1぀を入力するように求められたすケヌス。 入力に誀りがある堎合、システムは名前の再入力を求めたす。



TestCaseずいう名前を受け取った埌、内郚モデルが構築されたす。これは、TestCaseテストスクリプト-Webオブゞェクト芁玠のストレヌゞの束であり、Javaオブゞェクトの圢匏です。 モデルの構築埌、TestCaseプログラムの実行可胜オブゞェクトが盎接構築されたす。 TestCaseの構築段階で、2次怜蚌も行われたす。TestCaseで指定されたすべおのフォヌムが関連するWebPackageにあり、アクションで指定されたすべおの芁玠が指定されたペヌゞ内のWebPackageにあるこずを確認したす。 TestCaseおよびWebPackageの構造に぀いおは、以䞋で詳しく説明したす



TestCaseのビルド埌、スクリプトが盎接実行されたす



スクリプト操䜜アルゎリズムキヌロゞック



TestCaseはAction゚ンティティのコレクションであり、これはむベント゚ンティティのコレクションです。



テストケヌス

->リスト{アクション}

->リスト{むベント}



TestCaseが開始されるず、アクションが順番に開始されたす各アクションは論理結果を返したす



アクションが開始されるず、むベントが順番に開始されたす各むベントは論理結果を返したす



各むベントの結果により、結果が保存されたす。



したがっお、テストは、すべおのアクションが正垞に完了したずき、たたはアクションがfalseを返したずきに完了したす。



*クラッシュメカニズム



なぜなら テスト察象のシステムは叀く、゚ラヌではない゚ラヌ/バグをキャッチし、䞀郚のむベントは初めお動䜜したせん。プラットフォヌムには、厳密に線圢なテストずいう䞊蚘の抂念から逞脱するメカニズムがありたすただし、厳密に型指定されおいたす。 このような゚ラヌをキャッチする堎合、最初にケヌスを繰り返し、远加のアクションを実行しおアクションを繰り返すこずができたす



アプリケヌションの最埌にレポヌトが生成され、「\ Reports」ディレクトリに保存されたす。 ゚ラヌが発生した堎合、スクリヌンショットが撮られ、「\ Reports \ ErrorScreens」に保存されたす



TestSuite Filling



だから、テストの説明。 既に述べたように、実行に必芁な䞻なパラメヌタヌは、実行するテストの名前です。 この名前は、ディレクトリ「/ TestSuite / TestCase」のxmlファむルに保存されたす。 すべおのテストスクリプトはこのディレクトリに保存されたす。 それらはいく぀あっおもかたいたせん。 テストケヌスの名前は、ファむル名からではなく、ファむル内の「testCaseName」タグから取埗されたす。



TestCaseは、正確に䜕を行うかを蚭定したす。 アクション。 xmlファむルのディレクトリ「/ TestSuite / WebPackage」には、すべおのロケヌタヌが保存されたす。 ぀たり すべお最高の䌝統-アクションは個別に保存され、Webフォヌムロケヌタヌは個別に保存されたす。



TestCaseは、WebPackage名を「webPackageName」タグにも保存したす。



党䜓像はすでにそこにありたす。 実行するには、TestCaseずWebPackageの2぀のxmlファむルが必芁です。 圌らは束を䜜りたす。 WebPackageは独立しおいたす-識別子はタグ「webPackageName」内の名前です。 したがっお、ここに最初のルヌルがありたす-TestCaseずWebPackageの名前は䞀意でなければなりたせん。 ぀たり 繰り返したすが、実際には、テストはTestCaseずWepPackageファむルの束であり、TestCaseで指定されたWebPackage名で接続されおいたす。 実際には、1぀のシステムを自動化し、すべおのテストケヌスを1぀のWebPackageにたずめお、すべおのフォヌムの説明を山積みにしたす。



論理分解の次の局は、ペヌゞオブゞェクトなどのパタヌンに基づいおいたす。



ペヌゞオブゞェクト
ペヌゞオブゞェクトは、自動化で最も有甚で䜿甚されおいるアヌキテクチャ゜リュヌションの1぀です。 この蚭蚈パタヌンは、個々のペヌゞ芁玠で䜜業をカプセル化するのに圹立ちたす。 ペヌゞオブゞェクトは、テスト察象のアプリケヌションのペヌゞをオブゞェクトずしおシミュレヌトしたす。



ロゞックず実装の分離



テストロゞックチェック察象ずその実装チェック方法には倧きな違いがありたす。 テストシナリオの䟋「ナヌザヌが間違ったナヌザヌ名たたはパスワヌドを入力し、ログむンボタンを抌し、゚ラヌメッセヌゞを受け取りたす。」 このスクリプトはテストのロゞックを蚘述したすが、実装にはペヌゞ䞊の入力フィヌルドの怜玢、入力、゚ラヌのチェックなどのアクションが含たれたす。 たた、たずえば、゚ラヌメッセヌゞの衚瀺方法が倉曎されおも、テストスクリプトに圱響しない堎合は、誀ったデヌタを入力し、ログむンボタンを抌しお゚ラヌを確認する必芁がありたす。 ただし、これはテストの実装に盎接圱響したす。゚ラヌメッセヌゞを受信しお​​凊理するメ゜ッドを倉曎する必芁がありたす。 テストのロゞックを実装から分離するこずにより、自動テストはより柔軟になり、原則ずしお保守が容易になりたす。



* このアヌキテクチャのアプロヌチが完党に適甚されたずは蚀えたせん。 テストシナリオの説明をペヌゞごずに分解するだけです。これにより、テストをより速く蚘述し、すべおのペヌゞに自動チェックを远加し、ロケヌタヌの正しい説明を刺激し異なるペヌゞで同じではないように、テストの「矎しい」論理構造を構築したす。 プラットフォヌム自䜓は、「クリヌンアヌキテクチャ」の原則に基づいお実装されおいたす



次に、WebPackageずTestCaseの構造を詳しく説明しないようにしたす。 圌らのために、WebPackage甚のDTDスキヌマずTestCase甚のXSD 1.1を䜜成したした。



 重芁な



DTDおよびXSDスキヌムを維持するこずにより、迅速なテスト䜜成の抂念が実装されたす。



WebPackageずTestCaseを盎接蚘述する堎合、タグの自動生成機胜を備えた組み蟌みのリアルタむムDTDおよびXSD怜蚌機胜を備えたxml Editorを䜿甚する必芁がありたす。これにより、自動テストの蚘述プロセス自䜓が倧幅に自動化されたす必芁なすべおのタグが自動的に眮き換えられ、属性倀のドロップダりンリストが衚瀺されたす可胜な倀は、察応するタグが生成されるむベントのタむプに応じお 。



これらのスキヌムがxmlファむル自䜓に「ねじ蟌たれ」おいる堎合、特別な環境を䜿甚するず、xmlファむルの構造の正確さを忘れるこずがありたす。 私が遞んだのはoXygen XLM Editorでした。 繰り返したすが、このようなプログラムを䜿甚しないず、曞き蟌み速床の本質を理解できたせん。 アむデアはこれにはあたり適しおいたせん。 TestCaseの鍵ずなるXSD 1.1の「代替」コンストラクトは凊理したせん。



Webpackage



WebPackaege-ディレクトリ「\ TestSuite \ WebPackage」にあるWebフォヌムの芁玠を蚘述するxmlファむル。 奜きなだけファむルを䜜成できたす。ファむルの名前は䜕でも構いたせん-内容だけが重芁です。



DTDドキュメントの冒頭に挿入
<!DOCTYPE webPackage [ <!ELEMENT webPackage (webPackageName, forms)> <!ELEMENT webPackageName (#PCDATA)> <!ELEMENT forms (form+)> <!ELEMENT form (formName, elements+)> <!ELEMENT formName (#PCDATA)> <!ELEMENT elements (element+)> <!ELEMENT element (name, locator)> <!ATTLIST element type (0|1|2|3|4|5|6|7) #REQUIRED> <!ATTLIST element alwaysVisible (0|1) #IMPLIED> <!ELEMENT name (#PCDATA)> <!ELEMENT locator (#PCDATA)> <!ATTLIST locator type (1|2) #IMPLIED> ]>
      
      







䞀般的に、おおよそ
 <webPackage> <webPackageName>_</webPackageName> <forms> <form> <formName>______</formName> <elements> <element type="2" alwaysVisible="1"> <name>_</name> <locator type="2">.//div/form/div/div/form/table/tbody/tr/td[text()=""]/following-sibling::td/input</locator> </element> <element type="2"> <name>__</name> <locator>.//div/form/div/div/form/table/tbody/tr/td[text()=""]/following-sibling::td/input</locator> </element> ....... </elements> </form> ....... </forms> </webPackage>
      
      







既に述べたように、芁玠がヒヌプ内にないように-すべおがWebフォヌムに埓っお分解されたす



キヌ゚ンティティは
 <element>
      
      





芁玠タグには2぀の属性がありたす。





type属性は必須であり、芁玠のタむプを指定したす。 プラットフォヌムで、バむトタむプを蚭定したす



珟時点では、特にプラットフォヌムで自分のために、次のタむプを実装しおいたす。



•0-機胜的な意味はありたせん。通垞、䜕らかの皮類の碑文です。

•1-ボタンボタン

•2-入力フィヌルド入力

•3-チェックボックスcheckBox

•4-ドロップダりンリスト遞択-実際には実装されおいたせんが、その堎所を残したした

•5-srmドロップダりンリストの堎合名前を蚘述し、倀が衚瀺されるたで埅機したす-特定のxpathテンプレヌトに埓っお遞択したす-システム固有のタむプ

•6-srm select-怜玢などの䞀般的な機胜で䜿甚されたす。 -私のシステム専甚の入力



alwaysVisible属性オプションは、芁玠が垞にフォヌムに存圚するかどうかを瀺し、アクションの初期/最終怜蚌䞭に䜿甚できたす぀たり、自動モヌドでは、フォヌムを開いたずきに、フォヌム䞊に垞にあるすべおの芁玠が含たれおいるこずを確認できたすフォヌム、これらの芁玠はすべお消えたした



可胜な倀





オプションのオプションのtype属性は、ロケヌタヌタグで実装されたす



可胜な倀





テストケヌス



TestCase-テストスクリプト自䜓を蚘述するxmlファむルは、「\ TestSuite \ TestCase」ディレクトリにありたす奜きなだけファむルを䜜成できたす。ファむル名は任意です-内容のみが重芁です。



XSD回路
 <xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.1"> <xs:element name="testCase"> <xs:complexType> <xs:sequence> <xs:element name="testCaseName" type="xs:string"/> <xs:element name="webPackageName" type="xs:string"/> <xs:element name="actions" type="actionsType"/> </xs:sequence> </xs:complexType> </xs:element> <xs:complexType name="actionsType"> <xs:sequence> <xs:element name="action" type="actionType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> <xs:complexType name="actionType"> <xs:sequence> <xs:element name="name" type="xs:string"/> <xs:element name="orderNumber" type="xs:positiveInteger"/> <xs:element name="runConfiguration" type="runConfigurationType"/> </xs:sequence> </xs:complexType> <xs:complexType name="runConfigurationType"> <xs:sequence> <xs:element name="formName" type="xs:string"/> <xs:element name="repeatsOnError" type="xs:positiveInteger" minOccurs="0"/> <xs:element name="events" type="eventsType"/> <xs:element name="exceptionBlock" type="eventsType" minOccurs="0"/> </xs:sequence> <xs:attribute name="openValidation" use="required"> <xs:simpleType> <xs:restriction base="xs:byte"> <xs:enumeration value="1"/> <xs:enumeration value="0"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="closeValidation" use="required"> <xs:simpleType> <xs:restriction base="xs:byte"> <xs:enumeration value="1"/> <xs:enumeration value="0"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name="eventBaseType"> <xs:sequence> <xs:element name="orderNumber" type="xs:positiveInteger"/> </xs:sequence> <xs:attribute name="type" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="goToURL"/> <xs:enumeration value="checkElementsVisibility"/> <xs:enumeration value="checkElementsInVisibility"/> <xs:enumeration value="fillingFields"/> <xs:enumeration value="clickElement"/> <xs:enumeration value="dbUpdate"/> <xs:enumeration value="wait"/> <xs:enumeration value="scrollDown"/> <xs:enumeration value="userInput"/> <xs:enumeration value="checkInputValues"/> <xs:enumeration value="checkQueryResultWithUtilityValue"/> <xs:enumeration value="checkFieldsPresenceByQueryResult"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="invertResult" use="optional" default="0"> <xs:simpleType> <xs:restriction base="xs:byte"> <xs:enumeration value="1"/> <xs:enumeration value="0"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="hasExceptionBlock" use="optional" default="0"> <xs:simpleType> <xs:restriction base="xs:byte"> <xs:enumeration value="1"/> <xs:enumeration value="0"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name="eventsType"> <xs:sequence> <xs:element name="event" type="eventBaseType" maxOccurs="unbounded"> <xs:alternative test="@type='goToURL'" type="eventGoToURL"/> <xs:alternative test="@type='checkElementsVisibility'" type="eventCheckElementsVisibility"/> <xs:alternative test="@type='checkElementsInVisibility'" type="eventCheckElementsVisibility"/> <xs:alternative test="@type='fillingFields'" type="eventFillingFields"/> <xs:alternative test="@type='checkInputValues'" type="eventFillingFields"/> <xs:alternative test="@type='clickElement'" type="eventClickElement"/> <xs:alternative test="@TYPE='dbUpdate'" type="eventRequest"/> <xs:alternative test="@type='wait'" type="utilityValueInteger"/> <xs:alternative test="@type='scrollDown'" type="eventClickElement"/> <xs:alternative test="@type='userInput'" type="eventClickElement"/> <xs:alternative test="@type='checkQueryResultWithUtilityValue'" type="eventRequestWithValue"/> <xs:alternative test="@type='checkFieldsPresenceByQueryResult'" type="eventRequestWithValue"/> </xs:element> </xs:sequence> </xs:complexType> <!--   EVENTS --> <xs:complexType name="eventGoToURL"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="url" type="xs:anyURI"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="eventCheckElementsVisibility"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="fields" type="fieldType"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="eventFillingFields"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="fields" type="fieldTypeWithValue"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="eventClickElement"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="elementName" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="eventRequest"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="dbRequest" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="utilityValueInteger"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="utilityValue" type="xs:positiveInteger"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="eventRequestWithValue"> <xs:complexContent> <xs:extension base="eventBaseType"> <xs:sequence> <xs:element name="dbRequest" type="xs:string"/> <xs:element name="utilityValue" type="xs:string"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType> <!--   EVENTS --> <xs:complexType name="fieldType"> <xs:sequence> <xs:element name="field" maxOccurs="unbounded"> <xs:complexType> <xs:choice> <xs:element name="element" type="xs:string"/> <xs:element name="xpath" type="xs:string"/> </xs:choice> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="fieldTypeWithValue"> <xs:sequence> <xs:element name="field" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="element" type="xs:string"/> <xs:element name="value" type="valueType"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="valueType"> <xs:complexContent> <xs:extension base="xs:anyType"> <xs:attribute name="type" use="optional" default="1"> <xs:simpleType> <xs:restriction base="xs:byte"> <xs:enumeration value="1"/> <xs:enumeration value="2"/> <xs:enumeration value="3"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:extension> </xs:complexContent> </xs:complexType> </xs:schema>
      
      







䞀般的なビュヌ
 <!DOCTYPE testCase SYSTEM "./TestSuite/TestCase/entities.dtd" []> <testCase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="testShema.xsd"> <testCaseName>__testCase</testCaseName> <webPackageName>_webPackage__webPackageName</webPackageName> <actions> <action> <name>          </name> <orderNumber>10</orderNumber> <runConfiguration openValidation="1" closeValidation="1"> <formName>______</formName> <events> <event type="goToURL"> <orderNumber>10</orderNumber> <url>&srmURL;</url> </event> ....... </events> </runConfiguration> </action> ....... </actions> </testCase>
      
      







この行では、XML゚ディタヌに衚瀺されるようにxsdスキヌムを固定する方法を確認できたす。



 <testCase xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="testShema.xsd">
      
      





TestCaseでは、同じディレクトリ拡匵子.dtdのファむルに個別に保存されおいるDTD゚ンティティも䜿甚したす。 その䞭に、ほがすべおのデヌタ定数を栌玍したす。 たた、新しいテストを起動するためにロゞックを構築したした。テスト䞭、新しい䞀意の゚ンティティが䜜成され、新しい宇宙船が登録され、このファむルの1桁を倉曎するだけで十分でした。



その構造は非垞に単玔です。䟋を挙げたす。
 <?xml version="1.0" encoding="UTF-8"?> <!ENTITY mainNumber '040'> <!ENTITY mail '@mail.ru'> <!ENTITY srmURL 'https://srm-test.ru'>
      
      







このような定数は、次のようにタグ倀に挿入されたす。



 <url>&srmURL;</url>
      
      





-組み合わせるこずができたす。



 掚奚事項 -testCaseを䜜成するずきは、ドキュメント内でこれらのDTD゚ンティティを指定し、すべおが安定しお機胜した埌、別のファむルに転送する必芁がありたす。 私のxml゚ディタヌはこれに問題がありたす-DTDを芋぀けるこずができず、XSDを考慮したせん



testCase



testCase-最も芪タグに含たれるもの





行動



含たれるもの





runConfiguration



含たれるもの





出来事



最小構造単䜍-この゚ンティティは、実行されるアクションを瀺したす



各むベントは特別であり、䞀意のタグず属性を持぀こずができたす。



基本タむプには以䞋が含たれたす。





* 予想される゚ラヌを説明するメカニズム
私が最初にそれを䜿甚した堎所ず、それを機胜させるために䜕をすべきかずいう些现な䟋を挙げたしょう。



ケヌスキャプチャ入力。 この瞬間を自動化するこずはできたせんでした。぀たり、これたでのずころロボットのクラッシュチェックはクラッシュしたした。キャプチャテストサヌビスを曞いおくれたせんでしたただし、認識のためにニュヌラルネットワヌクを䜜成する方が簡単です。 この堎合、コントロヌルむベントを䜜成したす。このむベントでは、芁玠がないこずを確認したす-䞍正なコントロヌルコヌドに関する通知、hasExceptionBlock属性を蚭定したす。 以前は、いく぀かの繰り返し5を実行できるようにアクションを芁求したしたが、結局、exceptionBlockを䜜成したした。



私の文脈からの䟋。



むベントの登録方法は次のずおりです。



 <event type="checkElementsInVisibility" hasExceptionBlock="1"> <orderNumber>57</orderNumber> <fields> <field> <element>___</element> </field> </fields> </event>
      
      





そしお、ここでexceptionBlock after events



  <exceptionBlock> <event type="clickElement"> <orderNumber>10</orderNumber> <elementName>_____</elementName> </event> </exceptionBlock>
      
      





そしお、はい、1ペヌゞのアクションはいく぀かのアクションに分解できたす。



+ configで2぀のパラメヌタヌに気づいた人defaultTimeOutsForWebDriverWait、lowTimeOutsForWebDriverWait。 だからこそ圌らはそうです。 なぜなら 私はシングルトンにWebドラむバヌ党䜓を持っおいたすが、毎回新しいWebDriverWaitを䜜成したくはありたせんでしたが、1぀の高速ドラむバヌを持っおいたすが、゚ラヌの堎合です明瀺的な埅機-さお、あなたは同意する必芁がありたす、メッセヌゞが出おきおいないこずを確認するために1分埅っおください。 たあ、どちら偎に固執しないこの状況は束葉杖が必芁です-私はそうするこずにしたした。



むベントの皮類



ここでは、システムのほずんどすべおをテストできるスカりトセットなど、むベントの最小限のセットを提䟛したす。



そしお、むベントが䜕であり、どのように構築されるかを理解するのはコヌドにずっおスムヌズです。 コヌドは基本的にフレヌムワヌクを実装したす。 DataBaseWrapperずSeleniumWrapperの2぀のクラスがありたす。 これらのクラスは、むンフラストラクチャコンポヌネントずの盞互䜜甚を蚘述し、プラットフォヌムの機胜も反映したす。 SeleniumWrapperを実装するむンタヌフェむスを提䟛したす



 package logic.selenium; import models.ElementWithStringValue; import models.webpackage.Element; import org.openqa.selenium.WebElement; public interface SeleniumService { void initialization(boolean webDriverWait); void nacigateTo(String url); void refreshPage(); boolean checkElementNotPresent(Element element); WebElement findSingleVisibleElement(Element element); WebElement findSingleElementInDOM(Element element); void enterSingleValuesToWebField(ElementWithStringValue element); void click(Element element); String getInputValue(Element element); Object jsReturnsValue(String jsFunction); //Actions actions void doubleClick(Element element); void moveMouseToElement(Element element); void pressKey(CharSequence charSequence); void getScreenShot(String storage); }
      
      





セレンのすべおの機胜に぀いお説明し、プラットフォヌムの機胜をオヌバヌレむしたす。実際、䞻な機胜は「enterSingleValuesToWebField」メ゜ッドです。 WebPackageで芁玠のタむプを指定するこずに泚意しおください。 したがっお、フィヌルドに入力するずきにこのタむプにどのように反応するかをここに蚘述したす。 1回曞いお忘れたす。 䞊蚘の方法は、たず自分で修正する必芁がありたす。 たずえば、珟圚有効なタむプ5および6は、私のシステムにのみ適しおいたす。 そしお、あなたがフィルタヌのようなものを持っおいお、たくさんのフィルタヌをかける必芁があり、それが兞型的である堎合あなたのりェブアプリケヌションで、それを䜿甚するには、最初にフィヌルド䞊にマりスを移動し、いく぀かのフィヌルドが衚瀺されるのを埅っお、いく぀かに切り替え、埅っおください䜕かがあり、そこに行っお入力しおください...愚かなアクションのメカニズムを1回指定し、スむッチ構造内でこれにナニヌクなタむプを䞎えおください-気にしないでください-あなたはすべおの同様のアプリケヌションフィルタヌの倚態性メ゜ッドを取埗したす。



そのため、パッケヌゞ「package logic.testcase.events」には、むベントの䞀般的なアクションを蚘述する抜象クラスがありたす。 独自のむベントを䜜成するには、新しいクラスを䜜成し、この抜象クラスから継承する必芁がありたす。キットには既にdataBaseServiceずseleniumServiceがありたす。そしお、必芁なデヌタずその凊理方法を決定したす。 そのようなもの。 それに応じお、新しいむベントを䜜成した埌、TestCaseActionFactoryファクトリクラスず、可胜であればXSDスキヌムを完了する必芁がありたす。 さお、新しい属性が远加された堎合-モデル自䜓を倉曎したす。 実際、非垞に簡単で高速です。



だから、スカりトキット。



goToURL-通垞は最初のアクション-指定されたリンクをクリックしたす



䟋
 <event type="goToURL"> <orderNumber>10</orderNumber> <url>testURL</url> </event>
      
      







fillFields-指定された芁玠を埋める



特別なタグ







䟋
 <event type="fillingFields"> <orderNumber>10</orderNumber> <fields> <field> <element>test</element> <value>test</value> </field> </fields> </event>
      
      







checkElementsVisibility-指定された芁玠がフォヌム䞊に存圚するこずを確認したす぀たり、DOMだけでなく、衚瀺されたす。 field属性では、WebPackageの芁玠たたは盎接xpathのいずれかを指定できたす



䟋
 <event type="checkElementsVisibility"> <orderNumber>10</orderNumber> <fields> <field> <element>test</element> </field> <field> <xpath>test</xpath> </field> </fields> </event>
      
      







checkElementsInVisibility - checkElementsVisibilityに䌌おいたすが、逆も同様です。



clickElement-指定された芁玠をクリックしたす



䟋
 <event type="clickElement"> <orderNumber>10</orderNumber> <elementName>test</elementName> </event>
      
      







checkInputValues-入力倀を確認したす



䟋
 <event type="checkInputValues"> <orderNumber>10</orderNumber> <fields> <field> <element>test</element> <value>test</value> </field> </fields> </event>
      
      







dbUpdate-デヌタベヌスで曎新を実行したす oXygenはdbUpdateタむプの1぀のむベントに奇劙な反応をしたす-どうすればいいのかわかりたせんし、理由もわかりたせん 



䟋
 <event type="dbUpdate"> <orderNumber>10</orderNumber> <dbRequest>update - </dbRequest> </event>
      
      







CheckQueryResultWithUtilityValue-デヌタベヌスからの倀を䜿甚しお、ナヌザヌが入力した倀を確認したす



䟋
 <event type="checkQueryResultWithUtilityValue"> <orderNumber>10</orderNumber> <dbRequest>select ...</dbRequest> <utilityValue>test</utilityValue> </event>
      
      







checkFieldsPresenceByQueryResult-パタヌンごずに xpathでフォヌム䞊の芁玠の存圚を確認したす。 目的のパタヌンが指定されおいない堎合、怜玢はパタヌン.//* [text[containsnormalize-space。、 "$"]]に埓っお行われたす。 独自のパタヌンを蚘述する堎合、デヌタベヌスから倀を配眮する堎所に「$」を指定する必芁がありたす。 私のシステムにはいわゆるグリッドがあり、そこには通垞、ある皮のビュヌから圢成される倀がありたす。 このようなグリッドをテストするこのむベント



䟋
 <event type="checkFieldsPresenceByQueryResult"> <orderNumber>10</orderNumber> <dbRequest>test</dbRequest> <utilityValue></utilityValue> </event>
      
      







埅機 -すべおが単玔です-指定されたミリ秒数埅機したす。 残念ながら、これは束葉杖であるず考えられおいたすが、私は確かに蚀うでしょう-時にはそれなしで行うこずは䞍可胜です



䟋
 <event type="wait"> <orderNumber>10</orderNumber> <utilityValue>1000</utilityValue> </event>
      
      







scrollDown-指定された芁玠から䞋にスクロヌルしたす。 これは次のように行われたす。指定された芁玠をクリックし、「PgDn」キヌを抌したす。 䞋にスクロヌルしなければならなかった私の堎合、それはうたく機胜したす



䟋
 <event type="scrollDown"> <orderNumber>10</orderNumber> <elementName>test</elementName> </event>
      
      







userInput-指定された芁玠に倀を入力したす。 私のオヌトメヌションで唯䞀の半自動デバむスで、キャプチャにのみ䜿甚されたす。 倀を入力する芁玠が瀺されおいたす。 倀はポップアップダむアログボックスに入力されたす。



䟋
 <event type="userInput"> <orderNumber>10</orderNumber> <elementName>capch_input</elementName> </event>
      
      







コヌドに぀いお



そこで、ボブおじさんのクリヌンアヌキテクチャの原則に埓っおプラットフォヌムを䜜成しようずしたした。



パッケヌゞ



アプリケヌション-初期化ず起動+構成ずレポヌトReportクラスに぀いおscられないでください-これが最も簡単に実行され、できるだけ早く実行されたす



ロゞック-SeleniumずDBの䞻芁なロゞック+サヌビス。 むベントがありたす。



モデル-XMLのPOJOおよびすべおのヘルパヌオブゞェクトクラス



utils-セレンずdbのシングルトン



コヌドを実行するには、jdk 12をダりンロヌドし、どこでも指定しおチップがオンになるようにする必芁がありたす。 アむデアでは、これはプロゞェクト構造->モゞュヌルずプロゞェクトを介しお行われたす。 たた、Mavenランナヌに぀いおも忘れないでください。 そしお、batファむルで起動するずきに、-enable-previewを远加したす。䟋がありたした。



さお、すべおを起動するには、JDKでojdbcドラむバヌをダりンロヌドし、dzharnikを「SprintAutoTest \ src \ lib」ディレクトリにドロップする必芁がありたす。私はそれを提䟛したせん、なぜなら珟圚、そこのOracleではすべおが深刻です-ダりンロヌドするには登録する必芁がありたすが、誰もが䜕らかの方法で察凊するはずですたあ、すべおのフォルダが䜜成されおいるこずを確認しおください、そうでなければレポヌトは保存されたせん



たずめ



そのため、テストランチャヌがあり、テストの䜜成が非垞に高速です。 1週間の䜜業䞭に、ロボットによっお5〜6分で実行される1.5時間の手動䜜業を自動化できたした。これらは、連結されたテストケヌスの玄3700行ず蚘述された830芁玠4800行以䞊です。数倀は倧たかなため、枬定されおいたせんが、自動化に埓事しおいる人は、これが特にロボットにやさしいシステムにずっお非垞に高い指暙であるこずを理解する必芁がありたす。同時に、すべおをテストしたす-ビゞネスロゞック、満たされた属性の正確さに぀いおいく぀かの吊定的なテストを実行する方法に沿っお、ボヌナスずしお、私は怠けおいないすべおのWebフォヌムをチェックし、すべおの機胜および䞻芁な芁玠を説明したす、それらは独立しお必芁です私にずっおかどうか小さな䜙談-私は䞻にテストを曞くずきだけcloseValidationを䜿甚したす。安定しおおり、ロケヌタヌが亀差しおいないこずが明らかな堎合、すべおのアクションでロケヌタヌをオフにしお、プロセスを高速化したす。



䞀芋、倚くのxml行があるように芋えたすが、実際には半自動で生成され、盎接入力されたパラメヌタヌでのみ゚ラヌが発生したす実際には、2぀のレベルの怜蚌がありたす-最初はスキヌムのxml、2番目はTestCaseの開始時に指定されたフォヌムず芁玠の存圚を確認したす。



マむナス-テストの明確な境界はありたせん。そのため、それらは欠萜しおおり、これはテストではなく単なるマクロランチャヌであるず非難するこずができたす。私はこう蚀いたす



プラットフォヌムでは、テストは抂念的にいく぀かの芳点からいく぀かの抜象化レベルに分けられたす





私のアプロヌチを䜕かず比范するず、たずえば人気のあるキュりリずBDDのコンセプトのマむナス面は、私にずっおより重芁です正確に私のシステムのようなものをテストするずき





私がしたいこず、考えたいこずから、しかし私の手はただ届いおいたせん





たあ、それがすべおです。githubぞの参照゜ヌスコヌドを同封したす。



私は建蚭的な批刀を非垞にうれしく思いたす。このプロゞェクトが本圓に圹立぀こずを願っおいたす。



All Articles