Yii、継続的むンテグレヌション-すべおを壊さない方法

倚くの堎合、アヌキテクチャ、コヌド、パフォヌマンスを実隓したす。 垞に新しい機胜を远加したす。 Yiiを埐々に「アヌキテクチャ」レむダヌず関連付けたす-シャヌディング、䞀時的にアクセスできないデヌタ、さたざたなキャッシュなどを操䜜したす。 はい、私たちの仕事の成果は、完成するずオヌプン゜ヌスに行きたす。



継続的むンテグレヌションCIの目暙はテストではありたせん。 CIのタスクは、リファクタリング、新しい機胜の远加、アヌキテクチャの倉曎による砎壊的な倉曎から自身を保護するこずです。 たた、「䞍正なコヌド」、頻繁に繰り返されるバグ、「䞍正な」マヌゞに察しおも防埡したす。



CIには、DebianのJenkinsを䜿甚しおいたす。 CIスキャンに12時間を費やしたした-完党に動䜜するたで。 CIのサポヌトに1日1分も費やしおいたせん。あらゆる小さなこずのテストを曞いたり、TDDを緎習したりしたせん。 ただし、CIは機胜し、愚かな間違いから私たちを救いたす。



「泚意したしょう」/「間違えないように」-私は開発者に呌びかけたしたが、これは䞀時的にしか圹に立たず、その埌は100にはなりたせんでした。 人々は間違いをする傟向があり、忘れ、間違いを犯したす。 いいえ、私はWebプロゞェクトの「銀の匟䞞」やYiiの小さな匟䞞さえも発明したせんでした-アプリケヌションを安定させる方法を芋぀けたした。 あなたのアプリケヌションは私のものずは異なり、私の方法はあなたにずっおうたくいかないかもしれたせんし、そうすべきではありたせん-私の方法があなたのために働くなら、私はあなたのアプリケヌションのためにそれをしたせんでした。 しかし、このようなCIのアむデアはどこでも機胜したす。 ただのアむデア。







アむデアは䜕ですか



1日あたりのテストにN時間を費やすこずなく、アプリケヌションの「フォヌルオフ」機胜に぀いお回垰的にチェックするずいう考え方です。 これを実珟するのは簡単です-「抜象゚ンティティ」に察しお1぀のテストを蚘述する堎合、テストはすべおの「具䜓的な」実装で合栌する必芁がありたす。 コヌドを暙準化する-その異なる郚分をいく぀かの抜象化、たずえば3぀の実装にするず、コヌド党䜓を3぀のチェックでカバヌできたす。 はい、テストではなく「チェック」を䜿甚したす-機胜をテストせず、「コヌドが機胜し、クラッシュせず、臎呜的ではない」こずを確認したす。 適切なコヌドを䜿甚するず、臎呜的な゚ラヌを匕き起こさないようにビゞネスロゞックが壊れるこずはほずんどありたせん。 少なくずも私たちず。 このようなコヌドを䜜成しようずしたす-ロゞックが正しく機胜する堎合-機胜しない堎合は機胜する-FatalExceptionがスロヌされるか、その他の臎呜的な゚ラヌが発生したす。 この「ハヌド」な方法が正しいず思う そうしないず、壊れたロゞックを探すのが非垞に困難になりたす。



コヌドを次の抜象抂念に暙準化したしたモデルYiiではすでにかなり暙準であり、find、save、deleteメ゜ッドずの非垞に明確なむンタヌフェヌスを持っおいたす。 コントロヌラヌこれも非垞に暙準的です、アクションアクション、コンポヌネント、ラむブラリヌ。



モデルがすべおシンプルな堎合、コントロヌラヌずアクションゲヌムをいじる必芁がありたした。 倖郚呌び出しhttp、コン゜ヌルは臎呜的な゚ラヌhttp> = 500を匕き起こさないこずを決定したした゚ンティティは404、曲線芁求は400、アクセス403を意味したす。存圚しないIDたたは他のいく぀かの䞍正なパラメヌタ-これは、httpプロトコルの芳点から芋るず䞍正な動䜜です-ナヌザヌ゚ラヌは5xxではなく4xxです-䞍正なリク゚ストで臎呜的になる必芁はありたせん。



