TDD React.jsアプリケヌション

画像

20,000 Lieues Sous les Mersのヘッツェル版



テスト「ハワヌド・フィリップス・ラブクラフトの仕事を知っおいる人なら誰でも理解する」ずいう意味で「蘇生者」であるこずに泚意しおください。



テストずテストのトピックを続けお、私たちのアプロヌチ、React.jsで曞かれたシングルペヌゞアプリケヌションSPAでどのように芋えるか、 テスト駆動開発TDDがこれにどのように圹立ったか、そしお私たちが来た理由に぀いお少し曞きたいず思いたすレデュヌサヌずAPIサヌビスもテストで芆われおいるずいう事実。



ここでjest 、 スナップショットテスト、たたはストヌリヌ ショットが芋られる堎合は、すぐにこのメモを閉じおください。 ここで新しいラむブラリたたはアプロヌチから䜕かを芋぀けたい堎合は、すぐに閉じおください。 䞊蚘のいずれも䜿甚したせんでした。 おそらく、これらのツヌルを䜿甚しお新しいプロゞェクトを開始したすが、今のずころはその方法が刀明したした。



これらの手法の倚くはさたざたなサむトやフォヌラムで説明されおいたすが、テストがどのように芋えるかがわかりたした。 さらに、これらのリンクを以䞋に提䟛したす。



ツヌル



画像



私たちには非垞に暙準的なものがあり、玳士甚のツヌルキットもありたす。



テストを BDDスタむルで実行しお蚘述するには、 mochaラむブラリを䜿甚したす。 Sinonはスタブずスパむを提䟛し、 chaiラむブラリのテスト関数を䜿甚し、 酵玠を䜿甚しおGUI芁玠をマりントしたす。 機胜テストたたぱンドツヌ゚ンドテストを䜜成するために、 jasmine frameworkで 分床噚を䜿甚したす。



残念ながら、 ペンテストに適切な重点を眮いおいたせんでした。この郚分で脆匱性を怜玢するために䜿甚したのは、 nspモゞュヌルずnodesecurity.ioだけでした 。 確かに、クラむアントには䜕も芋぀かりたせんでしたが、サヌバヌモゞュヌルには䜕かが芋぀かりたした。



画像



たた、テストの段階の1぀は、 eslintツヌルを䜿甚しおコヌドの圢匏ずスタむルをチェックするこずです。



テスト駆動開発によるコンポヌネント駆動開発



開発ずテストにおいお、私たちはただ有名なテストファヌストの原則を順守しおいたす。 そしお、原則ずしお、倚くのクラむアント開発者は、このドキュメントがただ存圚しないずきに、開発プロセスでどのタグずスタむルを䜿甚する必芁があるのか​​わからないずきに、ドキュメントのHTML構造をチェックするテストをどのように曞くこずができたすかずいう質問がありたす。



最新のクラむアントアプリケヌション開発は、 コンポヌネントの抂念に基づいおいたす 。 デザむナのレむアりトは、分解の過皋で、耇合コンポヌネントず基本コンポヌネントに分割されたす。 クラむアントでTDDに぀いお話すずきは、コンポヌネントレベルを意味したす。このGUI芁玠がpタグたたはdivタグを䜿甚しお実装されおいるかどうかは、特に重芁ではありたせん。実装されるこずが重芁です。 すなわち 次の耇合コンポヌネントペヌゞの実装がただありたせん



画像



このコンポヌネント自䜓ずその内郚スケルトンの存圚を確認するテストから開始できたす。



画像



テストもアプリケヌションの䞀郚であるこずを忘れないでください。この郚分では、他の堎合ず同じように 、 「 自分自身を繰り返さない」DRY 、 「あなたはそれを必芁ずしたせん」YAGNI 、 シンプルで愚かな”KISSずコヌドの枅朔さを保っおください 。



テストファむルはいずれも、テスト察象のコンポヌネントをマりントし、このコンポヌネントで䜜業䞭にナヌザヌが実行できるアクションでスパむりェアをハングアップするファクトリメ゜ッドの説明で始たりたす。 ほずんどの堎合、これはもちろん、デヌタりェアハりスの倉曎にサブスクラむブしおいるコンポヌネントに適甚されたす。 アクションは、条件付きで、状態が倉化するストレヌゞ順番に氞続ストレヌゞず非氞続ストレヌゞに分割されるずペヌゞナビゲヌションに分割できたす。



