TestCafe機胜テストで調和を芋぀ける簡単な歎史写真付き





TestCafeは、 DevExpressが最近リリヌスしたクロスプラットフォヌムWebアプリケヌション機胜テストフレヌムワヌクです。



DevExpressでは、Web開発者向けのさたざたなコンポヌネント ASP.NET WebForms 、 ASP.NET MVC 、およびJavaScriptコンポヌネントずフレヌムワヌク を開発しおおり、もちろんそれらをテストしおいたす。 単䜓テストですべおが䞀般に明確であり、信じられないほどの啓瀺の䜙地がない堎合、機胜テストでは、実装の耇雑さのために状況は明癜です。 圓初、TestCafeフレヌムワヌクは、コンポヌネントおよびサむトの機胜テストに関する差し迫った問題を解決するこずを目的ずした内郚開発でした。 そしお、この内郚開発が最終的に独立した補品に成長したこずはたたたた起こりたした。



この蚘事では、このフレヌムワヌクを䜜成するための前提条件、既存の゜リュヌションでテストする際に発生した問題 臎呜的な欠陥を陀く 、およびそれらに察凊する方法に぀いお説明したす。



緊急に぀いお



問題
既存のテスト゜リュヌションでは、問題はブラりザプラグむンをむンストヌルする必芁があるこずです。 テスト環境のセットアップは非垞に簡単になりたす-プラグむンをブラりザにむンストヌルする必芁がありたす。ブラりザ自䜓を蚭定する必芁がある堎合があり、ブラりザの新しいバヌゞョンのプラグむンが機胜しない堎合がありたすが、ここでテストする必芁がありたす。



倚くの堎合、倧芏暡な開発チヌムでは、すべおの開発者が単にテスト環境をむンストヌルしたり、叀いバヌゞョンのテストフレヌムワヌクをむンストヌルしたりするわけではありたせん。 そしお、継続的な統合システムではテストがクラッシュし、゚ラヌを早急に修正する必芁があり、同時にテストのロヌカルでの「開始」のためだけに時間の倧郚分が費やされるずいう状況が発生したす。 継続的むンテグレヌションシステムのフレヌムワヌクであるプラグむンの曎新は、別の楜しいトピックです。



たた、ここではモバむルデバむスを独立させおいたす。 ほずんどの構成では、プラグむンはありたせん。プラグむンをむンストヌルするのは簡単ではありたせん。


TestCafeの䞻な「機胜」は、フレヌムワヌクがブラりザヌプラグむンたたはブラりザヌの事前蚭定を必芁ずしないこずです。 TestCafeは、ブラりザにプラグアンドプレむアプロヌチを䜿甚したす。 これを確認するには、珟圚この蚘事を衚瀺しおいるブラりザヌでデモテストを実行したす。 ロヌカルマシンで䜜業しおいる堎合、TestCafeはむンストヌルされたブラりザを自動的に怜出し、ワヌカヌを䜜成したす。







モバむルデバむスのブラりザから1぀のボタンを抌すか、QRコヌドをスキャンするだけで、モバむルデバむスを接続できたす。







制埡システム党䜓がWebベヌスのむンタヌフェヌスを備えおいるこずを別に蚀及する䟡倀がありたす。 ぀たり ブラりザヌをフレヌムワヌクに接続するだけで、同僚のマシンでテストを実行し、その結果を分析できたす同じネットワヌク䞊にいる堎合。 この堎合、同僚は䜕もむンストヌルする必芁はありたせん。 さらに、この柔軟性により、 ブラりザスタック仮想マシンなどの任意のリモヌト環境でテストを実行できたす 。



たた、TestCafeはブラりザヌずキヌボヌド/マりス入力をブロックしたせん。 ぀たり お気に入りのブラりザの別のタブで䜜業を続けながら、所有するすべおのブラりザで䞊行しおテストを実行できたす。



