メルカリが利用する「PHPUnit」を3世代分アップグレードできた理由:Intelの開発モデルを参考に(2/2 ページ)
日本PHPユーザ会が開催した「PHP Conference 2018」で、メルカリの柏木大助氏は、メルカリの主要サービスのバックエンドを担うプロジェクトで利用していた「PHPUnit 4」を「PHPUnit 7」にアップグレードした理由や、作業方法を説明した。
Intelの開発モデルを参考に
そこで柏木氏が、PHPUnitをアップグレードする際に参考にしたのが、Intelの「TickTock Model」だ。
TickTock Modelとは、Intelが採用していたCPUの開発ロードマップモデルだ。「半導体の微細化」と「アーキテクチャのリニューアル」を1年半ごとに進化させることで、市場の急激な変化によるリスクを減らし、確実にCPUをリリースする狙いがある。
柏木氏は、TickTock Modelを参考に、「難問を分割する」「1つのことに注力してうまくやる」ことを考えた。まず、PHPUnitをアップグレードすることは「テストコードを修正すること」と「PHPUnitのバージョンをアップグレードすること」の2つに切り分けて取り組むことにした。さらに、テストコードを修正する際は、前方互換(Forward Compatible)を意識した。最終的なゴールであるPHPUnit 7に向けて、PHPUnit 4で動作するコードが、PHPUnit 5の環境で、PHPUnit 5で動作するコードが、PHPUnit 6の環境で動作するよう、互換レイヤーを作成するなどして対応した。
もし他の開発者が前方互換性を無視したコードを追加した場合は、その都度修正し、前方互換を意識したテストコードの書き方がプロジェクトに浸透してから、PHPUnitのバージョンをアップグレードすることにした。
柏木氏は、テストコードをどのように修正したのか具体例を挙げて説明する。
「例えば、PHPUnit 4からPHPUnit 5へのアップグレードでは、PHPUnit 5から非推奨となるgetMock関数を使わないよう、createMockかgetMockBuilderという別の関数に修正した。ただ、PHPUnit 4ではcreateMock関数が実装されていないため、互換レイヤーを作成し、createMock関数がPHPUnitのライブラリ内に存在するかしないかで実行する関数を変えるようにした。こうした修正をスクリプトによる自動修正も駆使しながら繰り返し行い、全てのテストコードがPHPUnit 4と5で動作するのを確認してから、PHPUnit 5にアップグレードした。これにより、composer.lockをコンフリクトさせずに、テストコード修正を実施でき、他の開発者への影響を最小限にできた」
こうした改善をPHPUnit 5からPHPUnit 6、PHPUnit 6からPHPUnit 7にアップグレードする際も継続し、約5カ月かけてPHPUnit 4からPHPUnit 7にアップグレード。さらに、この経験を基にAmazon Web Services(AWS)のPHP向けSDK「AWS SDK for PHP」や、ログ出力ライブラリ「Monolog」など、PHPUnitをアップグレードしていなかった複数のオープンソースソフトウェア(OSS)に貢献することもできたという。柏木氏は次のように講演を締めくくった。
「今回の作業を含め、自分の仕事を社内で評価してもらい、昇給することもできた。ライブラリのアップグレードでハマったことや、問題解決に至った方法があれは、ぜひブログや勉強会などで共有してほしい。そして、普段利用しているOSSに還元していってもらいたい」
Copyright © ITmedia, Inc. All Rights Reserved.
関連記事
- PHPUnitでユニットテスト
開発の全工程の中で、あまり人気がないのがテスト工程だ。ソフトウェアの品質を証明するためのテストは、なぜ低く見られてしまうのか(編集部) - テスト駆動開発/振る舞い駆動開発を始めるための基礎知識
TDDの概要と進め方、目的と効果、歴史、さまざまな手法への展開、課題に加え、BDDの概要と種類、 重視される考え方などを解説する。 - Gitでコンフリクトが起きても大丈夫! コンフリクトを解消させる3つの方法
本連載では、バージョン管理システム「Git」とGitのホスティングサービスの1つ「GitHub」を使うために必要な知識を基礎から解説していきます。今回は、意図的にコンフリクトが起こるような操作を行って、コンフリクトが起こったときの対処方法を図を交えて説明します。