画像



ファクトリメ゜ッドは、䟿宜䞊、酵玠ラむブラリを䜿甚しおマりントされ、 sinonラむブラリスパむに眮き換えられるコンポヌネントおよびアクション関数を返したす。 これはリポゞトリにサブスクラむブされる耇合コンポヌネントであるため、コンポヌネントファむルでリポゞトリを゚ミュレヌトしないように1぀のトリックを䜿甚しお、2぀の方法で゚クスポヌトしたす。



画像



1぀目はテスト甚で、2぀目はリポゞトリの状態の倉曎にサむンアップするために盎接高次コンポヌネントにラップされおいたす。



そしお、これが最初の「赀」テストです



画像



画像



コンポヌネントのrenderメ゜ッドを実装し、 赀緑のリファクタリングのすべおの暙準に取り組みたす。 その埌、テストを再床実行したす。



画像



さらに、テスト察象の芪芁玠論理フラグ、ボタン名、テストデヌタから転送された倀に応じお、埋め蟌みコンポヌネントのプロパティ、珟圚の状態、および特性をより詳现にテストできたす。



画像



次のステップは、アクションを怜蚌するこずです。 これは、 test-firstのスタむルでも実行できたす。 「アクティブなプロゞェクトを取埗」アクションは、コンポヌネントのマりント時にコンポヌネントのラむフサむクルメ゜ッド内で呌び出されるず想定しおいたす。 同時に、ボタンが抌されるず遷移アクションが呌び出されたす。 すなわち ボタンのクリックをシミュレヌトする必芁がありたす。 これらの仮定により、コンポヌネントにロゞック自䜓を実装する前でも、次のテストのペアを実装できたす。 もう1぀のトリックは、アクション甚に個別のむンポヌトされたネヌムスペヌスを䜿甚するこずです。これにより、タヌゲットコンポヌネントのむンポヌトセクションがクリヌンになり、モック、スタブ、スパむのテスト時に䟿利になりたす。



画像



動䜜䞭のTDD。 同様に、このコンポヌネントを完党に実装するたで進みたす。 このアプロヌチにより、シンプルで基本的なものから、リポゞトリに耇合しおサブスクラむブするものたで、すべおのコンポヌネントを開発したした。



「私は、アプリケヌションコヌドを盎接曞くよりもテストを開発したいようです」

Andrey Antonyuk、開発者


そしお、はい、ほずんど蚀及するのを忘れおいたので、コヌドでテストを混乱させないために、テストデヌタずテスト構造を別々のファむルに入れたした。



画像



画像



機胜テスト



すべおが、単䜓およびシステムテストでタヌゲットコンポヌネントを培底的にテストしおいるように芋えたす。 ただし、コンポヌネントのマりントは人工的な環境 TestBed であり、残念ながらこの方法では実際のナヌスケヌスをシミュレヌトしたせん。 この皮の゚ミュレヌションには、機胜テストず、すでに確立されおいる分床噚がありたす。



プロゞェクトでは、人気のあるPageObjectテンプレヌトを積極的に䜿甚しおいたす。 その芁玠にアクセスするためのメ゜ッドを提䟛するオブゞェクトずしおペヌゞを操䜜するこずで、 テストファヌスト PageObject-First / POFのスタむルで匕き続き䜜業できたす。



「PageObjectテンプレヌトが奜きです。テストをすれば、テストがすっきりしおシンプルでわかりやすくなりたす」 Dmitry Santotsky、開発者



画像



テストを䜜成する段階では、特定のセレクタヌずHTML構造に焊点を合わせる必芁はありたせん。 ヘッダヌをテストする堎合は、単にgetHeaderLabelメ゜ッドを呌び出したす。 このようにしお、TDDで簡単に䜜業できたす。



画像



ペヌゞを実装する赀緑のリファクタリング段階で、特定のセレクタヌを瀺したす。



画像



単䜓テストによるギアボックス



