レポート「数百のクライアントバージョンのモノリス」の概要(HL2018、Badoo、Vladimir Yants)

HL2018で一連の要約を継続します。 Badooのメンバー(Vladimir Yants vyantsとNikolai Krapivny)がこの大要をチェックするのを手伝ってくれました。 これが報告書のメッセージの質にプラスの効果をもたらすことを願っています。



画像



開発プロセスの特徴:



開発者の責任は、バックエンドのリリースで終わりません。 彼は、プラットフォームに実装する前に責任を負います。



画像



手動テストはありますが、クライアントはリリース時に準備ができておらず、(予測不可能な)遅延でリリースされます。 多くの場合、顧客がいつそれを実装し始めるのかわかりません。 時々(あまり頻繁ではないが)機能が長い時間の後に実行されるようになります。 したがって、手でテストすることは難しく、すべてが可能というわけではありません。 したがって、自動テストが必要です。



テスト



単体テスト



phpunitで書かれています。



小さなユニットをテストします。 データベースやサービスにはアクセスしません(何もやり取りしないでください)。



レガシーはまだテストプロセスを保持し、複雑にします。



彼らはsoftMocksライブラリを開発しました-それはすべてinclude / requireをフックし、それを変更されたものと置き換えます。



静的メソッド、プライベートメソッド、最終メソッドなど、あらゆるメソッドをまとめることができます。

ライブラリはオープンソースで利用可能です。



問題:ソフトモックはリラックスし、テストされていないコードを記述できるようにします(そしてテストでカバーします)。



ルールを受け入れました:





これらのルールのコードレビューを確認します。



テスト品質



突然変異試験





既製のソリューション(Humbug、Infection)がありますが、それらは適合しませんでした(ソフトモックと互換性がなく、コードカバレッジに問題があります)。 したがって、彼らは自分で書きました。



突然変異テストは、手動テストではまだ利用できません。 コンソールから手動で実行できます。 現在、CIパイプラインに実装し、プロセスを構築しています。 結果はHabrにあります。



統合テスト



いくつかのコンポーネントの動作を組み合わせてテストします。 ベースやサービスで作業を確認します。



データベーステストの標準アプローチ(DBUnit):



  1. テストデータベースを上げる
  2. それを埋める
  3. テストを実行する
  4. データベースを消去します


問題は次のとおりです。





ソリューション:DBMocksライブラリ(独自のソリューション)



動作原理:





ライブラリは小さいですが、まだオープンソースで開かれていません。



結果:





APIテスト





通常、このようなテストには承認されたユーザーが必要です。 テストの前に作成し、後で削除する必要があります。 これにより、追加のリスク(レプリケーション、バックグラウンドタスク)が発生します。



解決策:テストユーザーのプールを作成しました。 それらをきれいにする方法を学びました。



画像



devel!= Prodであるため、テストユーザーは実際のユーザーと同じ環境にいます。 テストユーザーとライブユーザーを分離する必要があります。



分離のために、ユーザーにis_test_userフラグが追加されました。 また、これらのユーザーは分析およびa / bテスト結果からも除外されます。



テストユーザーを「南極大陸」に送ることで安くすることができます。そこでは誰も見ることができません(ペンギンを除く)。



QA API



APIテストで環境を準備するためのツール。基本的に、ユーザー/環境設定をすばやく変更するためのバックエンドのバックドア。





ユーザーが不変データ(たとえば、登録日)を変更できるようにします。



必要な保護:





HackerOneにはBugsBountyプログラムがあります。 発見された脆弱性の代価を支払います。 QA APIを使用することはできませんでした。



リモートモック



リモートバックエンドのMoki。



ソフトモックのベースで作業します。 テストでは、バックエンドにモックセッションの初期化を要求します。 要求を受信すると、バックエンドはセッションのmoxのリストをチェックし、SoftMocksを使用してそれらを適用します。



テスト例:



画像



APIテストは便利すぎます。 ユニットの代わりにそれらを書くのは魅力的です。 ただし、APIテストは非常に遅くなります。



一連のルールを受け入れました:





Uiテスト



バックエンドコマンドは書き込みません。



この機能は、安定するとUiテストでカバーされます。

Selenium for Webで使用されます。 モバイルひょうたん用。



試運転



100,000ユニットテスト。 6,000の統合、14,000のAPIテスト。

1ストリームでは、時間は40分/ 90分/ 10時間です。



TestCloudの作成-テストを実行するためのクラウド。



画像



スレッド間のテストの分散:





解決策:





apiテストの問題は、長い時間と多くのリソースであり、他のユーザーの実行を許可しません。



解決するために、クラウドを2つの部分に分割しました。



  1. クイックテストのみを実行します。
  2. 両方のタイプのテストを実行します。


その結果、次のことが加速されます。





コードカバレッジの実行



実行するテスト コードカバレッジが表示されます。



  1. ブランチ差分を取得します
  2. 変更されたファイルのリストを作成する
  3. これらのファイルのテストのリストを取得します。
  4. これらのテストからのみスイート実行を実行します。


マスターブランチのカバレッジは、1日に1回、夜間に形成されます。 結果(diff)がデータベースに追加されます。



長所:





短所:





開発者がコードカバレッジ、つまりコンソールで実行できるツールをすぐに見る必要がある場合、特定のファイル/コンポーネントのカバレッジの最新のメトリックをすぐに取得できます。

扱いにくいと見なされます。対象マスタのデータが取得され、変更されたすべてのテストが追加され、カバレッジがすでに考慮されている小さなスイートが判明します。



まとめ





参照資料






All Articles