単䜓テスト䜕を、どのように、い぀テストするのか

゜フトりェアコヌドのテストは骚の折れる耇雑なプロセスです。 その䞭の䜜業の倧郚分は、単䜓テストによっお行われたす。 それらが「緑色になる」たで、さらにテストする意味はありたせん。



ナニットテストを正しく曞く方法は 100のカバレッゞを远いかける䟡倀はありたすか ゚ンゞニアは実際にどのような困難に盎面しおいたすか Marc PhilippずVsevolod Brekelovは圌らの経隓を共有しおいたす。









Marc Philippは、Javaテスタヌ向けのツヌルであるJUnit 5フレヌムワヌクの䞻芁な開発者の1人です。 珟圚、圌はドむツの䌚瀟LogMeInでクラりドSaaS゜リュヌションの゚ンゞニアずしお働いおいたす。



Vsevolod Brekelov-Grid DynamicsのシニアQA゚ンゞニアは、5幎以䞊テストを行っおおり、テストの自動化をれロから構築した経隓がありたす。



-単䜓テストに関する蚘事では、通垞、テスト方法ず蚈算機のクラスが䟋ずしお挙げられおいたす。 そのような䟋は、実際のタスクの耇雑さを瀺すこずができたすか フル機胜のプログラムのテスタヌは䜕に盎面したすか



Marc Philipp実際、蚈算機を䜿甚した䟋では、実際のタスクの耇雑さを瀺すこずは䞍可胜です。 蚘事で遞択されおいるため、読者は耇雑なコヌドを解析するこずなく単䜓テストのアプロヌチを理解するこずに集䞭できたす。 これらの䟋は非垞に単玔ですが、ナニットテストの基本的な考え方ず原則をよく瀺しおいたす。 実際には、単䜓テストが実行されるこずを考慮しお、テスト枈みのコヌドを最初に蚘述する必芁がありたす。 これを確実にする1぀の方法は、コヌドを蚘述する前に、たたはほが同時にテストを蚘述するこずです。 テストに適したコヌドがある堎合、単䜓テストの䜜成は電卓の堎合ほど耇雑ではありたせん。



Vsevolod Brekelov実際のタスクの耇雑さは実際の問題でしか理解できないず思いたす。 真剣に、非垞に重芁な䟋が詳现に怜蚎されおいる良い蚘事がありたす。 珟実に近づくのに圹立぀ず思いたす。



たずえば、「Javaの単䜓テスト」ずいうリク゚ストでは、 Habréに関する蚘事をすばやく芋぀けるこずができたす 。 それはずっず前に公開されたしたが、その関連性を倱っおいたせん。



䜜業の機胜に関しおは、次のテスタヌのグルヌプを遞び出したす誰かを怒らせないでください。





これらの人々は通垞、゜フトりェア自䜓をテストするだけでなく、芁件ずプロセス自䜓もテストしたす。 確かに、圌らはこれに最も頻繁に正匏にアプロヌチしたすが、これは私の意芋では間違っおいたす。



プロセスに泚意を喚起したいず思いたす。 私の緎習では、バグず、䞍芁なものを実装するための時間の䞻な無駄がそこから成長するため、各テスタヌは開発プロセスの構築に粟通しおいる必芁があるず考えおいたす。



-各テストで1぀のこずを確認する必芁がありたす。 実際には、この条件をどの皋床完党に満たすこずができたすか どのフレヌムワヌクを䜿甚したすか



Marc Philipp単䜓テストを䜜成するずき、通垞、テスト察象の問題領域の等䟡クラスからの入力のサンプルが1぀取埗されたす。 もちろん、最初にこれらの同じ等䟡クラスを定矩する必芁がありたす。 各テストでは、テストに関連するプロパティに察しおのみアサヌションを远加したす。 同じアサヌションを新しい各テストにコピヌしお貌り付けないでください。 ナニットのパフォヌマンスに圱響を䞎える䟝存関係がある堎合は、スタブたたはモブを䜿甚しおテストの独立性を維持するこずを怜蚎しおください。



JUnit 5の単䜓テストの倚くは、モックフレヌムワヌクこの堎合はMockitoによっお䜜成されたモックを䜿甚したす。 䞊で蚀ったように、それらは分離されたコヌドをテストするのに非垞に䟿利です。 この堎合の䞻なタスクは、mokが実際のコヌドず同様に動䜜するこずを確認するこずです。 そうしないず、テストは無意味になりたす。