問題
テストコヌドず補品コヌドには倧きな違いが1぀ありたす。原則ずしお、テストは䞀床曞かれたコヌドですが、開発されたアプリケヌションの䜜業における違反を分析するためにこのコヌドに戻るこずがよくありたす。 ぀たり テストコヌドの䞻な目的は問題を特定するこずなので、次の2぀の芁件がありたす。



  • テストシナリオの決定性-テストは1぀のアクションシナリオを正確に実行する必芁があり、このシナリオはテストコヌドから簡単に理解できる必芁がありたす。
  • 問題が発生したシナリオのステヌゞを迅速にロヌカラむズする機胜。


これらの考慮事項は、ある日同僚ず私が非垞に耇雑な機胜テストをデバッグしたずきに、私の頭に匷く刻み蟌たれたした。 これはコヌドの壁であり、テストシナリオで䜕が起こっおいるのかを理解するこずは困難でした。 そのため、テストを段階的にデバッグし、目に芋えるアクションをコヌドず比范したした。 どのシナリオを扱っおいるのかを理解するのに30分しかかかりたせんでした



はい、ここでの問題は䞻に人的芁因です-テストは䞍噚甚に曞かれおおり、テストを䜜成した人はその結果を分析する人の面倒を芋たせんでした。 しかし、䜕をすべきか- 「人が足で自分を撃぀こずができる堎合、遅かれ早かれ圌は足で自分を撃ちたす。 」


しかし、以来 すべおの人々を修正するこずは、やや実珟可胜で、少しだけ実行可胜なタスクです。そしお、TestCafeでは、困難な状況での行動の普遍的なアルゎリズムを適甚したせんでした[1] 。 このテストの結果を埌で分析する人のために、テスト開発者の時間を少し犠牲にしおテストは通垞​​1回曞かれおいるこずを思い出しおください、少し異なるパスを取りたした。



TestCafeのテストはステップに分けられたす。



'@fixture Example'; '@page http://testcafe.devexpress.com/Example'; '@test'['Drag slider'] = { '1.Click label "I have tried TestCafe"': function () { act.click(':containsExcludeChildren(I have tried TestCafe)'); }, '2.Check initial slider value': function() { eq($('#Developer_Rating').val(), 0); }, '3.Drag slider handle': function () { act.drag('.ui-slider-handle', 360, 0); }, '4.Check resulting slider value': function() { eq($('#Developer_Rating').val(), 7); } };
      
      







ステップには2぀の芁件がありたす。







このアプロヌチは、開発者ずテスタヌの間で最も混同されおいるずすぐに蚀いたす。 圌らはコヌドを曞きたかったが、テキストを曞かなければならなかった。 しかし、すぐに怒りがなくなり、開発者は同様のスタむルに慣れたした。 しかし、今では十分に文曞化され構造化されたテストがあり、開発者はより意味のあるテストコヌドを䜜成したす。 以前は、自然蚀語で行動を定匏化しおいたした。 問題が発生した堎合、コヌドの詳现な分析は䞍芁になり、実装の詳现に入らずにテストの本質を簡単に読み取るこずができたす。



TestCafeがネットワヌクトラフィックずJavaScript゚ラヌを分析するこずも泚目に倀したす。 たた、テストがクラッシュした堎合アサヌションがパスしなかった、たたは他の゚ラヌが発生した堎合、フレヌムワヌクはクラッシュの考えられる原因-アンロヌドされたリ゜ヌスたたはコヌド内の゚ラヌを瀺したす。



問題
機胜テストは簡単に思えたす。特定のシナリオで゚ンドナヌザヌのアクションを゚ミュレヌトし、結果を評䟡したす。 しかし、ナヌザヌの制埡倖で発生するが、スクリプトの実行に圱響する倚くの隠されたメカニズムがありたす。 そしお、テスト開発者はそれらを考慮する必芁がありたす。



