CAT GETTING OUT OF A BAG

What the tester is thinking.

プログラミングの「アンチパターン」からテストを考える

はじめに

この記事は、技術系ブログや書籍などに書かれているプログラミングの「アンチパターン」を読んだとき、わたし(テスター)が、どのようなことを考えているのか紹介したものです。

もし「アンチパターン」で実装されていたら

わたしはよく「過去の不具合を使って(同じような)不具合が起きないかを確認する」ということをするのですが、この「過去の不具合」を「アンチパターン」に置き換えて、テスト対象のソフトウェアが、もし「アンチパターン」で実装されていたら

  • どのようなこと(ミス、不具合)が起きそうか
  • どのようなテストをやってみたいか

を考えます。この2つが対になるように考えてもいいし、テストが思いつかないときは「こんなことが起きそう」だけでもOKです。要はより多くの「起こりそうな嫌なこと」を描くトレーニングです。

題材さえあればいつでもどこでもできます。一人でもできますが、何人かで集まってやると自分では思いつかなかったこと(他人の思考)を、自分のものとして頭の中に取り込めるのでお得です。時間を制限してやると瞬発力がつきます。なお、わたしたちのチームは(特別に集まることはなく)普段からこのようなことを話しています。

 

今回は、伊藤 淳一さんの こちらの記事 を題材にしてやってみたいと思います。サンプルコードや解説がとても分かりやすい!テスターのみなさんにも、ぜひ読んでもらいたい記事です。

blog.jnito.com


なお、実際に開発してる製品を絡めた形では書けないので、架空のシステムを想定した、やんわりとした内容になっています。  

主要な変数が全部連番、かつあらゆる変数がグローバルなシステム

どのようなこと(ミス、不具合)が起きそうか

  • プログラマーが打ち間違いをしそう*1
  • コードを見ても間違っていることに気がつかない
  • 実装に時間がかかるので、十分なテストができないかもしれない
  • 指定するテーブルやカラムを間違うことで、お客さまがやりたいことと無関係なデータを表示、変更、削除してしまう
  • 仮にテスト対象が電子カルテシステムだった場合
    • 別の患者のカルテで治療計画を立ててしまう
    • 患者の体位と向きの表示を間違えたまま開腹手術してしまう
  • ループ用の変数もグローバル変数で宣言されているのか……
    • データは取得できても、中途半端に表示することがあるかもしれない
    • 件数は合っていても、前回のデータを残したまま表示することがあるかもしれない(初期化が中途半端)
  • 主要なテーブルやカラムについては目に触れることも多いし、みんなが気にして確認するけど、そうではないものは確認が手薄になりそう

どのようなテストをやってみたいか

  • この実装だと間違える要素がありすぎるので「間違っているものを探す」というよりは「正しいものを探す」という気持ちでテストしたい
  • 単にデータが取得できた、変更できた、削除できただけでなく、データの中身まで確認したい
  • 全テーブル、全カラム、全てだ!
  • テストデータは適当な文字列の羅列ではなく、テーブルごとに意味のある内容にしたい
  • テストデータを見ただけで「どのテーブルのどのカラムのデータ」が分かるものを用意したい(テスト結果を見たときに、指定先の間違いに気づきやすい)
  • 指定するインデックスも間違うかもしれない。応答速度(検索、ソートなど)も気にしたい
  • とすると、テストデータの量も調整しながらテストしたい
  • ループ用の変数もグローバル変数で宣言されているので「件数」を気にしたい

カンマ区切りで複数のコード値を格納しているテーブル

さっきのもすごいけど、これもすごいな(こういう実装を思いつくのがすごい)*2

どのようなこと(ミス、不具合)が起きそうか

  • マシンスペックが良すぎると、案外サクッと動いてしまうかもしれない
  • 性能問題に気づけないのが問題
  • 売上げテーブルの商品コードカラムに、商品マスタに存在しない商品コードが登録できてしまうかもしれない(外部キー制約をつけられそうにないから)
  • カンマ区切りで複数のコード値を格納しているテーブルは、この売上げテーブルだけではないかもしれない
  • データの整合性に関して何もかもが怪しく思えてくる