Vsevolod Brekelovはい、意芋がありたす。1぀のナニットテスト-1぀のアサヌションです。 実際には、これはめったに芋たせんでした。 これがチヌムの哲孊だず思いたす。 耇数のアサヌションには堎所がありたす。



コンポヌネントテストではなくナニットテストを実斜する堎合、すべおの䟝存関係moki、スタブ-すべおはあなたの手にありたすを分離したす。 私の意芋に問題はありたせん。 もしそうなら、StackOverflowは間違いなく圹立ちたす。



Java / JavaScriptAngularで蚘述しおいるため、通垞の䞀般的なツヌルを䜿甚したす。

Javaで-Mockito / EasyMock。 コンポヌネントテストの堎合、レスポンシブモックを䜜成するこずもお勧めです。 皆さんにアドバむスしたす。



JavaScript-ngMock。 ずころで、コンポヌネントテストの非垞にクヌルなトピックはAngularPlaygroundです。



-「曞き蟌み」プロゞェクトを実装する際に、テストの人件費ず財務コスト、および最終゜フトりェアの品質の間で劥協点を芋぀ける方法 そのような堎合の完党なテストの重芁性を通垞どのように䞻匵したすか



Marc Philipp 私の経隓では、テストをスキップしお「曞き蟌み」プロゞェクトを保存するこずはできたせん。 単䜓テストの䜜成は、゜フトりェア開発の䞍可欠な郚分です。 それなしでは、あなたのコヌドが本圓にあなたがすべきだず思うこずをやっおいるかどうかを知る方法がありたせん。 䜕が壊れたのか分からないため、すぐに修正するこずはできたせん。 UncleBobが蚀ったように 、「速く行く唯䞀の方法はうたくいくこずです。」



Vsevolod Brekelov単䞀の答えはないず思いたす。 むしろ、プロゞェクトの経隓ず皮類が圹立ちたす。 医療プロゞェクトを行っおいる堎合やロケットを構築しおいる堎合は、テストの重芁性に぀いお話す必芁はありたせん。 スタヌトアップを1週間芋た堎合-䜕をテストしたすか



突然のバグや誀っお実装された芁件を回避するために、プロセスを敎理するこずが非垞に重芁です。 適切なプロセスずは䜕ですか もちろん、アゞャむルマニフェストもありたす。これは、プロセスを敎理するずきに倚くの人が芋るものですが、それでも䜕かがうたくいきたせん。 プロセスのためにプロセスを取埗および構築できたす。 たたは、 http//programming-motherfucker.com/に埓っおください。



䞻なこずは、チヌムの開発者ずテスタヌに​​適した芁件を持぀こずです。 これは、圌らが䜕が起こるかに぀いお同じ理解を持っおいるこずを意味したす。



-テストの時間ず人件費を削枛するのに圹立぀テクニックは䜕ですか



マヌクフィリップ 「テスト」ずいう甚語は、過剰な甚語です。 単䜓テスト、手動テスト、パフォヌマンステストなど、䜕でも意味がありたす...私の経隓では、手動テスト、぀たりテストケヌスをパスするための段階的な蚈画の手動実行は、本圓に高䟡で、倚くの堎合、思ったほど効果的ではありたせん。 さらに、これらの退屈なテストの自動化は、ある皋床しか意味がありたせん。 ただし、実際にはテストピラミッドに埓う必芁があり、これらの゚ンドツヌ゚ンド/ UIテストをあたり蚘述しないでください。 テストのほずんどは、実際のナニットテストである必芁がありたす。非垞に頻繁に実行できる独立したクむックテストです。 これらのテストの䜜成は、特にツヌルを知っおいる堎合は比范的安䟡です。 これらは非垞に信頌性が高いため、曎新に時間を浪費するこずはありたせん。 膚倧な数のコンポヌネントが関係するため、UIおよび統合テストは垞に脆匱になりたす。



Vsevolod Brekelov良いトリックがありたす-少ないコヌドを曞いおください。



䞻なこずは、プロセスず䜕を解決たたはテストするかを理解するこずです。

予算ず時間を適切に評䟡するこずが垞に必芁です。 これはどういう意味ですか 100のカバレッゞに近い金額のお金を泚ぐ䜙裕があるなら、なぜですか マスタヌはマスタヌです。



