ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

「IoTテスティングガイド」 #IoTテストアドカレ(2)

はじめに

 この記事は、IoTのテストに関するネットの記事を読んでいく、「IoTテスト アドベントカレンダー」の2日目の記事です。1日目はコチラ。

kzsuzuki.hatenablog.com

プロファイル

タイトル: 『IoT Testing Guides』
著者: Open Web Application Security Project
参照サイト: OWASP Internet of Things Project

ポイント

 1日目に扱った資料でも、IoTのテストの課題の1つに「セキュリティ」がありました。今日の資料(現時点ではドラフト版) は、IoTのテストにおけるセキュリティ面での配慮事項を、10のカテゴリに分けています。プライバシーも、セキュリティの一部として扱われています。
 それぞれのカテゴリについて、配慮事項の例を1つずつ挙げておきます。フルバージョンは原本をご確認ください。

  1. セキュアでないWebインタフェース
    XSS、SQLi、CSRF他のWebアプリケーションの脆弱性への対応

  2. 十分でない認証/認可
    パスワード復旧の仕組み

  3. セキュアでないネットワークサービス
    バッファオーバーフロー、ファジング、DoS攻撃に対する応答

  4. データ転送の暗号化漏れ
    バイス間、またはデバイスとインターネット間でのデータ転送の暗号化

  5. プライバシーへの配慮
    収集する個人情報の量を決定する方法

  6. セキュアでないクラウドインタフェース
    APIインタフェースやクラウドベースのインタフェースといったセキュリティの脆弱性への対応

  7. セキュアでないモバイルインタフェース
    AppleのTouchIDのような)2段階認証の実装

  8. 十分でないセキュリティ設定
    暗号化オプション(AES-128がデフォルトになっている場合に、AES-256を有効にする)が利用可能かの検討

  9. セキュアでないソフトウェア/ファームウェア
    バイスアップデートの機能と、脆弱性が発覚した場合に迅速にアップデートできることの確認

  10. 貧弱な物理的セキュリティ
    バイスにおいて、使用する物理的な外部ポート(たとえばUSBポート)が必要最低限であることの確認 

所感

 最初の方を読むと、Webアプリケーションのセキュリティチェックで聞いたような話ではありますが、モバイル、インフラ機器、組み込み、それぞれについて配慮すべきポイントが書かれていることがわかります。1番目と6番目、2番目と6番目と7番目は、かなり重複していますが、別の部位であることは意識しておく必要があるでしょう。IoTにはインタフェースがたくさんあり、それは攻撃のポイントもたくさんあるということですね。各分野のプロフェッショナルが持っている「これがセキュリティテストである」という知見を持ち寄って整理する必要がありそうですね。

 3日目はコチラです。(12月3日の0時に公開されます)

kzsuzuki.hatenablog.com

「IoTデバイスにおけるソフトウェアテストの課題」 #IoTテストアドカレ(1)

はじめに

 「IoTテスト アドベントカレンダー」とは、IoT(Internet of Things、モノのインターネット)のテストに関するインターネットの記事をつまみ食いし、どんなことが語られているかを把握しようという試みです。IoTおよびそのテストについて、わたしに十分な知識・経験があるわけではないことをおことわりしておきます。

 ちょっと前の「クラウド」や「ビッグデータ」、今なら「AI」や「機械学習」「ディープラーニング」と並んでバズワード的に浸透しているのが、「IoT」です。IoTが世の中に広がることで、開発者、そしてテスターには、どのような影響があるのか気になりませんか?
 「IoT Testing」でググってヒットしたトップ数十件*1を拾い読みしてみても、それぞれ語る角度が様々であることに気づきます。そもそも、「IoT」自体がそういう性質を持っていて、たとえば個人ユースのデバイスの話なのか、産業で用いられるM2Mの要素としてのデバイスの話なのか、といった軸がありますね。
 よってこのアドベントカレンダーでは、どこに軸足を置くかをあまり考えずにネットの情報を紹介していって、最終日にまとめてみるという算段です。

 しかしまさかQiitaだけでこんなにアドベントカレンダーがあるとは・・・。
 道半ばで息絶えても誰も気づかないようなひっそりカレンダーとしてやっていきます。

 では、1日目分、行ってみましょう。
 初日は、わたしが初めてIoTのテストというテーマに出会った、JaSST '16 TokyoにおけるJon Hager氏の基調講演の資料です。