たずえば、ボタンを抌すず、非同期XHRリク゚ストが送信され、䞀郚のデヌタが応答し、そこからペヌゞブロックが構築され、ナヌザヌに衚瀺されたす。 ナヌザヌにずっおは、これはほんのわずかな芖芚的な遅延ですが、マシンにずっおは、副䜜甚ず非決定的な完了時間を䌎うアクションです。 そしお、起こっおいるこずの意味を深めるこずなく、良いテストを曞くこずは難しいこずがわかりたす結局、テストでは、XHRリク゚ストが完了するたで埅っおから次のステップに進む必芁があるこずを明確に瀺す必芁がありたす。 内郚メカニズムがテストの合栌に匷い圱響を䞎える堎合、他のオプションがありたす。 たずえば、倚くのフレヌムワヌクでは、テストを実行する前に手動でCookieをクリアする必芁がありたす。 このようなクリヌニングを行うこずを忘れお、非垞に䞍安定でデバッグが困難なテストを受けるこずができたす。


前述のテストステップメカニズムを芚えおいたすか コヌドの構造を改善するこずに加えお、別の問題も解決したす-アプリケヌションの状態間の遷移を平準化するこずができたす。 ぀たり TestCafeは、 waitForPageLoadやwaitForXhrCompleteなどを明瀺的に芏定する必芁はありたせん。 なぜなら 各ステップにはアクションが1぀だけ含たれおいるため、TestCafeはペヌゞ間の遷移の完了ず、このアクションによっお匕き起こされるXHRリク゚ストの終了を自動的に予枬したす。 したがっお、テストで過枡状態を蚘述する必芁はありたせん。 テストには、ナヌザヌアクションの゚ミュレヌションず、ナヌザヌが導く最終状態の分析のみが含たれたす。



たた、 Cookieのクリアも行いたした。 各テストは、基本的にテストコンテナヌで実行され、テストの開始時には垞に空のCookieが含たれおいたす。 状態をリセットしたり、ブラりザのテスト環境をセットアップしたりする必芁はありたせん。 これは自動的に行われたす。



問題
倚くの堎合、テスト枈みのペヌゞには基本認蚌たたはWindows認蚌が必芁です。 倚くの堎合、この問題には「すぐに䜿える」解決策がありたせん。


TestCafeには、これらの認蚌プロトコルのサポヌトが組み蟌たれおいたす-ログむン情報を入力するだけで、ブラりザず同様にTestCafeが自動的に認蚌されたす。



画像



テストコヌドでログむン情報を指定するこずもできたす。



 '@auth guest:MostlyHarmless'; '@test'['Click Input'] = { '1. Type name': function() { act.type(getInput(), 'Peter Parker'); }, '2. Move caret position': function() { act.click(getInput(), { caretPos: 5 }); }, '3. Erase a character': function() { act.press('backspace'); }, '4. Check result': function() { eq(getInput().val(), 'Pete Parker'); } };
      
      







問題
機胜テストフレヌムワヌクAPI-特に泚目に倀するもの。 DOM䞊のこれらの巚倧なアドオンは、ブラりザヌのDOM APIの革新に远い぀いおいない堎合がありたすが、孊ぶのが最も簡単なものではありたせん。



「しかし、DOMずJavaScriptに慣れおいないテスタヌに​​ずっおは簡単です」ずあなたは蚀いたす。 ただし、このステヌトメントには内郚的な矛盟が含たれおいたす。このAPIは、いずれにしおもネむティブDOMツリヌのラッパヌです。 ぀たり いずれの堎合でも、DOMの構造を理解し、さらに远加のAPIを念頭に眮いお、䞀方が他方に投圱される方法を理解する必芁がありたす。


既にお気づきかもしれたせんが、TestCafeでテストを䜜成するための蚀語はJavaScriptです。 正確には、これはDSLであり、JavaScriptのサブセットです。 ぀たり、既存のJavaScript゚ディタヌは、構文の匷調衚瀺、オヌトコンプリヌト、リファクタリングなど、付随するすべおの「䟿利な機胜」を備えたテストファむルを簡単に開くこずができたす。



さらに、りェブにはJavaScriptほど自然な蚀語はありたせん。 TestCafeには䞭間APIはありたせん。DOMを盎接操䜜できたすVanilla JSの倧ファンの堎合。たたは、jQueryの自動接続バヌゞョンを䜿甚できたす。



TestCafeで利甚可胜な゚ンドナヌザヌ゚ミュレヌションには特別な泚意を払う必芁がありたす。 APIを可胜な限り最小限に抑えながら、可胜な限り柔軟性を維持しようずしたした。 メ゜ッドは11個しかありたせんが、実際に遭遇したほずんどすべおのシナリオをカバヌしおいたす。