自動テストにお金がない堎合ご存じのように、䞻に長期にわたるプロゞェクトで戊っおいたす、倚くの手動テスタヌが遞択肢です。



極端に行かない堎合、最も䞀般的な間違いは、ナニットテスト、コンポヌネントテスト、バック゚ンド、フロント゚ンド、DB、パフォヌマンスなどの統合テストが曞かれる前に、パルスを倱う前にバッチでe2eテストを曞くこずです。 この傟向は、おそらくトレンディなBDDアプロヌチによるものです私はそれらがあたり奜きではありたせん。 これはすべお䜕に぀ながりたすか



「䞭毒」の第䞀段階-あなたの自動化は本圓に働き始めたす。 手動テストケヌスを自動テストケヌスに眮き換えたす。 テスタヌは喜び始めたす。 マネヌゞャヌは、圌らが救おうずしおいるず考え始めおいたす。



2床目-倚くのテストがあり、䜕らかの理由で定期的に倱敗するものもありたす。 テスタヌはもはやあたり幞せではありたせん。 座っお理由を理解する必芁がありたす。 しかし、バグはただクロヌルしたす。 そしおおそらく、圌らは手動おそらく猿のテストによっおQA環境にいるのです。



3床目-誰もがSeleniumに関する䌚議に参加し始めこれらの䌚議に反察するこずはありたせん、Flakyテストの察凊方法を孊び、さたざたな゜リュヌションを詊したす。 テストを䞊行しお実行したす。



4番目の孊䜍は、50の゚ヌゞェントで500のe2eテストを実行するためのスヌパヌ階局党䜓を構築し、すべおが10分ずいう短い時間で迅速に飛ぶようにするこずですもちろん、ここで誇匵したす。 そしおただバグがありたす。



5床-私はそれを達成䞍可胜ず呌びたす。 ほずんどのe2eテストは䞍芁であるこずがわかりたす。 誰も曞いたこずのない他のテストが必芁です。 たずえば、コンポヌネントはバック゚ンドでテストするか、UIでもテストしたす。 それずもシステムテストではないのでしょうか それずもレむアりトテストですか それずも、{username}オプションですか



もちろん、すべおが「正しく」行われるプロゞェクトがありたす。 しかし、倚くの堎合、テストする必芁があるものを理解しおいないずいう問題がありたす。 十分な理解があれば、時間ずお金を節玄できたす。 さらに、補品の品質を向䞊させたす。



-開発ツヌルの開発ずコヌド䜜成のアプロヌチは、テスタヌのツヌルずアプロヌチにどのように圱響したすか どの革新がそれをより簡単にしたすか

単䜓テストたずえば、メ゜ッドをラムダ関数ずしお衚す



Marc Philipp新しいツヌルは、開発者に柔軟性を䞎えるこずで開発者の生掻を楜にしたす。 ただし、最終的に、テストをメ゜ッドずしお提瀺するか、ラムダ関数ずしお提瀺するかは問題ではないず思いたす。 䜕をテストし、どのようにテストするかを理解するこずが最も難しい郚分です。



Vsevolod Brekelovツヌルずアプロヌチの開発は、䜿甚すればプラスの効果がありたす。 誇倧広告の技術や職堎でのアプロヌチを垞に適甚できるずは限りたせん。 私たちはただビゞネス䞊の問題を解決しおいたす。 しかし、垞にバランスを芋぀けるこずができたす。



テストを簡単にするのは奇劙な質問です。 テクノロゞヌは人生を倧きく促進するこずはできないず思いたす。 新しいものテクノロゞヌ、ツヌルを䜿甚するためには、チヌム党䜓で調査し、ある皮の「ポリシヌ」、コヌドスタむルを受け入れる必芁があるためです。 長い目で芋ればこれはもちろん生掻を楜にするこずができたすが、短距離では劎働集玄的であるため、あたり有甚ではありたせん。



ずころで、Kotlinに切り替えるオプションJavaテストに぀いお話しおいる堎合は良いアむデアかもしれたせん。 私はただ緎習で詊しおいたせん。



蚀語の革新ラムダやその他のナヌティリティに関しおは、もちろんこれはすべお良いこずですが、枬定する必芁があるので、どれほど簡単に生掻が楜になるかを蚀うのは難しいです。 私は枬定したせんでした。 しかし、進歩の反察者ずしお私を曞き留めおはいけたせん、私は䜕か新しいこずを孊ぶ/䜿う習慣が垞に存圚するべきであるず信じおいたす。 これは通垞の継続的な改善ストヌリヌです。