プロファイル

タイトル: 『Software Test Challenges in IoT Devices』
著者: Jon D. Hagar, Consultant, Grand Software Testing
参照サイト: JaSST '16 Tokyo

ポイント

 本資料ではIoTデバイスを、ハードウェアに内蔵された特化型ソフトウェアであるいわゆる「組み込み系」(Embedded)と、小さくて持ち歩けるバイル・スマートデバイスが融合したものであるとしています。両者の違いは、通信の能力です。後者がモバイルネットワークを通じてWebに常時接続しているのに対し、前者の通信能力は、距離的にも容量的にも限られていることが一般的です。

 IoTの新しさとは、組み込み、モバイル、そして従来のパソコンやサーバ、そしてネットワークなどの要素がごった煮になっていることであり、それはそのまま、開発やテストの難しさまでもが猛然と持ち込まれてきています。
 本資料では、IoTにおける以下の5つの課題について説明しています。

  • 課題1: 複雑なハードウェアとソフトウェア
  • 課題2: 多数のデバイスとコンフィグレーション
  • 課題3: ビッグデータと分析
  • 課題4: プライバシーとセキュリティ
  • 課題5: 接続性

課題1「複雑なハードウェアとソフトウェア」

 テストのアプローチとして、「要件の検証」、「リスクベースドテスト」、「攻撃ベースの探索的テスト」の3つを挙げ、さらにこの3つ目を、以下の4つに分けています。

  • モデルベースドテスト: 開発時点で適切なモデリングを行い、そこからテストケースが生成されるようにする。さらにその情報を自動テストエンジンに投入し、キーワード駆動型の自動テストが実行できるようなテストフローを検討する。
  • 数学ベースのテスト: テストに関係する要素がソフトウェアの中に閉じなくなることで、組み合わせ爆発がさらに深刻になる。これに対処するために数学的な理論に基づいたテスト技法を適用する。
    代表的なのが、組み合わせテスト(Combinatorial Testing)。また、乱数を発生させてのファジングテストや、従来の同地分割/境界値分析などもここに含まれる。
  • スキル/経験ベースのテスト: 過去に繰り返し現れた欠陥のパターンを狙っていくなど。攻撃が想定される要素が激増するので、知識ベースが必要。
  • 標準/プロセスベースのテスト: IEEE1012やIEEE29119など、標準化されたフレームワークをベースにテストの網羅性を検討する。

課題2「多数のデバイスとコンフィグレーション」

 スマートフォンのOSを考えてみても、Android Fragmentationと呼ばれる現象があり、組み合わせの対象が膨大であることが想像できます。ここでの対処法の1つは、課題1でも挙がった数学ベースのテストです。 opensignal.com

ビッグデータと分析

 IoTでは、流通するデータ量がさらに膨大になります。テスターもまた、データ分析の能力を養う必要があるとしています。

プライバシーとセキュリティ

 自動車や医療関連のデバイスがIoTに接続している場合、通信が妨害されたりデータが改竄されたりすると事態は深刻です。また、医療・保険・公共機関のデータが詐取されると、個人情報が侵害されるリスクがあります。
 テスターとしては、従来のシステムに対する攻撃手法を学び、テストに活かすことが求められます。ここで著者のCMです。

接続性

 物理的な接続性はもちろん、デファクトスタンダードの決着もついていない通信プロトコルに対する準拠や、データの正確性・完全性に対する検証が必要です。リスクベースドテストや、自動テストの繰り返し実行による一貫性の保証が必要だとしています。