どのようなテストをやってみたいか

  • プログラマーの開発PCより遅いマシンスペックでテストする
  • システムで推奨してるマシンスペックより劣るもので動かすと、早いうちに問題に気づきやすい
  • たくさんの商品を1回で購入するような操作をしてみたい(売上げテーブルの商品コードカラムを溢れさせたい)
  • 商品を購入した後に、商品マスタのマスタデータを削除してみたい
  • 商品マスタの商品コード自体にカンマを入れてみたい
  • 商品名にもカンマを入れておきたい(ITEM_NAMEからコードを逆生成することがあるかもしれないので、念のため) 

おわりに

テストの定義はいろいろありますが、わたしが一番好きなのは、マイヤーズの「テストとは、エラーを見つけるつもりでプログラムを実行する過程である」というものです。この「エラーを見つけるつもりで」という行為は、より具体的な「エラー」を頭の中で描けないと難しいと思っています。絵本『ウォーリーをさがせ!』を想像してみてください。ウォーリーを知らないと探すことはできませんよね。ウォーリーを見つけるための手がかり(どんな顔をしていて、黒縁メガネをかけていて、ひょろっと痩せていて、赤と白のしましまの長袖Tシャツを着ていて、赤いボンボンのついた帽子をかぶっていて…)を知っているから探せるのです。

今回この記事で紹介したのは、より多くの「起こりそうな嫌なこと」を描くためのトレーニングの一例になります。「起こりそうな嫌なこと」は「エラーを見つけるための手がかり」の1つです。いつでもどこでも「起こりそうな嫌なこと」を描いてしまう癖がつくと、思考のバリエーションがどんどん増えていき、ソフトウェア開発の各場面で活かせるのではないかと思っています。実際、わたしが普段やっている Testing はこういった癖(トレーニング)で習得した要素が含まれています。きっと明日のテストでは、入力項目に思わず「カンマ」を入れてしまうと思います。

 

ソフトウェア・テストの技法 第2版

ソフトウェア・テストの技法 第2版

  • 作者: J.マイヤーズ,M.トーマス,T.バジェット,C.サンドラー,Glenford J. Myers,Todd M. Thomas,Tom Badgett,Corey Sandler,長尾真,松尾正信
  • 出版社/メーカー: 近代科学社
  • 発売日: 2006/08/01
  • メディア: 単行本
  • 購入: 7人 クリック: 267回
  • この商品を含むブログ (47件) を見る
 
NEWウォーリーをさがせ!

NEWウォーリーをさがせ!

 

 伊藤 淳一さんのチェリー本も載せておきます

 

*1:そんなの当たり前!と思うことでも出します。それが本当に当たり前かどうかは分からないし(でも、だいたいは当たり前なんですけど)当たり前にやるだろう、と思っていたことがすっぽり抜けてしまった苦い経験があります。

*2:すごすぎて他の言葉が見つからないわ。テーブルやカラムを増やしてはいけないシステムだったのかな。

「バグの伝わり方」を知るということ

見た目は単純そうなバグでも、その生い立ちを知ると「バグの伝わり方」が見えてきて(面白いなー)と思うときがあります。

たとえば、アプリケーションの画面には、やりたいこと(処理)を実行するための「ボタン」があります。状況に応じて、ボタンを有効(enable)にしたり、無効(disable)にしたりするんですけど(Twitterクライアントアプリなどもそうですね。何か文字を入力すると「ツイートボタン」が押せるようになります)あるソフトウェアをテストしてたとき、そのボタンは使えない状況だったのに「有効」になっていたのです。ああ、無効にするのを忘れたのかな(単なるコーディングミス)と思ったのですが、実際はもうすこし複雑でした。