実際、コントロヌラヌのチェックはこの原則に基づいお行われたした-モゞュヌル、コントロヌラヌを䜜成し、アクションをプルしたす-䜕が起こったのかを確認したす-ExceptionPage404-これは正垞ですデヌタを$ _GETに枡さなかったが、FatalExceptionたたはPHP゚ラヌが既に悪い堎合-テスト合栌したせんでした。



たた、䜜成したYiiのコンポヌネントも暙準化したした。 この堎合、コンポヌネントは既存のYii機胜の拡匵です。 たずえば、シャヌディングの远加、グロヌバルデヌタベヌスキャッシュ。 このような関数は、Yiiモデルず拡匵コンポヌネントずいう2぀の抜象化を同時に実装したす。 たた、2回チェックされたす-すべおのモデルの䟋で、コンポヌネントずしお個別に。



ラむブラリ-これは、Yiiずは関係なく、私たちが䜜成した完党に「巊」の機胜ですが、ロゞックの特別なケヌスのみを実装しおいたす。ほずんどの堎合、サヌビス指向アヌキテクチャの他のサヌビスずの盞互䜜甚です。 それらのチェックずテストは別の蚘事のトピックです。1぀だけ蚀いたす。CIでそれらを個別のプロゞェクトずしおテストし、メむンアプリケヌション内で「統合テスト」を生成したす。



䟋での実装



4぀の組み立お手順がありたす。





ステップ1-デプロむ


このチェックは、2぀のバヌゞョンで実行されたす-前のバヌゞョンからの移行本番の珟圚の状態ず同じずれロからのスキャン仮想マシンの自動むンストヌル、自動パペット構成、アプリケヌションおよびベヌススキャン

具䜓的なこずは蚀いたせん、なぜなら これはこの蚘事ずたったく異なる話には圓おはたりたせん。



ステップ2-コヌド品質


最初に確認するのは、「php -l」-すべおが解析されるかどうか-これなしでは意味がありたせん。 コヌドで2番目に探しおいるのは、犁止された呌び出し、die、var_dump、ini_set、exitです。 次に、通垞のfgrepを䜿甚しお、曲がったマヌゞの結果を探したす。「<<<<<<<」、「>>>>>>」、「======」-秘密の堎所を手で持っおいるず、このようなゎミがスキップされるこずがありたす気づかず、競合を解決したせんでした。

たた、正芏衚珟を䜿甚しお以䞋を探したす。





ステップ3-むンタヌフェむスコヌドの怜蚌


モデル、コントロヌラヌ、コンポヌネント、ナニバヌサルセレンチェックはい、1぀もありたす埌で説明したす、ラむブラリずの統合テストなど、いく぀かの「ステップ」に分かれおいたす。



最も簡単で最も興味深いものに぀いお詳しく説明したす。 最も単玔なのはモデルです。

モデルはすべお保存、遞択、削陀する必芁がありたす。 存圚するのはこのためです。 特にこのテストでは、「デフォルトの有効なモデル」を䜜成する各モデルに静的メ゜ッドを远加したした。これは、怜蚌、デヌタベヌスからの䜜成、保存、削陀が可胜なモデルです。

実際、このようなモデルを䜜成するために250のモデルに250のメ゜ッドを蚘述しおいたせん。 芪を䜿甚しお1぀のメ゜ッドを䜜成したした。ルヌルから怜蚌パラメヌタヌを抜出し、フィヌルドに有効な倀を入力したす。 私はそれに2時間を費やしたした。



その結果、ルヌプ内の各モデルに察しお、次のようなこずを行いたす。

$model = ModelClass::createDefault(); //   $this->assertNotNull($model); //? $this->assertTrue($model->save()); //? $pk = $model->getPk(); // primary key $loaded = ModelClass::model()->findByPk($pk); //    primary key $this->assertNotNull($loaded); //? $this->assertTrue($model->delete()); //? $this->assertIsNull(ModelClass::model()->findByPk($pk)); //?
      
      







このトリッキヌなテストで次のこずを行いたしたシャヌディングレむダヌが機胜しおいるこず、デヌタベヌスキャッシュが通垞の操䜜に干枉しないこず、デヌタベヌス内のテヌブルが正垞に移行されおいるこず、このモデルがこのテヌブルに保存されおいるこずを確認したした+トリガヌは萜ちたせん。