所感

 まず、IoTの何が新しく、何が難しいのかということを理解することができました。また、IoTのテストに向けてどのような技術・ツールが必要になってくるかが概観されており、テストエンジニアとして学ぶべきテーマの輪郭が少し見えてくるように思います。

 なおJon氏は、IoTのテストに関する電子書籍を発行しています。どちらかといえば、テクニカルよりプロセスの話が多い印象ですが、読書会などしても面白いかもしれませんね。 leanpub.com

 2日目はコチラです。(12月2日の0時に公開されます)

kzsuzuki.hatenablog.com

*1:ちなみの検索を行うと、けっこう上位に「Interoperability Test」、つまり相互接続性についてのテストとしての「IOT」が挙がりますが、対象外としています・・・

「長崎IT技術者会」発の『はじめてのバグ票システム』を読みました。

 長崎IT技術者会が2016年9月25日に公開した、『はじめてのバグ票システム ~導入実践ガイド』(第1.0版)を読んでみました。

naite.swquality.jp

『はじめてのバグ票システム』とは?

 ソフトウェア開発においてインシデントを管理しなければならないのは当然で、そのためのツールがいくつもあります。ソフトウェアエンジニアであれば、何がしかのツールに触れたことのある人が大半でしょう。「バグ票」のオープンからクローズまでのイメージももっていると思います。

 一方、自分がそのツール、本資料でいう「バグ票システム」を構築・運用する立場になったらどうでしょう。
 すぐ思いつく作業として、サーバを調達したり、ネットワークに接続したり、ツールをインストールしたり、があります。ですがこれらはある意味、「ググればわかる」ものが多いと思います。
 実はバグ票システムを始める上で難しいのは、上のような技術的な作業よりも、「ググってもわからない」、個々に違う組織に合わせた設定と運用の検討ではないでしょうか。
 わたし自身も何度か導入に関わったことがありますが、組織が大きかったり、プロダクトの歴史が長かったり、既存のバグ管理システムがあったりするほど、検討が大変になることを実感しました。

 『はじめてのバグ票システム』は、意外なほど資料に乏しいこの部分をスコープにしています。

本ガイドは、「バグ票システムの導入検討から稼働準備までのプロセスおよび必要な活動について解説すること,および参考となる情報の紹介」をスコープとしています。

 本編の目次は以下の通りです。バグ票システムの導入を、小規模なシステム開発と捉えていると言えます。

  1. バグ票およびバグ票システムとは
  2. バグ票システムの導入検討から稼働準備までのプロセス
  3. バグ票システムの企画
  4. バグ票システムの設計
  5. バグ票システムの実装
  6. バグ票システムのテスト
  7. 稼働準備
  8. バグ票に関してのワーストプラクティス
  9. バグ票を活用した活動

 企画・設計という段階を明示的に設けているところがポイントです。
 「企画」においては、何の目的で・誰が・いつ・どこで・いつまで 使うのかという全体像について整理しておくことを勧めています。
 「設計」は、おそらく本資料の中でもっとも大事な部分でしょう。ワークフローの設計、バグ票の項目の設計、ロールと権限の設計などについて言及しています。

 もうExcelでのインシデント管理は無理だ! おれはExcel管理をやめるぞッと考えている方であれば、目を通しておくべき資料と言えるでしょう。

次版以降でここに期待したい!

 本資料の価値を前提としたうえで、「改版を前提としてい」るということなので、「今後、このあたりの情報が補強されると嬉しい!」という点について書いてみます。やはり、もっとも重要な第4章「バグ票システムの設計」が、力の入れどころだと考えます。

