品質を担保するためのアーキテクチャー

品質とアーキテクチャーは非常に密接な関係にありますが、世の中にはそのようなことを考える人は非常に少ないというのもまた事実だったりします。しかし正しいアーキテクチャーでソフトウェアを組めば、開発後半戦で多量のバグが発生したり、製品もメンバーの心もボロボロにならずにすみ、健全に開発計画をまっとうできます。

悪いアーキテクチャー

ユーザインターフェースや、様々な入出力のプログラムがあちこちにちらばっており、いったいどこをテストすればソフトウェアの品質保証ができるかがわからないインターフェースです。

よいアーキテクチャー・インターフェース

よいアーキテクチャーとはユーザとのインターフェースが独立しています。これはテストの観点としての言い分ですが、ユーザインターフェースが独立していれば、そこに対して集中的なin/outのテスト実行が可能です。テストの本質はいかにin/outをきちんと網羅できるかが80%だと思いますが、そこが無限であったりするので、組み合わせテストが必要だったり、その削減手法(all-pairとか)が存在します。でもそこを自動化できたらどうでしょうか?機械に24時間in/outをずっとテストさせれば組み合わせテスト削減もいらず、どんどんバグが出せると思いませんか?

どうやってソースコード実装するか

この手のソース実装は昔は結構メンドウでした。技術的にメンドウという意味ではなく、強力なアーキテクトがそのプロジェクトを引っ張って行く必要がありました。まずGo4(今は死語?若手の方は検索してみてください)のデザイン・パターン(https://amzn.asia/d/4MqtcHn)を読ませ、理解させそして実装を手取り足取りヘルプする必要があった。今はWindowsでもAndroidでもそのフレームワークが充実してきたので、「みんなでこのフレームワークつかいましょうね」と言うだけで皆納得する時代になりつつあります。概念は少しむずかしいですが一度フレームワークを作ってしまえば、あとは結構コピー&ペーストの世界なので慣れてしまえば手放すことができないのがフレームワークです。覚えるのはややメンドウ、ググってもよいものが出てこない。ただ個人的にはこのYouTubeの教え方がよく理解できました(https://www.youtube.com/watch?v=KWjF4_kpIkU)

テスターが理解できる簡単開発ソースコード

上記のYouTubeのソースはやや冗長なので、簡単な形で書いてみます。いろいろMVVM(Model View View Model)のソースを探してみましたがテスト担当者が簡単に理解できるようなソースは見つからず、筆者独自で書いてみましたので参考にしてください。
public void setEmail(String email) {
this.email = email;
Log.d(“view_mode”, this.email);
上記のコードがあるので、emailエディットボックスになにか入れるとview modelにその値が反映されるのがlog.dで見ることができます。

MVVM apps ダウンロード

自動化用テストコード

それでは自動化テストコードはどう書くのでしょうか?2つの方法が考えられます。
1つは開発者テストのようにスタブ/ドライバー(モック)を書いて行う方法。この方法がベストかもしれませんが、日本できちんとこの方法で実装している例をみたことがありません。おそらくGoogle, Facebookなどではやっていると思いますが。
もう1つはシステムテスト的アプローチで、かなり現実的なアプローチです。普通の自動化ならUIレイヤーから叩くのですが、View Modelレイヤーからテストケースを叩きます。これならUIの変更に左右されにくいですが、ある機能をテストするためには、そこまでたどり着くテストケースを書かないといけないのは既存のテストと同様です。アプリや開発スタイルによってここをどう自動化実装するかはcase by caseになると思われます。

関連資料