ボタンの有効/無効は「状態」によって決まり、4つの状態(A,B,C,D)を持っているモデルがありました。でも、使う側はBかCかそれ以外(D)で判断していました。だからAのときはDに倒れてしまう。Aのときはボタンを「無効」にしなければならないんですけど、Dに倒れたことで「有効」になってしまった。さらに、

  • 状態Aは開発の途中で後から追加した
  • これらの状態は複数の機能で使われている
  • 複数の機能は複数のプログラマーによって開発されている

というものでした。


開発の過程で様々な機能が作られていき、それによって新しい状態が生まれる。元からあった機能は新しい状態を知らない。これまでうまく動いていたものが、あるとき急に動かなくなる。「バグの伝わり方」が目に見えるようでした。

また、このときに思ったのは「外側から見えている状態」と「プログラムで扱っている状態」は必ずしも同じではないということでした。プログラムで扱っている状態は4つ(A,B,C,D)ですが、わたし(テスター)から見えていた状態は3つ(A,B,D)だった。わたしが想像するよりも、プログラムの世界はもっともっと複雑で繊細なのです。

今回の話は「バグの伝わり方」の一例ですが、それ以来、状態に関する変更が入りそうな時には「プログラム内部で持ってる状態が増えたりしますか?」とプログラマーに聞くようになりました。昨日より良いテストをするために(わたし自身が)知りたい!という気持ちが強いのですが、朝会などでわざとらしく聞くのは「このチケットがコミットされたら、状態も気にしてテストしますよ(だからみんなも気にしてね)」というメッセージでもあるのです。

ベテランプログラマーKさんの弱点

隣のチームのベテランプログラマーKさんが担当したものを(自主的に)テストすることがあるんだけど、バグが出ない。これまでにわたしが見つけたのは1つだけ。「◯◯の隙間を突かれましたねー」と、笑いながら言われたので、そのときの風景も含めて覚えているのだけど、その1つだけ。

隣のチームで開発してる部分の理解が圧倒的に足りない(=効果的なテストができない)のもあるけど、ある程度わかったとしても、簡単には出せない感じがする。

…とは言っても、Kさんも人間なのでミスはする。わたしが観測した範囲だと、Kさん自身がミスに気づいて直すパターンが多い。それも、外側から動かして見つけたというよりは、内側から(理詰めで)見つけてきたような、うまく表現できないけど、そう簡単に見つかるようなバグではない感じ。こういう凄腕プログラマーもいるのだなあ、と常々思っている。

そんなことをプロの無職 @m_seki に話したら(頼んでないのに)Kさんに話したらしく、Kさんの弱点を聞いてきてくれた。ありがとうございます。

「作ったところに関してはあまりバグは出ないんだけど、たまに要件ごとごっそり抜けることがあります」


それ以来、チケットに書いてないこと(隠れた要件や機能など)も気にして触ってるのだけど、バグを見つけたことはまだありません。

テストのさじ加減


はじめに

テスターが「仕様書」や「見た目の出来栄え」だけでなく「設計の良し悪し」を感じ、それをテストに活かすことができたら良いんじゃないかな、という話です。テスター向けに書いたのだけど、プログラマーのみなさんは、どんなときに「設計の良し悪し」を感じるのか、教えてもらいたい気持ちがあります。

「設計の良し悪し」とは

書籍『達人プログラマー』第2章(達人のアプローチ)「8 直交性」より

直交性とは、簡単に設計、製造、テスト、拡張できるシステムを構築する場合に必要となる重要な概念です。

(中略)

この用語はコンピューティングの分野では、ある種の独立性、あるいは分離性を表しています。2つ以上のものごとで、片方を変更しても他方に影響を与えない場合、それらを直交していると呼ぶわけです。

本項では「直交していないシステムの変更や制御の難しさ」「良いとされる設計」「直交することの利点」などについて書かれています。はじめに貼り付けたツイートのような「再現手順が思いつかないような現象を見たときでも、プログラマーが問題箇所に当たりがつけられる状況」というのは、ここで良いとされている設計 *1 になっている(またはそれに近い)のではないでしょうか。