バグ票のワークフローのモデル

 4.1節では、バグ票のワークフロー(状態遷移)の例を3つ挙げていますが、イメージをつかむ程度の記述になっており、物足りなさがあります。
 この節で、モデルとなるようなワークフローを作業の重さごとにいくつか提示し、詳説してもらえると嬉しいと思いました。詳説というのは、「バグ票の各状態が持つ意味」「状態遷移が発生するトリガー」「パターンのメリットとデメリット」といった内容です。例えば重厚なワークフローにおいては、バグの修正内容について「管理者の承認待ち」といった悲しいステータスができてしまい、未解決バグが積まれていくデメリットがある・・・とか。

 そうすれば読者が、自分たちの開発スタイルに合うのがどれかを判断しやすいのではないでしょうか。逆に、ワークフローの検討自体が、自分たちのプロセスを見直すいいきっかけになるとも思います。

特有のケースの扱い

 一般的なワークフローは議論もしやすく、決定もそんなに難しくはありません。一方で検討が漏れがちなのが、あまり頻発はしない状態の扱いです。たとえば・・・

  • 検出したものの、当該バージョンでは直さないことにしたバグはどういうステータスにしておくのか
  • 再現性のないバグは何をもってクローズにするのか
  • あるプロダクトで見つかったが、別のプロダクトでも修正の必要なバグは、どうバグ票を起こすか

 このような、例外とは言わないまでも扱いづらい事例を集めて、扱い方のパターンなども提示されていれば、とっても助かると思います。

バグ票項目のモデル

 ワークフローと同様、「管理すべき情報」のモデルが提示されていると嬉しい!
 さらにいうと、それぞれの項目に対する「選択肢」の例も欲しいところですが・・・、さすがにそこまでいくと既存の資料がありそうだし、本資料のスコープから外れるのかもしれません。

 バグ票にどのような項目を持たせるかについての検討は、できるだけ入力を少なくしたい担当者側と、分析のために多くの情報が欲しい管理者側の綱引きになることがあります。使う見込みのない管理項目は、新システム導入を機に思い切ってバッサリ捨てることが大事でしょう。
 たとえば「バグを作りこんだ設計工程」という項目を管理するとして、分析の結果「基本設計工程」に問題があるとわかった・・・でもその後、基本設計工程や、それに対応するテスト工程を改善するつもりがないのであれば、「作りこんだ設計工程」を管理する意味はなかったわけです。

入力を容易にする工夫

 多くのテスト担当者にとって、バグ票の入力は面倒なものではないでしょうか。であれば、入力の負担をできるだけ軽減することが大事になってくるので、そのあたりの工夫ポイントについて言及してあると嬉しい。たとえば、以下のような点です。

  • 「起票者」や各種日付は自動的に入力される
  • 項目間の制約を設けて、ある項目を入力すると、関連する項目の選択肢が絞り込まれる

 ツールに依存する部分もあると思うのですが、ノウハウなどあるとよいですよね。

重要度と優先度

 たいていの場合「重要度」「優先度」といった項目がバグ票にはあって、たとえばS・A・B・Cが選べると思います。で、よくあるケースが以下です!

  • 優先度「S」多すぎ、どれから対応してよいのやら
  • 重要度「B」(ふつう)多すぎ、分析の価値なし

 重要度は、選ぶのに迷う割には価値のあるデータにならないことも多いし、本当に必要な項目かは考えた方がいいでしょう。
 優先度は、テストの継続を致命的にブロックするのか、わずかなのか、影響ないのか、くらいで分けるといいと思います。

 改版に期待とか言いながら、もう自分の言いたいこと全部書いちゃってますけど。。。

その他

 既存のバグ管理システムがある場合の移行の注意点、特に過渡期の運用など、一番つらいところでもあるので情報があると心強いですね。

まとめ

 以上、思いついたものを自分勝手に並べてみました。
 本資料のような、地に足の着いた実践的な資料はとても貴重だと思います。長崎IT技術者会の今後の活動に期待しています。

追記(2016/11/8)

 秋山さんからいただいたコメントを残しておきます。ありがとうございます。