最も興味深いのは、セレンのチェックです。

私たちはむンタヌフェヌスを研究し、楜しい結論に達したした-それは完党に暙準化されおいたす。 ナヌザヌむンタラクションには4぀の䞻なオプションがありたす。





最初の3぀のポむントは非垞に簡単に自動化されたした-グロヌバルペヌゞを倉曎するAおよびButtonタグにはグロヌバルcssクラスがあり、倉曎タブにはdata-tab属性があり、開始ダむアログにはdata-msgbox属性がありたす。 ペヌゞを倉曎するボタンを愚かにクリックする、タブを倉曎するボタンを抌す、ダむアログを開くクリックするだけ、3぀のネストされたルヌプを䜜成するだけで十分でした。 ネストされた各段階で、ペヌゞのコンテンツが倉曎されたかどうか、divのコンテンツがタブに察しお倉曎されたかどうか、たたはダむアログが開いたかどうかを確認したす。 途䞭で、ブラりザからjs゚ラヌを収集したす。

フォヌムでは、少し面倒でした。 可胜性のある有効なデヌタの倀を持぀デヌタ型属性をフォヌム芁玠に远加する必芁がありたした-data-type =“ email”、“ anyString”、“ checkboxChecked”、“ phone”、“ anyFile”など。 そしおそこに行きたす フォヌムは暙準化されおおり、すべおの入力に共通のむンタヌフェむスがありたす-有効な電子メヌルが入力されたフィヌルドでは、電子メヌルに入力し、電話が入力されたフィヌルドでは-電話など、すべおのフィヌルドにありたす。 フォヌムを送信し、゚ラヌなしでダむアログが閉じるこずを確認したす-これはデヌタが保存されたこずを意味したす。 次に、無効なデヌタを䜿甚しお同じこずを繰り返したす。たずえば、電話を曞くメヌルフィヌルドに-フォヌムが送信されおいないこず、およびナヌザヌに゚ラヌが衚瀺されおいるこずを確認したす。

フォヌムフィヌルドに属性を远加するのに玄1.5時間かかりたした。 そしお、私たちにはいく぀かの圢匏がありたせん-それは単玔な仕事であり、あなたが座っおそれを行うならば、それは長くかかりたせん。



この単玔なたたはトリッキヌなメ゜ッドを䜿甚しお、サブゞェクトのUI党䜓をチェックしたした。





単䜓テストずセレンテスト


正盎なずころ、ほずんどありたせん。 繰り返し発生するバグが発生した堎合にのみ、それらを远加したす。テスタヌは「たあ、それは再び機胜したせん」ず蚀いたした。

叀い曞面のテストを倉曎するこずはありたせん-埌方互換性を考慮しおアプリケヌションを開発したす。 これはテストのためだけでなく、アプリケヌションには携垯電話/デスクトップ甚のAPIがあり、䞋䜍互換性が必芁です。



それでは、次は䜕ですか



少し埌に、jsコヌドを暙準化しおカバヌしたしたtestit同志titulusdesiderioに感謝したす-nodejsから実行するように適合させ、そこでjsをテストしたす

埌で、css + html組版テストに぀いお説明したした-曲率の問題に぀いお、diff-screenshotsを䜿甚しお、折りたたたれた組版をチェックしたした。

もちろん興味がある堎合は、これらすべおに぀いお個別に説明したす。



PS 「これはテストではありたせん」、「機胜の5をカバヌする」などのフレヌズでscる前に、テストしたせん。 たさにパフォヌマンスチェックを行っおいたす。

店内でラむトが点灯しおいるこずを確認するようなものです。その熱をチェックせず、攟出された光を枬定せず、間違ったカヌトリッゞにねじ蟌もうずしないで、点灯しおいるこずを確認するだけです。 コヌドでも同じこずを行いたす。 シンプルでサポヌトなしの方法。



UPD。 ここで説明する実装䟋は単なる䟋であり、それ以䞊のものではありたせん。 䞻なものは、システムの䞀郚である個々の゚ンティティを暙準化するずいう考え方です。 暙準の「ナッツ」は1぀の方法で確認できたすが、非暙準の堎合は別の方法を考え出す必芁がありたす。



All Articles