多くのテスターがそうであるように、わたしも普段はソースコードを読まないので、本当のところは分からないのですが、開発中に起きる様々なことから「設計の良し悪し」 を感じ、テストのさじ加減(テストを行う際の配慮や手加減のこと。一通り触ってみたけど、もうすこしテストしたほうがいいな、というようなテストの微調整)を決めるための「材料」にしているように思います。

「設計の良し悪し」を感じるとき

わたしが「設計の良し悪し」を感じるときをメモしておきます。悪いシグナルを書いたので、反対にすると良いシグナルとして読めるものもあります。

なお、うちのチームは世界的に『外れ値』として扱われてしまうことが多いので、これまで所属してきた複数のチームを思い浮かべて、観測できそうなものを書いてみました。*2

1. チケットの滞空時間が長い

手をつけてからコミットするまでに日数がかかっているチケット。進んでいるように見えるが、なかなかコミットできない。設計が複雑で難しいのかもしれない。*3

ただ、これは他にも問題(もっと深刻な開発全体に関わるようなもの)が起きていることもあるので、単に経過日数だけに注目すると間違えます。(例:開発が順調に進んでいるように見せる必要があり、ひとりのプログラマーが複数のチケットを同時にオープンしている)

また、チームによっては、滞空時間が長いのは良い傾向(サクッと進んでしまうときほど危うい)の場合もあるようです。

2. なかなか手をつけないチケット

設計が複雑で難しく(やりたくないので)なんとなく後回しにしてしまうのかもしれない。

これもさっきと同じで、経過日数だけ見てると間違えます。(例:バグが出すぎていて取りかかれない、手をつけているチケットで難しい問題が発生している、緊急度/重要度が他のチケットより低い)

3.「再現手順が分からないと分からない」と言われる

現象から当たりをつけられないくらい、これに取りかかったら、しばらく他のことができなくなるくらい、設計が複雑で難しいのかもしれない。

各種ログからも追いづらい、調査しづらい厄介な問題であることが多く、簡単には再現しない。再現手順が分からないと、直ったかどうかも確認できないので、わたしも再現手順を見つけたい。*4

4. 変更内容をコードの断片だけで説明する

変更前にそう書かれていた意図、それをどのように変更したのか、それで良いと思ったのはなぜか(根拠)を言葉で説明できないくらい、設計が複雑で難しいのかもしれない。

5. 変更したら別の機能が壊れた

変更したことによる影響が分からないくらい、設計が複雑で難しいのかもしれない。*5 

6. 変更したファイルがやけに多い

一昨日、うちのチームのプログラマー @vistige_ から「コミットログを見ると、いろいろ分かって面白いですよ〜」と教えてもらったので、しばらく毎日観察してみようと思っています。ファイル名からどの辺を変更したか、だいたい分かると言っていたので、これは予想ですが、自分ではちょっとした修正だと思っていたのに、変更したファイルがやけに多いなとか、いつもとは違うあまり見たことのないファイルが変更されてる…を感じることができるなら、テストのさじ加減も変わりそうです。*6

 

新装版 達人プログラマー 職人から名匠への道

新装版 達人プログラマー 職人から名匠への道

 

 

*1:YourdonとConstantine が「凝集度」と呼んでいるもの

*2:プログラマーが常に良いコードを書きたいと願い、実際そういうコードを書こうとしてるのは、見て知っています。わたしが対象にしてるのは製品(ソフトウェア)なので、プログラマーを責める気持ちはありません。どうか怖がりませんように…!!

*3:うちのチームでは「仕切り直し」というキーワードが使われるので分かりやすい。最近、特に注目しているのは「鋭意作成中」とチケットに書いてくるプログラマーがいるので、注意深く観察しているところです。「作成中」なのは知っているので「作成中」と書いてくる時点で気になるけど、さらに「鋭意」を入れてきた理由があるはずだと思うから。

*4:この手の問題は1つ直っても、他に問題が潜んでいることも少なくないので、修正後の確認はかなり時間をかけて行います。問題の周辺をよく見る。

