真空での球状詊隓珟状のたた、あるべき姿、あるべき姿

テストは、私たち䞀人䞀人の仕事においお特別な堎所を持っおいたす。 これは非垞に重芁で耇雑なものであり、最も楜しいものではなく、私たちの仕事の最埌たで過小評䟡され、過小評䟡されおいる郚分です。 したがっお、私は小芏暡なスタヌトアップの実践的な開発者および技術マネヌゞャヌずしお、この分野の専門家ず話をしお、圌に苊痛な質問をする機䌚を埗おうれしく思いたした。 プログラマヌがTDDで䜜業しないのはなぜですか デヌタベヌスを操䜜するシステムの単䜓テストに関連する問題を解決するにはどうすればよいですか 「ヒュヌマンファクタヌ」を取り陀き、最終的にナヌザヌむンタヌフェむステストを自動化する方法







Joker 2016の準備の䞀環ずしお、 レガシヌに関する投皿がリリヌスされたため、Javaでのテストの議論が癜熱し、ニコラむアリメンコフずのむンタビュヌを続けるこずにしたした。



Nikolayは、12幎の経隓を持぀Java開発スペシャリストです。 圌の䞻な仕事掻動に加えお、圌はXPむンゞェクショントレヌニングセンタヌの共同蚭立者およびトレヌナヌであり、囜際䌚議の積極的な参加者および講挔者です。 圌の参加により、IT䌚議Selenium Camp、JEEConf、XP Days Ukraine、IT Brunchが開催されたした。 ここで、そしお今、私たちのチヌムのテストの分野で䜕を改善できるか、そしお将来どのような技術的倉化に備えるべきかに぀いお話したした。



-ニコラむ、私の最初の質問は、内郚でアサヌションを䜿甚する自己テストコヌドに぀いおです。 この実践に察するあなたの態床。



-この考えは明らかに間違っおいたようです。 このようなチェックがテストに取っお代わり、コヌドを自己怜蚌できるず想定されおいたしたが、残念ながら、䞀緒に成長するこずはありたせんでした。 その理由は非垞に単玔です。このアむデアは、コヌドを蚘述するずきに、開発者が実装ず発生する可胜性のある副䜜甚の䞡方に぀いお考えるずいう事実に䟝存しおいたす。 しかし、開発者はその堎でコンテキストを切り替えるのがあたり埗意ではありたせん。 代わりに、単䜓テストでは、最初にテストに集䞭し、次に開発に集䞭するように匷制したす。



アセットはテストではなく、ランタむムチェックで眮き換えられたす。たずえば、䜕かがnullの堎合、䟋倖が必芁です。 ただし、アサヌションは実行に必須ではありたせん。アサヌションをオフにするず、チェックは実行されたせん。 今、あなたはより良いこずを可胜にする他の倚くのアプロヌチがありたす。 たずえば、メ゜ッドたたは倉数の入力パラメヌタヌにNotNull泚釈を付けるこずができる泚釈付きのアプロヌチ。 そしお、この泚釈は、䟋倖をチェックしおスロヌするハンドラヌに入れるこずができたす。 珟圚、非垞にうたく機胜する特別な怜蚌フレヌムワヌクがありたす。



しかし、私には、アサヌションは登堎するずすぐに死んだようです。 私は非垞に倚くの䌚瀟で倚くのコヌドを芋たしたが、それらが真剣に䜿甚されおいる䌚瀟は芋たせんでした。 ここでは、1぀ではありたせん。



-理論的には、誰もがテスト駆動開発がすばらしいこずを理解しおいたす。 しかし実際には、すべおのコヌドが単䜓テストによっおブロックされるわけではありたせん。 あなたの意芋では、開発者の怠に加えお、なぜこれが起こるのですか



-そしお、これは開発者の怠inessではありたせん。 私の意芋では、これには2぀の理由がありたす。



最初は、人々はこれを行う方法を知らないずいうこずです。 TDDで開発するには、準備が必芁です。 それだけでなく、ツヌル、その䜿甚方法、およびその利点を理解する必芁がありたす。 コヌスを受講するか、TDDを孊習するか、すでにTDDに取り組んでいるリテラシヌのある人物ず䞀緒に仕事をする人は、働くこずで倚くの利点を感じたす。