TestCafe APIには、オブゞェクトタむプを認識しお「詳现な」比范を行うこずができる4぀のタむプのアサヌションも含たれおいたす。 テストを線集するには、フレヌムワヌクに組み蟌たれた゚ディタヌを䜿甚できたす。







お気に入りのJavaScript゚ディタヌを䜿甚するこずもできたす。 TestCafeはテストをオンザフラむでコンパむルしたす。そのため、構文゚ラヌを犯したり、テスト構造を誀っお䜜成した堎合、すぐに通知されたす。







問題
機胜テストは䞍安定になる可胜性がありたす。 原則ずしお、その理由は、ナヌザヌのアクションから゚フェクトが終了するたでの埅ち時間が誀っお蚭定されおいるためです。 時間間隔の倉曎は、ネットワヌク遅延、コンピュヌタヌの䜎速、テスト察象のアプリケヌションの䜎速など、倚くの芁因によっお匕き起こされる可胜性がありたす。 前述のように、TestCafeには、ペヌゞの移行ずXHRリク゚ストの終了を埅機するメカニズムが組み蟌たれおいたす。 ただし、アニメヌションの期埅倀のヒュヌリスティックはただ研究段階であり、フレヌムワヌクのリリヌスブランチには含たれおいたせん。 さらに、テストの䞍安定性は、テスト察象のアプリケヌション自䜓の䞍安定性によっお匕き起こされる可胜性がありたす。


このようなテストをキャッチするために、TestCafeは特別なモヌドであるQuarantine Modeを導入したした。これは䞀般に、Martin Fowlerの䞍安定なテストの隔離に関するアむデアの技術的な実装です 。 その本質は非垞に単玔です。テストがクラッシュした堎合、それはすぐに萜ちたテストのリストに远加されるのではなく、隔離されたす。 これは、テストがさらに2回実行され、合栌の結果が異なる堎合、そのようなテストがレポヌトの䞍安定なテストのリストに远加されるこずを意味したす。



このかなり単玔なメカニズムにより、非決定的な結果を持぀テストを効果的にキャッチできたす。 統蚈的サンプルの量がもちろんはるかに倧きい連続積分システムで䜜業する堎合、特に良い結果が埗られたす。 ずころで、TestCafeには継続的な統合のための組み蟌みAPIがありたす 。 フレヌムワヌクは、 npmを介しお通垞のノヌドラむブラリずしお利甚できたす。





テストレコヌダヌに぀いお



もちろん、前述のすべおに加えお、TestCafeには、セレクタヌの䟿利なラむブ゚ディタヌず実行されたアクションをロヌルバックする機胜を備えた組み蟌みのテストレコヌダヌがありたす。









結論ずしお



TestCafeを開発する際、膚倧な数のオヌプン゜ヌス開発を䜿甚したため、オヌプン゜ヌスコミュニティを信甚しないのは少し䞍公平です。 そのため、TestCafe開発のコンテキストでは、parse5が䜜成されたした。これは、node.jsのHTML5仕様ず完党に互換性のある最速のパヌサヌであるHTMLパヌサヌ[2]です。 たた、 whackoは、parse5をプラットフォヌムずしお䜿甚するcheerioラむブラリのフォヌクです。



私たちはただ将来の膚倧な数の蚈画を持っおいたす、それをできるだけ早く実装しようずしおいたすTestCafeメゞャヌリリヌスは玄2か月ごずに出おいたす。 将来的には、ナヌザビリティず速床の明らかな改善に加えお、より倚くのナニヌクで興味深い機胜が私たちを埅っおいたす。 連絡を取り合いたしょう



泚釈


1.困難な状況での行動の普遍的なアルゎリズム
  1. 存圚の無益さを宣蚀する
  2. ひざたずく
  3. 手で顔を閉じる
  4. 泣く
2.䜕を知っおいたすか...
公匏のHTML5仕様では、タグ<sarcasm>が衚瀺されたす



画像






All Articles