*5:どこを直したらどこが壊れた、という事実は、テスターが内部設計を予測するのを助けます。

*6:ある部分は機械化できそうな気もする。

2018年はどのようなタイプのバグが検出されているのか(4)

このエントリーは こちらの記事Google 翻訳を使って雑に読んだときに、わたしが何を考えていたかのメモです。マニア向け!

applitools.com

No Order for You

  • Amazon’s mobile app
  • 注文数量を1以外に変更しようとすると、数量選択ポップアップが画面の外に表示されてしまう問題
  • "Off-screen quantity popup on Amazon App stopping the buy prosess"
  • 英語圏の事例だけど、国内でこの問題が起きたとすると
    • アマゾン日本事業の2017年売上高は1兆3335億円(1日36億5000万円)
    • 売上の全てが Amazon’s mobile app 経由ではないと思うけど、仮にそうだとして単純に24時間で割ると1時間で1億5000万円の売上
    • 1時間注文できないと1億5000万円の損失
  • すごいな

netshop.impress.co.jp

 

問題のアプリを見てみよう

  • 欲しいものリストから3つの商品をカートに入れます
  • カートをタップします

f:id:miwa719:20180930145030p:plain

  • 数量を変更します

f:id:miwa719:20180930145038p:plain

  • 数量選択ポップアップ、画面の真ん中に表示されてる
  • 大丈夫でした(Amazon Mobile LLC for iOS / Version 11.18.0)

問題を見つけました

  • 数量を変更しようとしても、画面が暗くなるだけでポップアップが出てこない(ときがある)
  • 見えないところにポップアップが表示されてるのかな
  • 元の記事の問題と似てる?

f:id:miwa719:20180930150515p:plain

  • わりと再現する
  • カートの中身を表示して、画面左上の戻る(<)をタップしてから、再度カートの中身を表示して数量変更しようとすると、再現することが多い気がする
  • この操作を何回か繰り返してたんだけど、それが嫌なのかな
  • 誰か追試してみてー *1
  • これ、ポップアップが出てくるときもあるので、全く注文できない状態にはならないけど、このような不安定な動作は、お客様を不安にさせるよね
  • わたしも不安だわ(Amazon’s mobile app のテスターになったつもりで触っている)
  • ところで、なんでこれポップアップにしたんだろう(開発者に聞いてみたい)

ポップアップの仕組みが分からないので似たような画面を作ってみた

  • 2種類の方法でポップアップ(alert)を出してみた
  • WKWebViewでJavaScriptを呼び出す方は、まだよく分かってない(時間切れでやめた)
  • モバイルアプリ開発、こうやって自宅で試せるのが、とてもいいなあ *2

 

*1:動作環境は iPhone 6s Plus / iOS 12.0、Amazon Mobile LLC / Version 11.18.0 です

*2:わたしは組み込み系製品の開発経験しかないので、とても興味があります

2018年はどのようなタイプのバグが検出されているのか(3)

このエントリーは こちらの記事Google 翻訳を使って雑に読んだときに、わたしが何を考えていたかのメモです。マニア向け!

applitools.com

SearchDown

  • ウェブページの右上のアイコン(サインイン、カートなど)の上に、検索用のテキストボックスが重なってしまう問題
  • スクリーンショットをよく見ると、上半分くらいアイコンが見えてるけど"Search box blocking shopping cart on ThredUp Website" と書いてあるから、押せなかった(お買い物ができなかった)のでしょうね
  • 前回、"経営情報は「テストする順番を決める時の軸のひとつ」として使えそう" …と、大層なことを書いてしまったので(仕方なく)調べました
  • メルカリだけじゃ無い! 海外の中古品売買スタートアップ12選  