そしお2番目の理由は、倚くの開発者、特に自尊心の高い開発者が「アヌキテクトモヌドを有効にする」こずです。 これは、人がパズルを片目で芋お蚀ったずきです。「わかりたした。それで終わりです。 ここに工堎があり、ここにそのようなパタヌンがありたす-ここにそのようなものがありたす。」 そしお、圌はすぐにこれらの考えをコヌドにこがしたす。 次に、圌が「蚭蚈」したすべおのものを残りのコヌドず統合する必芁がありたす。 そしお、統合されないこずが明らかになりたす。 たたは誰かがコヌドレビュヌコヌドを芋お、すべおのメ゜ッドが巚倧であるこずが明らかになり、䜕も明確ではない、ifの5番目のネスト。 「Hello、world」の堎合、誰もが䟋を芋たはずです。デザむンパタヌンの助けを借りお、「Hello、world」が目の前にあるこずを理解できないように描くこずができたす。



TDDで䜜業するずきは、テストを䜜成したしたが、今では、タスクを機胜させるだけです。 あなたの仕事は、スヌパヌクラスの蚭蚈をするこずではありたせん。 スヌパヌクラス蚭蚈を䜜成するタスクは、コヌドが機胜した埌に発生したす。 それからあなたは圌を芋お蚀った「それで私は簡単な解決策を曞いた。 そしお、どういうわけかそれをより矎しくするこずができたすか なんずなく゚レガントにできたすか たたは、再利甚可胜ですか」 うたく機胜したす。さらに先に進みたしょう。 ぀たり、ここに理由がありたす。「アヌキテクトモヌド」ずテストを蚘述できないこず、および適切なツヌルを䜿甚できないこずです。



-たあ、すべお同じように、ここでのポむントは、テストを曞くこずができないだけでなく、テストコヌドを曞くこずができないこずでもあるように思えたす。 テスト可胜なコヌドの䜜成に䌎う問題。



-そしお、あなたはそれを曞く必芁はありたせん。 TDDで䜜業する堎合、テスト䞍可胜なコヌドを蚘述する機䌚がないため、テスト可胜なコヌドを蚘述する必芁はありたせん。 なんお冗談でしょう



-うヌん うん シンプルなアむデア、あなたは䜕も蚀わないでしょう



-テストが䟿利になるように最初にコヌドをどのように衚瀺すべきかをテストで描いたずき、テストされたコヌドを確実に取埗できたす。テストされたコヌドは矎しくテストでき、うたく統合され、クヌルなAPIがありたす しかし、実際にテストを実斜するこずに決めた堎合、もちろん、テスト容易性は非垞に倧きな圹割を果たしたす。



最初にいく぀かのコヌドを䜜成し、それから次のように蚀った堎合、「さお、最初のナニットテストを䜜成したす」ず蚀うず、「ギャグ」がしばしば発生したす。 さお、ここに叀兞的な䟋がありたす-メ゜ッドで3぀のブヌルパラメヌタを䜜成したずき。 そしお、それらを枡したすfootrue、false、true。 そしお、あなた自身がそれを芋お、蚀う「ああ、それは䜕に぀いおですか 䜕も理解できたせん」たたは、たずえば、1぀のメ゜ッドを呌び出すには、倚くのセットアップを行う必芁があるため、このテストを䜜成する理由をすでに忘れおいたす。 これは、事埌テストを䜜成するずきに起こるこずです。



そしお、TDDで䜜業しおいる堎合、次のようになりたす。あなたが曞いお、テストを曞いお、最埌に芋おください。 それがどのように芋えるか、あるべき姿です」そしお、API党䜓を玠早く生成したした。 なぜなら、Java開発に぀いお話しおいるのであれば、テストからIDEを䜿甚しお倚くのものが生成され、手䜜業で曞く必芁がないからです。 その結果、TDDで䜜業する人は、この芁因のために少し速くなりたす。 圌は、単䞀のメ゜ッドシグネチャ、単䞀のコンストラクタ、単䞀のフィヌルドを手で曞いおいたせん。 これはすべお生成されたす。 さらにメガバむト。 TDDで䜜業する人が曞くのは、メ゜ッドの実装だけです。 IDEは、クラス、コンストラクタヌ、ゲッタヌ、セッタヌ、メ゜ッド宣蚀の䜜成を凊理したす。これは非垞に圹立ち、膚倧な時間を節玄したす。



-しかし、それでもテストでは、コヌドの実装に介入する必芁がある堎合がありたす。 䟋えば、私はプラむベヌトにしたいのですが、それを開かなければなりたせん。



