メルカリが利用する「PHPUnit」を3世代分アップグレードできた理由:Intelの開発モデルを参考に(1/2 ページ)
日本PHPユーザ会が開催した「PHP Conference 2018」で、メルカリの柏木大助氏は、メルカリの主要サービスのバックエンドを担うプロジェクトで利用していた「PHPUnit 4」を「PHPUnit 7」にアップグレードした理由や、作業方法を説明した。
2018年12月15日、日本PHPユーザ会はPHP Conference 2018を開催した。本稿では、メルカリの柏木大助氏の講演「大規模PHPプロジェクトでPHPUnitを3世代アップグレードするためにやったこと」の内容を要約してお伝えする。
柏木氏は、メルカリのバックエンドを支えるプロジェクト「mercari-api」で起きた「PHPUnit 4」のバージョンアップに関する問題を解決し、PHPUnit 7にアップグレードさせた。講演では、どのような考え方でアップグレードを進めていったのか、戦略や方法について説明した。
なぜPHPUnitをアップグレードすべきなのか
メルカリでは、多くのプロジェクトでWebアプリケーションの単体テストや、機能テストのために「PHPUnit」を導入している。PHPUnitとは、単体テストを自動化するためのテストフレームワークだ。PHPフレームワークの「Laravel」や、パッケージ管理ツールの「Composer」など、多くのPHPプロジェクトで採用されている。
米国版メルカリのバックエンドエンジニアである柏木氏は、PHPUnit 4からPHPUnit 7にアップグレードすべき理由として、サポート切れや新しいPHPのバージョンでPHPUnit 4が動作しなくなるリスク、コードの可読性や拡張性が向上する点を挙げる。
「PHPUnit 4やPHPUnit 5のサポートは終了しており、2019年2月にPHPUnit 6のサポートも終了する。また、PHP 7.2でPHPUnit 4を実行するとDeprecated(非推奨)エラーが表示され、将来のPHPではPHPUnit 4が実行できなくなる可能性もある。新しいPHPUnitでは名前空間や型宣言が導入される利点もあることから、PHPUnitのアップグレードが必要だった」
24万行に及ぶテストコードが修正の対象に
PHPプロジェクトでComposerを利用する場合、プロジェクトに依存するライブラリを「composer.json」というファイルで記述する。ライブラリのバージョンをアップグレードするには、composer.jsonでPHPUnitのバージョン記述部分を編集した後、「composer update」コマンドを実行することで、PHPUnitのバージョンをアップグレードできる。
メルカリのバックエンドを担う主要コンポーネントのmercari-apiプロジェクトでは、2017年11月時点でリポジトリに1310ファイル、24万3802行のテストコードが含まれていた。また、GitHub Flowを用いて数十人で開発が進められていたため、PHPUnitの更新が一筋縄ではいかないという課題があった。
「大量のテストコードを修正する必要があるのと、他開発者が書いたテストコードが利用できなくなる恐れがあった。例えば、masterブランチでPHPUnit 4を利用していた場合、masterブランチから新しくブランチを作成し、既存のテストコードをPHPUnit 5でも動作するよう修正する。そして、作業内容をmasterブランチに統合してPHPUnitのバージョンを更新する。一方、その作業をしている間に他の開発者はPHPUnit 4前提のテストコードを他のブランチからmasterブランチに追加する。その結果、PHPUnit 4のテストコードをPHPUnit 5で動作するコードに修正する作業中に、PHPUnit 4前提のコードがmasterブランチに追加され続けるため、アップグレード作業を終わらせられない可能性があった。さらに、masterブランチにアップグレードした作業を統合できたとしても、他の開発者のブランチにはPHPUnit 4前提のコードが残っているため、テストコードが壊れてしまい、全員がテストコードの修正に追われる可能性もあった」
さらに、他の開発者が新機能を開発するためにComposerでライブラリを追加すると、「composer.lock」というファイルの中身が更新される。PHPUnit 5更新用ブランチと、新機能開発ブランチで導入するライブラリに違いが生じると、masterにコードを統合する際、コードの衝突(コンフリクト)が起こる恐れもあった。
「コンフリクトを修正するには、相手の作業による変更点を全て取り込んでから、自分のやりたかった作業を再度やり直すことになる。大規模プロジェクトで長期間、アップグレード作業をしようとすると、泥沼化することが想像できたので、PHPUnitをアップグレードするに当たり、戦略を考えることにした」
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- PHPUnitでユニットテスト
開発の全工程の中で、あまり人気がないのがテスト工程だ。ソフトウェアの品質を証明するためのテストは、なぜ低く見られてしまうのか(編集部) - テスト駆動開発/振る舞い駆動開発を始めるための基礎知識
TDDの概要と進め方、目的と効果、歴史、さまざまな手法への展開、課題に加え、BDDの概要と種類、 重視される考え方などを解説する。 - Gitでコンフリクトが起きても大丈夫! コンフリクトを解消させる3つの方法
本連載では、バージョン管理システム「Git」とGitのホスティングサービスの1つ「GitHub」を使うために必要な知識を基礎から解説していきます。今回は、意図的にコンフリクトが起こるような操作を行って、コンフリクトが起こったときの対処方法を図を交えて説明します。