なぜそのバグが起きてしまったのか

  • 前回前々回もそうだけど「なぜそのバグが起きてしまったのか」が、気になります *1
  • この SearchDown だと、こういうの(想像です)
    • 左端に貼ってあるロゴのサイズをすこしだけ変えたら(意図せずに)検索用のテキストボックスの位置がずれてしまった
    • ブラウザ間でのデフォルト位置、px指定に差異があった
    • リリース前に重なることに気がついて修正したのに、コミット漏れ(エアコミット)してしまった
  • 要は『失敗から学ぶ』みたいな話なんだけど「みんな学べ!」ではなく(わたし自身が)そこから学び、開発(テスト)に利用している感が、とても強い *2

問題のサイトを見てみよう

f:id:miwa719:20180925164629p:plain

  • 現在は重なってませんね(Safari 11.1.2)
  • ウィンドウの大きさを小さくしてみたらどうなるかな(ぎゅーーん)

f:id:miwa719:20180925164435p:plain

  • 大丈夫でした
  • せっかくなので iPhone(iPhone 6s Plus / iOS 12.0) でも試してみたよ
  • 縦画面

f:id:miwa719:20180925172514p:plain

 

  • 横画面

f:id:miwa719:20180925172533p:plain

  •  大丈夫でした

thredUP

  • アメリカ(サンフランシスコ)で、新品のような厳選した古着をオンラインで販売するお店
  • 個人間取引ではなく CtoBtoC(査定、撮影、仲介してもらえる)
  • だから、ウェブサイトの写真も統一感があって、綺麗なんですね
  • 洋服、靴、Bag、アクセサリー大好きなので、見てるだけでも楽しい(時間が溶ける)

www.thredup.com

 

*1:「調査の結果、そうなるように実装してました!!」とか言うと、わたしが暴れるので注意しような

*2:この辺の話をはじめると長くなるので省略

2018年はどのようなタイプのバグが検出されているのか(2)

このエントリーは こちらの記事Google 翻訳を使って雑に読んだときに、わたしが何を考えていたかのメモです。マニア向け!

applitools.com

Wanna Get A Way (to Book)

  • 航空機のチケット予約画面で、利用規約とContinueボタンが重なって、Continueボタンが押せなくなってしまう問題
  • 前回と同様、視覚的な問題ですね
  • Continueボタンの描画順が利用規約より後なら(重なりはするけど)ボタンは押せたのかもしれないな
  • 視覚的な問題は見つけやすいんだけど、見た目に重なってないから大丈夫かというとそうでもない
  • 透明な何か、が重なっていると見た目にわからないのだ
  • ボタンは押してみましょう
  • 変態さん*1になると、何もないところも押すようになります(ここに人間の目には見えない透明なボタンがあるかもしれない…)

テスターと経営情報

  • ところで Southwest Airlines website では1時間ごとに $2.5M を稼いでいるそうです
  • この記事を書いてる時(2018.09.24 11:00 JST)の為替レートは 1ドル=112.58円
  • 予約操作が1時間できないだけで、約2億8000万円の損失か!
  • 視覚的な問題は、軽く受け取られてしまうものもあるけど、そのソフトウェアの利用者数や、稼ぎっぷりを知っておくと、ダメージも想像しやすい
  • ダメージが想像できると、バグを報告するときの伝え方(騒ぎ方)が変わるかもしれない
  • そのソフトウェアにとって「致命的なバグ」とは何か(そこはいつも気にしてテストしたいし、絶対不具合を出したくないところ)
  • 経営情報って1テスターからみると、なんとなく遠い存在なんだけど、こうやって考えてみると「テストする順番を決める時の軸のひとつ」としても使えそうね
  • 競合他社がどれくらいいるかも知っておくと良さそう

 問題のサイトを見てみよう

f:id:miwa719:20180924114239j:plain

  • 現在は、利用規約とContinueボタンは重なってません
  • 2週間くらい休んで海外旅行したいな(次回はイタリアに行く予定です)

Twitter for iOS でも似たような問題が起きてた

  • 半年くらい前のバージョン 7.19 で起きてた
  • 前回の記事 にも通じる問題ですね
  • 起こりやすい問題(頻出バグ)のひとつなのかもしれない
  • 長い文字列は有能(問題を見つける力がある)

*1:わたしのようなテスターのこと