-いいえ、開く必芁はありたせん。 ここで、方法がわからないものに戻りたす。 内郚で䜕かをテストし、プラむベヌトで閉じおいる堎合、テストしおいるクラスの責任が倚すぎるこずを意味するためです。 そしおこれは、良い方法でデザむンを少し倉曎し、テストしたいコヌドの偎面を別のクラスに入れなければならないこずを意味したす。そのタスクはたさに​​それを行いたす。 経隓豊富な開発者は、圌のデザむンが耇雑になりすぎおいるこずを瀺唆しおいたす。 もちろん、すべおを詰め蟌む1぀のクラスを䜜成できたす。 たた、ベヌスを印刷しお保存し、JSONに倉換しお、いく぀かのアルゎリズムを蚈算できるようになりたす。 そしお、結果は過床に耇雑な゜リュヌションです。 チヌムで䜜業が完了するず、そのようなコヌドを修正するのは非垞に困難になりたす。誰もがこのコヌドに乗り蟌み、ずにかく倉曎するからです。 そしお、ここに手がかりがありたす。 あなたが芋お、蚀ったなら「どうやっおこれをテストするの 開ける必芁がありたす」-それだけです。デザむンを倉曎する必芁があるずいうこずです。



-おもしろい。 わかった それでは、デヌタベヌスを䜿甚するテストの必芁性などに぀いお話したしょう。 アクセス可胜なデヌタベヌスを垞に持ち、接続を構成し、デヌタベヌスに䟝存する単䜓テストを実行する必芁があるため、私たちは地獄になり぀぀ありたす。 正盎に蚀うず、アセンブリスクリプトでそれらを無効にしたす。 どうする どこかでmoki JDBCデヌタ゜ヌスを蚘述しようずしたした-非垞に困難です。



-実際、私は非垞に倚くの時間が経過したこずに驚いおいたすが、それでもそのような疑問が生じたす。 これは、私がそれを䌝えるこずができる堎所ではないこずを意味する、ず私は報告した。



私はずっず前にこの問題に぀いお話し始めたした。「デヌタベヌス関連コヌドのTDD、どうすれば可胜ですか」ずいうレポヌトがありたす。これはいく぀かの倧芏暡な䌚議で話したした。 ここずここにビデオがあり、 ここにラむフコヌディングモヌドでこれを行う方法、デヌタベヌスの接続方法、このデヌタベヌスをテストで䜿甚する方法を瀺すプレれンテヌションがありたす。



たず、JDBC APIをダンクしないでください。 JDBC APIでmokiを䜜成する堎合、䜕をテストするのでしょうか デヌタ統合が正垞に機胜するこずをテストするのではなく、ある皋床正確に定匏化されたSQLク゚リを送信したこずをテストしたす。 ただし、SQLでは、ク゚リを簡単に再構築しお、芋た目を倉えるこずができたすが、本質的には同じです。 たずえば、それらの間でAND郚分を再配眮したす。 WHERE "user" = 'Vasya' AND "role" = 'admin'、たたはその逆。 そのような芁求に察しおmokiを実行した堎合、機胜的には䜕も倉曎しなかったこのような倉曎を加えた堎合、䜕もテストしたせん。 したがっお、統合テストをデヌタベヌスに曞き蟌む必芁があるず考えられおいたす。これにより、実際のコンテキストが䞊がり、実際のデヌタベヌスが䞊がり、䜜業が行われたす。



-しかし、実際のベヌスでの䜜業は非垞に遅いです



-ここで、むンメモリデヌタベヌスが圹立ちたす。 叀き良きHSQLDB、぀たりH2がありたす。これは、たずえばその最新バヌゞョンです。 H2はメモリ内デヌタベヌスずしお䞊昇するだけでなく、さたざたなデヌタベヌスをサポヌトする構文モヌドでも機胜したす。 ぀たり、次のように蚀うこずができたす。「H2、起きお、MySQL構文で䜜業しおください。 H2、Oracle構文で起動しお実行したす。 100互換性はありたせんが、それでもほずんどの問題を解決したす。



さらに、倚くの蚘事がすでに曞かれおいたす。どれくらいの速さ-正確に速い -RAMディスクを䜿甚しおベヌスを䞊げたす。 ぀たり、ディスクサブシステムにマップするのではなく、RAMディスクを䜜成しおRAMにマップしたす。 結局のずころ、単䜓テストを䜜成するために、実皌働環境からダンプを10ギガバむト増やす必芁はありたせんか 特定のパフォヌマンスシナリオを掚進する぀もりはありたせん。 通垞の単䜓テストを䜜成したす。これは、少数のレコヌドで䜜業のロゞックをテストする必芁がありたす。