地味に繰り広げられているソフトウェアテストの派閥争い

 コロコロコミック vs ボンボン、VHS vs ベータ、Mac vs WindowsVim vs Emacsきのこの山 vs たけのこの里IE vs Netscapeビックリマンチョコ vs ガムラツイストEU残留 vs EU離脱ビアンカ vs フローラ、高橋名人 vs 毛利名人・・・。
 たくさんの対立軸がある中、アジャイル vs ウォーターフォールの争いも、定期的に勃発しています。今回はここから始まったのでしょうか?

www.infoq.com

 アジャイル vs ウォーターフォールは開発方法論の争いですが、みなさん、ソフトウェアテストの世界にも陣営があることをご存知ですか? そんな話がこちらで紹介されていました。

Software Testing Schools: All we need is world peace.breakingembeddedsoftware.wordpress.com

 Software Testing Schools、ソフトウェアテストの学派」とでも訳しましょうか。
 この記事の筆者は、ソフトウェアテストの世界が”学派”で分断されている。平和が必要だ」と述べています。

いかなる学派があるのか

 記事では4つの学派を紹介しています。

  1. テストプロセス学派: 明文化された規格、認証、定義されたテストのプラクティスの考え方に重点をおく
  2. 品質保証学派: チェック、監査、プロジェクト計画や進行において従うべき管理に重点をおく
  3. アカデミックリサーチ学派: リサーチと、「テストとは、ツールと技法によって解決することのできる技術的な問題である」という信念をもつ
  4. コンテキスト駆動学派: 「テストとは、人の手による知的な活動であり、アプローチは各々の取り組みごとに異なるものなので、”ベスト”プラクティスなるものはなかろう」とする

 僕が認識していたのは「テストプロセス」と「コンテキスト駆動」でした。
 たとえばISO/IEC/IEEE 29119のような国際規格を策定し、ソフトウェアテストの標準化を図ろうとする前者と、「規格はテストの良さを損なう 」として抵抗する後者。これはStop 29119 Petitionという形で論争*1を引き起こしました。
 この「請願」の記事を書いた人の中には、探索的テストの推進者としても著名なJames Bach氏やMichael Bolton氏がおりますが、彼らはコンテキスト駆動アプローチを取る人たちです。

どの学派に入るべきなのか

 記事にはこう書かれています。「”普通の”テスターにとって、学派の分類などどうでもよい。テストでいい仕事をしたいだけだ」。その通りです。

 個人的には、規格はあってほしい。
 たとえばISTQBシラバス(規格ではないけれども)はプロセスや用語を定義することで、ソフトウェアテスト界隈の人たちの間でのコミュニケーションコストをすごく下げたと感じています。また、頭のいい人たちの考えた「網羅的なリスト」は役に立ちます。たとえばテストの切り口の1つとして、ISO/IEC 9126の品質特性を参考にする人も多いでしょう。
 ただ、それが「ルール」として押し付けられ、「ルールに準拠するための不必要な作業」が発生し始めた途端、規格に対する憎しみが生まれます。

 また、コンテキスト駆動のアプローチや、その周辺の人たちが提案しているRapid Software Testingは、「テストは人間らしい活動だ、楽しくやろうぜ」的なノリなので魅力的ではあるのですが、たとえば探索的テストだけやっていればいいとは思えませんし、「書かれたことだけを実行するのはそもそもテストじゃない、それはチェックだ」と言われても「じゃあチェックと呼ぶのはいいけど、チェックも必要ですよね」ってなります(手動でやるか自動化するかは別にして・・・)。

 西研究室のWebサイトにはこう書かれています。

あらゆる技術・手法・ツール・記法・規格・標準・法規は良い点と悪い点を備えています。そのどちらかからも目を背けることなく、かつ両者を技術的にフェアに理解することによって、技術・手法・ツール・記法・規格・標準・法規は適切に活用することができます。
私たちは日本の組織が、ISO/IEC/IEEE 29119シリーズが自組織に適しているかをきちんと判断し、導入すべきところと導入すべきでないところを見分け、盲目的に従うのではなく導入の目的にかなうように導入することを望んでいます。

 クリスマスも除夜の鐘も初詣もバレンタインデーもハロウィンも楽しんでしまう日本人なのですから、「いいとこどり」で仕事をしていきたいものですね。

 ただし「アカデミックリサーチ学派」には興味があるぞ? どういうことをやっているんだろう!?

