ソフトウェア開発、つながる時代の品質テストとは? テスト駆動開発の今【セミナーレポート】
※ この記事は 2017年08月07日に DX LEADERS に掲載されたものです。
システム開発において、品質を担保することは非常に重要である。今は様々なものが当たり前のようにインターネットとつながり、データやセンサー情報を収集している。システムが変わればテストは変わっていく。安心安全なテストはもちろん、日々進化する技術を取り入れつつも、品質を担保できるように、テストファーストな考え方も出てきている。
一般社団法人IT検証産業協会(IVIA)が主催するIT検証フォーラム2017は、次世代を見越した検証の役割を考えるべく『つながる世界の第三者検証』と題したセミナーを開催した。
すべての人々がより多くのことを達成するため、30種類のAPIを公開
「私、マイクロソフトに入って、今が一番楽しい時期と思っています。AIやチャットボット、VRなど本当に面白いものばかりです。」
そう語るのは、日本マイクロソフト株式会社テクニカル エバンジェリスト 大田 昌幸だ。
最新の技術動向からテストを前提とした今どきのソフトウェア開発の考え方に至るまで、デモや実例を交えての内容だった。
「マイクロソフトのミッションは、以前は“世界中のすべての机にコンピュータを”という野心的なミッションだったのですが、“地球上のすべての個人とすべての組織が、より多くのことを達成できるようにする”ことが今のミッションです。目の前で相対しているお客様とより多くのことを達成するというのは、非常に素敵なミッションだと思っています。」
お客様とは、パソコンやスマートフォンを利用する一般ユーザーはもちろん、開発者のことも指している。AIに関していえば、“AIの民主化”を掲げ、AIをより身近な存在にすることを目指している。
マイクロソフトは世界中で研究開発を行っており、画像認識の誤差率に関しては人間の誤差率よりも低いといわれ、実用レベルに達しているところまで来ている。
「我々自身も頑張るのはもちろんなのですが、結局ユーザーの皆さんに使ってもらわないといけないですし、結果的にみなさんの生活がより豊かになるために、より多くのことを達成できることが重要です。」(大田)
マイクロソフトでは、ユーザー向けにもAIを利用した様々なサービスをリリースしている。パーソナルアシスタントとしておなじみのCortanaはWindows10をはじめ4億以上のデバイスに搭載されている。
また、音声認識と翻訳機能を有したものであれば、Skype Translatorというものも用意されている。
これは言葉の壁を越えてSkype上で会話ができるサービスだ。例えば、英語が母国語の人に、こちらが日本語で話しても、Skypeを介して自動翻訳をして、相手方には英語で伝えてくれるというサービスである。
文字認識と翻訳機能でいえば、PowerPointにも翻訳機能のアドインがある。これを利用すれば、一瞬でPowerPointの多言語対応ができるというわけだ。
マイクロソフトはこういった便利な機能についてもAPIを公開しており、利用用途に応じてカスタマイズすることが可能だ。マイクロソフトのAPIである「Cognitive Services」は、視覚・言語・音声・検索・知識の5分野、29種類のAPIやサービスを提供している。このうち3つほど紹介していこう。
ユーザーの要望にあわせて、APIも日々進化。商品の判別までできるように
1.Computer Vision API
「画像を送信すると、映っている画像がどんなものであるかを教えてくれます。たとえば、これは男性が泳いでいる写真ですが、”water”, “swimming”, “sport”, “pool”など、勝手にタグ付けをしてくれます。」(大田)
引用元:Computer Vision — 画像処理および画像分析 | Microsoft Azure
このAPIは、マーケティング会社への導入事例があるという。マーケティング会社は10億単位で写真や動画を有しているという。しかし、画像の保存場所が様々であったり、タグ付けなどもされていなかったりすると、検索もしづらい。そのため、再利用も難しく、昨年作成したものと同じような画像を作成することになり、予算が掛かってしまうという課題を抱えているそうだ。
これを解決したのがこのAPI。画像をAPIに読み込ませると自動的にタグ付けされ、検索性もよくなり、業務効率化や予算の削減にもつながるということだ
2.Face API
「この写真をAPIに読ませると、23歳くらいの女性、眼鏡を掛けているという情報のほかにも、口角の位置などから、笑顔、怒り、悲しみ、驚きなど感情を数値化して教えてくれます。」(大田)
引用元:Face API – 顔認識 | Microsoft Azure
これを組み合わせたソリューションの例として、アロバビューコーロというものがある。
これは監視カメラと連携しており、来店しているお客様の年齢層や、お客様が常連かどうかも判断することができるのだそうだ。そして、大田はPOSレジを利用する店舗に対しても応用ができるのでは、と語る。飲食店などでPOSレジを利用している店舗は多い。飲食店でアルバイトの経験がある方は思い当たる節があるかもしれないが、ランチ時など忙しい時間帯は、お客様の顔を見て年代や性別をPOSレジに打つ余裕がなく、正しい精度で打つことができないときがある。
また、自分が見た20代と、同僚が見た20代の基準が違うために判定結果にブレが生じることもあるだろう。
「ただ、こういったAPIは忙しいからといってさぼりませんし、人によって基準が違うといった意見の食い違いが起こらない。同じ品質でちゃんと見てくれますのでしっかりと確認が取れます。」(大田)
POSレジに打ち込まれるデータは、マーケティングに活かされる大事なデータであるため、データの精度が上がることでより有効な施策が打てるようになるといえよう。
「そしてさらに、ユーザーの要望は広がっていきます。Computer Visionのようにタグ付けもできる、Face APIのように年齢や性別の認識もできる。そうしたら自社の商品も見分けたい、という要望も出てきました。ここで、リリースしたのが次に紹介する、Custom Vision Serviceです。」(大田)
3.Custom Vision Service
「例えば、Aというキャラクターと、Bというキャラクターの画像を5枚ずつ、このAPIに読み込ませ、このキャラクターの名前をAPIに教えます。そうすると、APIはキャラクターの画像と名前を憶えてくれるので、新しくAの画像を取り込んだときに「これはAだ」という風に教えてくれるようになっています。」(大田)
このAPIの活用事例は、株式会社ナビタイムジャパンで開発したチャットボットだ。
「外国人観光客の方が、JRの広告などに出てくる名所の写真をこのチャットボットにUpし、『この場所はどこ?』と尋ねると、答えてくれます。
有名な場所に限らず、外国人観光客の方が知らないような食べ物の写真をアップしても教えてくれます。例えば、『これは宇治白玉クリームまんじゅうで、このあたりだったらここで食べられますよ』という具合に。これで外国人観光客の方が簡単に旅行することができます。」(大田)
このチャットボットは、大田がナビタイムと最初に打ち合わせをしてから4か月後にリリースしたそうだ。最初にリリースされたのが鎌倉版で、その後3か月後に東京版をリリースした。
この間にも新しいAPIのリリースや、追加したい機能もあれば、ユーザーが実際に入れてくれた会話ログに合わせて展開していきたい。そうなると、アジャイルを取り入れて迅速な開発をしていく必要があった。
テストは大事。わかっているのに、テストコードを書けているプロジェクトは多くない
ここで、迅速かつ、品質の高いものをリリースするためにどのようなテストをするのだろうか。
「アジャイルのプロジェクトでテストをやっているかのアンケートで、“そもそもやってない・もしくは手動でやっている”が32%。“Unitテストをやっているが十分でない”というのが27%という結果になっています。」(大田)
実際にアジャイルのプロジェクトでは、テストコードを書くのは大事とわかっていながら、新機能を開発したい気持ちのほうが強く、テストを後回しにしてしまう傾向がある。一度後回しにしてしまうとなかなか取り返しがつかなくなる。
大田は自身の経験談を交えて語る。
「最初は私一人のプロジェクトでしたが、4人の仲間が集まってきてくれました。そうすると、仲間から『大田さん、このコードで正しいですか』と聞かれます。しかし、まともにテストを書いていなかったので、仲間が書いたコードが正しいのかを手動でテストしていた時期がありました。
さらに、このプロジェクトで作っていたものは、シアトル、アリゾナ、ヨーロッパ、インド、中国、日本、オーストラリア…といろいろな国で使われているので、夜中にテストしてリリースしようということが、できなくなりました。安定して品質を保ちながら、素早くリリースするという考え方が真に求められるようになったのです。」(大田)
新しくジョインする仲間のためにも、動作するきれいなコードを作る
その際に、テスト駆動開発(Test Driven Development:以下、TDD)という考え方を導入したそうだ。
これは、動作するきれいなコードを作っていく考え方だ。この逆は、動作するきたないコードだ。
先ほど例で挙げたナビタイムのように、ユーザーの要望に応じて設計を変えたい場合、途中で仕様が変わるということは頻繁に起こる。そうすると、新しいものを早く作るために「とりあえず動くのを作ろう」とし、動くものが完成する。
ユーザーに使ってもらって好評であれば、機能を充実させたい、増やしたい。そのためには仲間が欲しくなる。仲間がいれば、動作するコードはどんどん増える。しかし、新しい機能を追加したいために、いつまで経ってもきれいにしないという事象が発生する。
理想は、品質を担保しながらどんどん新しい機能を追加すること。誰もが安心して新しい機能を追加できる環境を作らなければいけないはずだ。
TDDを実施した場合、機能テストでの不具合検出数が18%削減、機能を充実させるためのコーディングに掛けられる時間が16%増え、テストのカバレッジが大きくなった。と報告されているそうだ。
「しかし、このTDDをチームに導入したとき、不評でした。コードを書く量が増えるし、毎回テストをやるのは面倒。人間は面倒なことをやりたがらないから」
と大田は語る。そこでVisual Studio 2017に導入された、ライブユニットテスト機能を利用しているそうだ。
この機能は、コードの編集中にバックグラウンドで影響範囲のユニットテストが実行され、その結果やテスト範囲がリアルタイムでエディターに表示されるという機能だ(もちろん、予めテストケースを書いておく必要がある)。
コードが大きくなると、ビルドとテストの実行に時間が掛かりすぎて困ることがあるだろう。この機能では、影響を受けた範囲だけテストをすることも可能だそうだ。
昨今、開発スピードは早くなっている。一度決めた設計から一切変えずに作るというよりは、顧客の要望に合わせ、柔軟に設計を変えながら、開発をしていくスタイルが増えてきている。ただ、早く作って、とりあえず動けばいい。だけだと、今後の機能追加にも影響を及ぼすことになる。そのために、テストケースを作りながら動作するきれいなコードを目指して開発していく必要性がある。
テストケースも書きながら、プログラムを書くことで遠回りに思えてしまうかもしれないが、今はつながる時代。仲間が増え、顧客からの要望が増え、様々なものとつながっていく。このような時代だからこそ、TDDの考え方を取り入れてみたらいかがだろうか。
取材・文:池田 優里