そしお最埌に、これの別のヘルパヌはDbUnitです。 DbUnit。テストデヌタセットを非垞に簡単に操䜜し、それらを非垞に䟿利にし、XMLで、JSONで、䟿利に䜜成したす。 しかし、最善の方法は、これらのタスクをXMLで凊理するこずです。これが、構造化デヌタを取埗する方法だからです。 この堎合、特定のテストに焊点を圓おたデヌタセットを簡単に䜜成できたす。 ぀たり、たずえば、怜玢が機胜するこずを確認する必芁がある堎合、探しおいるものの倚様性を瀺す5〜10個の゚ントリを挿入し、これらの10個の゚ントリのみに泚目したす。 さらに、必芁な列のみを挿入したす。



盞互接続されたデヌタがある状況に぀いお話しおいる堎合、オンザフラむ制玄を無効にするなどのトリックがここで機胜したす。 ぀たり、たずえば、Connectionを開き、「すべおの定数の怜蚌を無効にしおください」ず蚀いたす。 それはデヌタベヌスに䟝存したすどこかでのみグロヌバルに実行でき、どこかで接続のフレヌムワヌク内で実行できたす。 定数をオフにしたす。これにより、たずえばナヌザヌを探しおいる堎合、ナヌザヌに必芁な远加デヌタに気を取られたり、挿入されたりするこずがなくなりたす。



別のトリックは、トランザクションでテストを実行する機胜です。 これは、トランザクションデヌタのテストで挿入され、同じトランザクションで、このデヌタを受信するために必芁な芁求が行われ、最終的にロヌルバックされるこずを意味したす。 このアプロヌチですべおのテストを䜜成できるわけではないこずは明らかです。 これは、デヌタを受信するテストで特にうたく機胜したす。 デヌタを挿入するテストの堎合、これは垞に良いずは限りたせん。 定数がどのように機胜するか、䟋倖が正しくスロヌされたかどうか、正しくむンタヌセプトされたかどうか、ラップされたかどうかなどを芋るのは興味深いのはそこだけだからです。



私がリストしたのは唯䞀の解決策ではありたせん。 それは、すべおのものに知られおいるもの、長い間知られおいるものです。 圌らは、この機胜を拡匵し、より䟿利にし、デヌタベヌスのテストを快適にする新しい゜リュヌションを䜜成しおいたす。



-長い間、ナヌザヌむンタヌフェむスのテストの自動化は非垞に耇雑で信頌性の䜎いものであり、自動化されたスクリプトを蚘述するよりも、挠然ず蚀い衚されたテストシナリオで䜜業しおいる人々に信頌する方が良いず感じおいたした。終わらせる。



-さお、あなたは無駄です。近幎、膚倧な数のツヌルずアプロヌチがありたした。 Webむンタヌフェヌスに぀いお話すず、確かに昔々、ブラりザを䞀呚し、さたざたなハックを考案し、JavaScriptを介しおペヌゞ自䜓に䜕かを「プル」する方法を発明したした。 しかし、特定の基準があるため、すべおがはるかに簡単になりたした。 Webアプリケヌションのツヌルに぀いお話しおいる堎合、これはWebDriverであり、そのサポヌトは珟圚ブラりザヌ自䜓ずは異なりたす。ブラりザヌ自䜓は既にWebDriver実装を内郚に挿入しおいるため、ブラりザヌをリモヌトで制埡できたす。 そしお、テストからブラりザを完党に制埡し、通垞のナヌザヌず同じようにブラりザで䜕でもできるこずがわかりたした。 ブラりザから情報を受け取るこずができ、すべおのログ、内郚凊理、倖郚環境ずの通信を匕き出すこずができたす。



同様に、モバむルアプリケヌションのテストは非垞に拡倧しおいたす。 実際のデバむスず゚ミュレヌタヌの䞡方を操䜜するためのオプションが増えおいたすが、これらにも独自のフレヌムワヌクがあり、APIテストで簡単に蚘述できたす。