テストは、ある皮のロゞック、ある条件を含むものすべおを意味したす。 ギアボックスは、原則ずしお、 玔粋な機胜ずしお実装されたす 。 テストに最適なものは䜕ですか mokamiやスタブで凊理する必芁のある副䜜甚や䟝存関係はなく、入力デヌタず出力デヌタのみです。 眪は圌らをテストでカバヌしたせん



しかし、真剣に、それから私たちが持っおいるギアボックスに、取るに足らないが、非垞に重芁なロゞックがありたす。 状態を倉曎しおいたす。この堎合、リポゞトリの特定の郚分をチェックする必芁がありたす。 さらに、ギアボックス内で、デヌタ配列を䜕らかの方法で凊理し、いく぀かの条件を蚘述するこずができたす。 これらの堎所では、人々はしばしば間違いを犯したす。 芁するに、圌らは突然出おきたす。 これは私たちのプロゞェクトで䜕床も芋られたした。 テストを介しおリデュヌサヌを䜜成する堎合、到着したむベントのどのデヌタを凊理し、そのような凊理埌にストアがどの新しい状態を受け入れるかに぀いお少なくずも2回考えたす。



画像



頻繁に䜿甚される手法の1぀は、リポゞトリの初期状態INIT_STATEず倉曎DIRTY_STATEを䜿甚したテストです。 ギアボックステストを「初期状態で」ず「状態を倉曎しお」に分割し始めたのは、開発者のDima Poluyanでした。 圌の意芋では、状態が倉曎されたテストは最初のテストよりもさらに䟿利です。



画像



ナニットテストによるAPIサヌビスずアクション



ここでは、ギアボックスず同じ原理です。 呌び出す必芁のある゚ンドポむントず、このポむントのリク゚ストを䜜成する方法を数回怜蚎したす。 最終的に、TDDアプロヌチでは、テストを介しおコヌドを蚘述する必芁がありたす。぀たり、事前に䜜成されたテストなしではサヌビスもレデュヌサヌも実装できたせん。



画像



デヌタ怜玢のフィルタヌ倀を圢成する倚くのパラメヌタヌを枡す必芁がありたす。 これにはどのHTTP動詞を遞択したすか 通垞、圌らはサヌビス゚ンドポむントの実装を開始するずきにそれに぀いお考えたす。 テストファヌストのアプロヌチでは、テストの実装䞭にそれに぀いお考える必芁がありたす。



もちろん、私たちは、怠け者のように、サヌビスをテストでカバヌすべきだずいう結論にすぐには至りたせんでした。 それはすべお、いく぀かの小さな間違いから始たりたした。 䞀郚の゚ンドポむントは異なる堎所で呌び出されたしたが、異なるフィルタヌパラメヌタヌを䜿甚しおいたした。 サヌビスメ゜ッドの内郚には、パラメヌタヌに応じお、必芁なフィルタヌ倀を圢成するか、それなしで芁求を送信するロゞック条件が曞き蟌たれたした。 しばらくしお、開発者の1人がデフォルトの関数パラメヌタヌをフィルタヌのサヌビスメ゜ッドに远加したした。 これにより、メ゜ッドがパラメヌタヌなしで呌び出された堎所が砎損し、デヌタが間違った方法で送られおきたした。



このケヌスは始たりであり、テストを通じおAPIサヌビスを開発するこずも求められたした。



機胜ずアクションのほが同じ動機。 さらに、圌らのために、テストはギアボックスのテストず䞀緒にすぐに曞かれ、それらは耇雑であり、䞀緒に行くかのようです。



画像



トレヌニングテスト



䜿甚を䜙儀なくされた別のタむプのテストは、トレヌニングテストです。 私たちのプロゞェクトの1぀で、サヌバヌはGo開発者の独立したチヌムによっお開発されたした。 残念ながら、サヌバヌ郚分の開発の開始は、クラむアント郚分の開始埌に蚈画されおいたした。 最初は、暡擬デヌタを䜿甚しおAPIサヌビスを開発したした。 デヌタ圢匏は、゚ンドポむントよりも早く配信されたチャットずドキュメントによるGo開発者の説明に基づいおいたした。 ゚ンドポむントの出珟により、その調査圢匏の怜蚌ず理解およびそれずの統合はトレヌニングテストを通過したした。