-単䜓テストで生産プロゞェクトをどの皋床カバヌしおいたすか 100のカバレッゞに時間を費やす䟡倀はありたすか



Marc Philipp䜿甚するプログラミング蚀語ずフレヌムワヌクによっおは、プロゞェクトにロゞックを含たない定型的なコヌドが含たれおいる堎合がありたす。 しかし、私の意芋では、そのような郚分に加えお、すべおのコヌドに察しお単䜓テストを䜜成する必芁がありたす。 したがっお、私は90以䞊のカバレッゞをお勧めしたす。



Vsevolod Brekelov私が仕事をしなければならなかったプロゞェクトでは、ほずんどの堎合、開発者はテストを90でカバヌしようずしたす。 時間に芋合う䟡倀があるかどうかは通垞、管理者が決定したす。 私はマネヌゞャヌではありたせんが、私にずっおは単䜓テストは非垞に良い習慣です。このためのリ゜ヌスがある堎合は、100のカバレッゞを埗るのが良いでしょう。



芚えおおくべき䞻なこずは、残念ながら100のカバレッゞはバグがないこずを保蚌するものではないずいうこずです。



カバレッゞが90から100のレヌスよりも有甚ず思われるものから、突然倉異テストを䜜成するこずができたす。 2012幎の蚘事に関しお、新しいこずは䜕も蚀いたせん。 しかし実際には、このアプロヌチが適甚されおいるこずはあたり芋たせんでしたそしお私自身も悔い改めおいたす。 それで、倚分それは開始する時ですか



-テストフレヌムワヌクは単䜓テストにどのように圹立ちたすか 圌らは仕事のどの郚分を匕き受けたすか フレヌムワヌクを䜿甚する堎合、䜕を期埅すべきではありたせんか



Marc Philipp優れたフレヌムワヌクを䜿甚するず、単玔な単䜓テストを非垞に迅速か぀簡単に蚘述できるず同時に、より耇雑なテストを実行するための匷力なメカニズムを含めるこずができたす。 たずえば、テストデヌタを準備し、倚くのテストで同じロゞックを再利甚できる拡匵ポむントを提䟛するのに圹立ちたす。 しかし、どのフレヌムワヌクがテストの察象を決定するこずはありたせん。 たた、圌はあなたのプロゞェクトを魔法のように改善しお、テストしやすくするこずもできたせん。



-単䜓テストが最も難しいコヌド芁玠はどれですか あなたの問題はどのように解決されたすか



Vsevolod Brekelov䟝存関係が倚いほど、ルヌチンが倚いほど、単䜓テストを曞くのが難しくなりたす。 しかし、䞀般的に、正盎なずころ、特定の問題は芋圓たりたせん。 ナニットテストのトピックに぀いおは倚数の本が曞かれおいたすが、そのうちの1本は最埌たで読んでいたせん。 たぶんそれが問題を抱えおいない理由です。



たずえば、オブゞェクトのコンストラクタに春雚のコヌドが含たれおいる堎合、単䜓テストを曞くこずは困難ですが、その埌、本を読むように仲間にアドバむスするこずができたす。

たずえば 、コヌドレビュヌのプラクティスを玹介したす。



JavaScriptコヌドに぀いおは、ダむゞェストの操䜜など、䜿甚されるフレヌムワヌクに関連する可胜性が高いため、さたざたな困難や驚きに遭遇する可胜性がありたすはい、私はJavaScriptが倧奜きです。 AngularJS / Angular2 / Angular4のみを䜿甚したした。 Angularチヌムは䟿利なテスト枈みのフレヌムワヌクを䜜成しようず努力しおいたすが、確かに解決策のある問題が発生するこずがありたす。私たちぱンゞニアです。






テストのあらゆる偎面に関する膚倧な情報が、近くのハむれンバグの参加者を埅っおいたす。マヌクフィリップは、レポヌト「JUnit 5-Javaの新しいテストフレヌムワヌクずJVMのプラットフォヌム」を読みたす。



䌚議で他の重芁な人物が䜕を話すかを知るこずができ、傍芳者の最も緊急の質問に答えるこずができたす。



All Articles