実際のデバむスに関しお、珟圚掻発に開発されおいる分野の1぀はロボットテストです。 電話が挿入されおいる3Dプリンタヌでミニロボットが印刷され、それらがプログラム可胜である堎合。 ぀たり、マむクロコントロヌラヌがあり、このマむクロコントロヌラヌにコマンドを送信するこずでプログラムできたす。 したがっお、ロボットには、機械的な指のように、端に茪ゎムが付いた矜がありたす。 デバむスを特定の䜍眮に配眮するず、すべおが簡単に機胜したす。



「画面に衚瀺されおいるものをどのように読みたすか」



-電話の接続により画面に衚瀺されるもの。 画面の内容を読むこずができ、それに応じおいく぀かのアクションを実行したす。 すべおに適しおいるわけではないこずは明らかですが、䞀郚のアプリケヌションでの䜜業は自動化が非垞に簡単です。 このアプロヌチは珟圚掻発に開発されおいたす。 この分野のテスタヌに​​代わる生産゜リュヌションはありたせん。 しかし、それにもかかわらず、たすたす人気が高たっおいたす。



-玠晎らしい しかし、もちろん、私たちのチヌムはただ遠いです。



-お願い珟圚、テスト甚のクラりド゜ヌシングは開発を続けおいたす。アプリケヌションを倧芏暡なプラットフォヌムに送信するず、倚くの専門家䞭囜人、むンド人、私たちの同胞が働いおいたす。 半自動モヌドで奜きなようにテストをスケヌリングできたす。それを呌び出したしょう。



-これらの人々はテストケヌスを取埗したすか



-テストスクリプトを受け取り、それがどのように機胜するかの説明を含むアプリケヌションを受け取り、テストを実斜したす。 これは興味深い機䌚であり、倚くの人がテスタヌのチヌムを浮かばせずに苊しんでいたすが、圌らはそこでそれを䞎えるこずができたす。



さらに、珟圚非垞に掻発に開発されおいるもう1぀の分野は、芖芚テストですたずえば、Applitoolsを䜿甚。 非垞に簡単な蚀葉で説明するず、Webに぀いお話しおいるずきにスクリヌンショットが撮られおいる堎合、WebDriverを䜿甚しおアプリケヌションの特定のスクリプトが実行されたす。 そしお、スクリヌンショット比范アルゎリズムが実装され、倉曎が特定されたす。 たずえば、昚日、スクリヌンショットが撮られたした。私たちは圌を芋お、次のように蚀いたした。 これがベヌスラむンになりたす。」 そしお、今日はスクリヌンショットを撮りたした。 これらのスクリヌンショットを分析するアルゎリズムがあり、倉曎が発生した堎所を正確に远跡しおグルヌプ化できたす。



-そしお、フォントを倉曎し、画像が倉曎されたずしたしょう。 それで䜕 テストは今倱敗したしたか



-いや 圌らはこれを実践する方法を知っおいたす。 圌らはこれらをグルヌプ化する方法を知っおいたす。 ぀たり、圌らは蚀う「ええ、ここでフォントが倉曎されたこずがわかりたす。」 さらにいく぀かのスクリヌンショットを芋お、「これは倉曎の皮類です。1番-フォントが倉曎されたした。」 そしお、あなたはそれを確認しなければなりたせん。 「そうです、アプリケヌションのフォントを実際に倉曎したした。」 , , , , .



, . , , - , , , . « »? : « — - , , », . , , . - , , , , , .



, : «, ». : «Confirmed, , ». baseline . , .



, : . , . : Firefox, Chrome, IE, Safari, . . , baseline- .



, .



— .



— , . , Selenium Camp , . Selenium WebDriver. , WebDriver- , «». , .



, . . , Google, Facebook .



— , , ? — ?



— , , .



— UI?



— ! , , API.



, , -, - , «» . , , - , , . . .



— - workflow . . workflow- , , , , , , . , , , , .



— ? , ?



— ? . - flow. flow, , . , flow , , . flow, , , . . , , , . - , . . , , - , , . , , , API , «». , , . , . , , , - , .



, . IDE . , - , . background-. , , , IDE , , - , - .



, , , , . , , CI- TeamCity. : , , : «, ?» — , , , — CI-.



— Jenkins ?



— , , .



— !



— , Jenkins , ! , CI. , : « quality gate». quality gate , .



, IDE . , , nightly builds, . , , .



, , , , WebDriver, . API . W3C, , , — , , , — , . , , , API , .



— , . !



— ! !






, QA, Joker 2016 (, 14-15 ).



, (, 10 ).



, 09.09!



All Articles