付記

 ちなみに、JaSST Tokyoの基調講演は、2015年がMichael Bolton氏であり、2016年は29119シリーズのプロジェクトエディターであるJon Hagar氏でした。僕はJaSSTのこういう、よく言えば「バランス感覚に優れた」、もっと言うと「そういうの俺らには関係ないから」というファンキーっぷりが好きなんですよね。

*1:わたしも興味があったので、記事の一つを翻訳し、電通大の西氏のサイトに掲載していただきました。

【書評】英文法をがんばりたい人は『サバイバル英文法』を読むべきだ、絶対。

 「魚を与えるのではなく、魚の釣り方を教えよ」という言葉がありますね。もらった魚はその場しのぎにしかならない。けれど、釣り方がわかれば、継続的に魚を得ることができる。

 『サバイバル英文法』は、英文法の「釣り方」を教えてくれる本です。タイトルから漂う「とっさの一言」的な、あるいは「ここから一番近いバス停はどこですか」的なイメージとはまったく異なる内容の良書。なぜこんなタイトルになったのか、ちょっともったいないなと思うくらいです。

 この本では、従来の教科書が文字通り教科書的に説明してきた「暗記物」っぽい英文法を、一歩引いた観点から説明してくれます。
 たとえば現在完了といえば「経験」「継続」「完了」のように、パターンを覚えました。現在形も「習慣」「不変の真実」のように、パターンを覚えましたよね。
 では、「経験」「継続」「完了」や、「習慣」「不変の真実」の底に流れているものは何なのか。そこを知ったうえで、パターンを導くのが正しい理解なのです。
 なぜshouldは「~べき」なのか。それを理解するために、まずshallの意味を理解し、それが過去形になったshouldの含む意味を理解するのが正道なのですよ!

 英語を長い間勉強していると、受験英語ではわからなかった本質的な部分が少し見えてきた気になります。この本はその「本質的な部分」をバリっと言葉にしてくれる。そこが小気味よい。
 たとえば、進行形。本書では、こういいます。

5秒おきに中断・再開できない動詞は進行形にできない*1

 まずこれを基準にすると、smellが普通は進行形にならないであろうことがわかる。たとえばいい香りのするスープが、突然香りを放つのを止める、とは考えづらいです。
 この「5秒」は便宜的なものだし、もちろんネイティブがこの判断を意識的に行っているわけではないでしょう。でもまずはこの基準で慣れていくと、普通は進行形にならないはずのlive(住む)やresemble(似ている)が、次のような進行形を取りうることに納得がいくのです。

  • I am living in Osaka.
  • He is resembling his father more and more every day.

 進行形を取りうる動詞とその例外を一つ一つ覚えるのではない。まず「幹」を腹に落としてから進む
 これはテクニックではなく、言葉の本質を学ぶことなのだと思います。

 僕がこの本で一番「おお!」となったのは、地味ですが、so。soをこれまで「とても」という意味で使っていた僕は、soとveryって同じものだと思っていました。
 ですが、soの本来の意味は「それほど」。懐かしの表現「so A that B」(BであるほどAだ)はまさに、その意味になっています。
 I'm so happy.も「それほど幸せだ」という意味であり、その「それほど」がどれほどなのかは、前後の文脈や話者の態度から判断する、ということだったのです。

 取り扱っている文法は、冠詞、完了形、仮定法、分詞構文など、受験生(だった人)なら「うげっ」と感じたであろう難物の数々。
 この本は、文法に嫌気がさしているであろう高校生に絶対読んでもらいたいですね。普通の英文法書で一から読み直すより、100倍効率がいいと思います!

*1:この太字部分が落ちていましたので追記しました。一番大事な部分を・・・申し訳ありません。