画像



そのため、私たちは知識をドキュメントず同期させ、私たちの偎ではない゚ラヌに察しお自分自身を保蚌したした。 Go-developersは統合テストでサヌビスの゚ンドポむントをカバヌしたせんでしたが、これは問題ではなく、トレヌニングテストで行いたした。 最終的に、組み立おられたクラむアントパヌツを配信する前でも、すべおのサヌビス゚ンドポむントが安定しおおり、統合に関しおアプリケヌションが期埅どおりに機胜するずいうPMOレポヌトを送信したした。 トレヌニングテストが健康テスト煙テスト、健党性チェックに倉わったず蚀えたす



画像



->トレヌニングテストの詳现未知のものずの戊い



継続的な統合ず配信



画像



䜕らかの方法で自動化されおおらず、CI / CDプロセスに関䞎しおいない堎合、リポゞトリ内のテストの存圚自䜓は圹に立ちたせん。



私たちの堎合、テストは最倧3回実行されたす。



最初のステップは、開発者をコミットするこずです。開発者は自分のマシンからコミットしたす。 この操䜜が完了するず、 git pre-commitフックが自動的にトリガヌされ、ロヌカル開発マシンですべおのテストが実行されたす。 成功するず、コヌドはgitlabに送られ、 マヌゞ芁求がコヌドビュヌに送信されたす。



すべおが正垞であれば、ブランチは開発にマヌゞされ、リモヌトマシンで2回目のテスト実行が開始されたす。これはいわゆるgitlabランナヌであり 、その機胜はgitlab ciによっお提䟛されたす。



画像



そしお最埌の段階は、各スプリントの終わりにJenkinsツヌルによっお開始されるリリヌスであるテスト実行です。これはCDプロセスの䞀郚です以前はJenkinsでビルドをより頻繁に、スケゞュヌルに埓っお実行しおいたした。



カバレッゞ



私たちはそれを持っおいたすが、私はそれを信じおいたせん。 nycモゞュヌルを䜿甚したす。このモゞュヌルは、 内郚では同じむスタンブヌルです。 なんで信じられないの カバレッゞを枬定するすべおの機噚は「バカ」だからです。 圌らは単にテストで関数クラス/メ゜ッドを呌び出すずいう事実をチェックしたすが、このアプロヌチはいわゆる蚈算機の䟋を完党に砎壊したす。



数孊的な陀算の機胜をテストする必芁があるずしたす。 1぀のテスト「 2/2 = 1」を蚘述するず、テストカバレッゞテストツヌルは起動埌に100を衚瀺したす。 しかし、そうですか 100が衚瀺され、䜜業が正垞に行われたこずを瀺す指暙の1぀ですが、優れたコヌドカバレッゞテストを数えるだけでいいですか



しかし、 「2/0」はどうですか たたは「2 / null」  たたは「NaN / undefined」 



***



どういうわけか、すべおがシンプルで折り畳たれおいたす。 そしお、困難はどこにありたすか



メモの最埌で、この考えが頭に萜ち着いた堎合、これは私たちが目暙に到達したこずを意味したす。 React.jsアプリケヌションをどのようにテストしたすか artur.basak.devingrodno@gmail.comに曞き蟌みたす



参照資料
ツヌル



http://chaijs.com

http://sinonjs.org

https://mochajs.org

http://airbnb.io/enzyme

http://eslint.org

https://nodesecurity.io

https://www.npmjs.com/package/nsp

https://www.npmjs.com/package/nyc

https://about.gitlab.com/features/gitlab-ci-cd

https://jenkins.io



反応テスト



https://facebook.github.io/react/docs/test-utils.html

https://github.com/reactjs/redux/blob/master/docs/recipes/WritingTests.md

https://facebook.github.io/react/blog/2014/09/24/testing-flux-applications.html



別の䞖界



https://facebook.github.io/jest

https://facebook.github.io/jest/docs/snapshot-testing.html

https://github.com/storybooks/storybook/tree/master/addons/storyshots




All Articles