レポート「数百のクライアントバージョンのモノリス」の概要(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)がデータベースに追加されます。

長所:


短所:


開発者がコードカバレッジ、つまりコンソールで実行できるツールをすぐに見る必要がある場合、特定のファイル/コンポーネントのカバレッジの最新のメトリックをすぐに取得できます。
扱いにくいと見なされます。対象マスタのデータが取得され、変更されたすべてのテストが追加され、カバレッジがすでに考慮されている小さなスイートが判明します。

まとめ



参照資料


Source: https://habr.com/ru/post/J429776/


All Articles