信頼はずっと、挑戦はもっと。

お問い合わせ
TEL:03-3496-3888

BLOG コアテックの社員ブログ (毎週月曜~金曜更新中)

LIST OF ARTICLES

記事一覧

  • テクログ

    ソフトウェアテストについて

    こんにちわ、本日はシステムのテスト手法につきましてわかる範囲で書いていきたいと思います。 システムのテストを全くやったことないよっていう人はSE/プログラマの方の中にほとんどいらっしゃらないかと思います。 例えば業務システムの場合、テスト専門部門(品質保証部門)を用意している企業も珍しくはありませんが、どんな作り手の方でも最低限の単体テスト(UT)くらいは実施しますよね。 今回はその際のテストについてです。 システムのテストは大きく2つの分類に分けられます。 ・ブラックボックステスト ・ホワイトボックステスト の2種類です。 違いは以下の通り。 ブラックボックステスト…システムの外部に着目して仕様通りかどうかのテストを行う ホワイトボックステスト…システムの内部構造に着目してテストを行う 例えば、ここに 『身長を入力したら 165cm未満で低め/165以上180以下で標準/それ以上は高め を結果として表示してくれる PHPプログラムがあったとします。処理としては、非常に簡素ですが以下とします。 index.html 身長: calc.php コードに関しては特に説明する必要もないくらいですね。 入力された結果をcalc.phpに渡してその判断結果をprintするだけです。 さて、まずは上記のプログラムに対してテストを行う場合に、ブラックボックステストで行う場合のテストケースを考えてみましょう。 仕様は上に書いたとおりです。 ブラックボックステストを漏れが少なく行う為の有効な手法の1つとして、同値分割と限界値分析(境界値分析)という手法があります。 ◆同値分割とは 入力を同じように扱えるグループに値を分けたものを同値クラスと呼び、それぞれの代表的な値を用いてテストを行う。 有効な同値クラスを、有効同値クラス、無効(エラー)となる同値クラスを無効同値クラスと呼ぶ。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの代表的な値を入れる』って事です。 上記の例では、 164cm以下なら『低め』が返るグループ 165~179cmなら『標準』が返るグループ 180cm以上なら『高め』が返るグループ 同値分割を使用してのテストは、各グループの代表値を使用してテストケースを作成します。 上記はすべて有効同値クラスと言われるものですね。 例えば、上記テストケースを作成するとしたら以下のような感じでしょうか? 身長の入力:期待される結果 100       :低めが表示されること 170       :標準が表示されること 190       :高めが表示されること 同値クラスは、あくまでその地域の代表となる値なので特にどの数値がいいとかいうのはないので、上記は各クラスから適当に抜き出した値です。 有効同値クラスのテストは上の例のようなもので問題ありません。 逆に無効同値クラスを考えたときに、例えば負の値が入力された場合を考えます。 すると身長でマイナスというのは本来存在しないが(厳密にいうと極端に低い値も存在しないとは思いますが)、入力では入れることができるマイナスの数値のケースが上記プログラムでは抜けている事に気づく事ができます。 現状のプログラムではマイナスが入力された時にも『低め』が表示されるので、身長の事なんだからマイナスの場合はエラーを表示させる必要があるかもという発想に至ることができます。 実際のプログラムでは、このような異常ケースを考えていない事が致命的な不具合につながることがあります。 エラーケースを考えて仕様に『身長がマイナスの場合は正しい値を入力してくださいと表示する』という仕様が追加されたら、 無効同値クラスのテストケースは下記のものを追加でしょうか。 身長の入力:期待される結果 -5        :正しい値を入力してくださいと表示されること。 さらに無効同値クラスを考えるときに、例えば数値以外の入力があった場合を考えたとします。 先ほどのエラー処理をいれたソースはこのようなコードであったとすると… 入力値に数字以外の日本語を入れると、なぜか結果は『低め』になります。 理由はintval()の関数の仕様が数値変換失敗時は 0を返すという理由です。 ですので、全角や数値以外の場合は変換失敗として0が返されるので}elseif($shincho < 165)に該当してしまって低めと間違った結果を表示してしまいます。 この場合は数値以外をJSで入力できなくしてあげたり、php側で数値かどうかのチェックを入れて数値以外ならエラーを出力するなどの対策を考える必要があります。 上記のように、無効同値クラスを考えただけでも2つの想定外になる要素を排除する事ができます。 同値分割は、グループわけをして代表的な値を入力して正しく期待結果が返る事を確認するテストになります。 テスト作成時には、異なる結果が得られる分岐がある場合はこの同値分割を意識する必要があります。 ちと長くなりましたが…本日はもう1つだけ。 限界値分析に関してです。 ◆限界値分析とは 入力を同じように扱えるグループに値を分け、その境界となる値を用いてテストを行う。プログラムのエラーは分岐の境界で発生する場合が多いため、限界値分析に基づいたテストを行うことで、同値分割に基づいたテストよりも多くの欠陥を発見することができる。(ソフトウェアテストwikiより) →要約すると『同じように扱えるグループの境目の値をテストする』って事です。 文書見ただけでもわかりますが、異なる結果を出力する境目になりますので、上記例を使って限界値テストを実施する場合は 身長の入力:期待される結果 -1:正しい値を入力してくださいが表示される事 0:低めが表示されること 164:低めが表示されること 165:標準が表示されること 179:標準が表示されること 180:高めが表示されること このような項目になりますね。 -1~0の間(エラーから低め)、164~165の間(低めから標準)、179~180(標準から高め) の間で1つの数値上昇に対して結果が変わるので、そこをテストします。 境界値テストを実施することで、165未満の判定が }elseif($shincho < 165){が正しいところを }elseif($shincho <= 165){となっていた場合には、165で『低め』が誤って表示されるのでバグを発見することができます。 境界近くの値は上のif分の記述ミス等のようなバグが発生しやすいです。 実際、ni-yoが所属しているチームでつい最近も境界線の値の判断ミスでバグが発生しました。 ブラックボックステストを作成時に同値分割/限界値分析を意識するだけで、何も意識していない状態よりはかなり品質は変わってきます。 長くなりましたので、ホワイトボックスはまた後日にでも! では( ´ ▽ ` )ノ
  • テクログ

    SmartyとCakeの連携について

    みなさんこんにちわ☆彡技術ブログ初投稿のni-yoです。今回はsmarty + cakePHPの連携についての内容です。当社のサイトは言語もフレームワークも様々なものがありますが、その中のサイトの1つにこんな環境があります。■言語:PHP■フレームワーク:cakePHP1.3系■view:Smarty:2.6.26ディレクトリ構造は基本的にはcakeの構造にし、cakeのapp/vendersのしたにsmartyライブラリを設置します。・ControllerからSmarty_Viewへの値の渡し方 ■例1)・Controller.php $data = 'こいつが出したいデータ'; $this->set('data',$data); ・指定url/index.tpl(viewへの配置場所はcakeと同じ、拡張子が.tpl) こんにちわ、これはテストです{$data} 上記のような構造にすると、結果は以下のようになります。『こんにちわ、これはテストですこいつが出したいデータ』上記のように、Smartyではview内に<?php ?>というお決まりのphpタグを記述する必要はありません。値の引渡しは簡単ですね。Controllerでなくview側でphp関数を使いたい時もあるかと思います。例えば、view側でphp関数を用いてencodingをかけたい場合は以下のように記述します。■例2)・Controller.php $data = 'こいつが出したいデータ'; $this->set('data',$data); ・指定url/index.tpl こんにちわ、これはテストです{$data|mb_convert_encoding:'SJIS':'UTF-8'} 上記のように関数処理をかけたい変数に対して『|mb_convert_encoding:'SJIS':'UTF-8'』とつなげてやると変数に対して関数処理を終了した結果がviewに反映されます。viewでヘルパー使いたい時はCakeのヘルパーも形を変えれば使用できますが、弊社では折角なのでSmartyのヘルパーを使ってます。ヘルパーを用いてセレクトボックスを使いたい場合は以下のように記述します。■例3)・指定url/index.tpl {html_options name=namae output=(ドロップダウンリスト出力内容配列) values=(ドロップダウンリストvalue値配列)} 上記のように記述すると、出力したソースを見ると指定した配列分だけoptionを持ったセレクトボックスが作成されます。ヘルパー等については以下のサイトが参考になります。http://www.smarty.net/docsv2/ja/…とまあ、Smartyを使うことでview内にphpの記述をしなくてもいいのでその名の通りスマートなのですが、不便なところも色々あります、一例としては★Shift-JISの問題PC表示側はUTF8 MB表示側はSJISで記述しないといけない場合もあるかと思いますが、その際に問題が起こります。スマーティの基本的なphp変数の呼び出しは上記したとおり『{』と『}』を使うわけですが、SJISは「{」(0x007b)と「}」(0x007d)に相当するコードをふくんでいることがあります。例えば、閲(897B)、顎(8A7B)、宮(8B7B)などがこれに該当します。上記コードはデリミタに含む7Bを含んでいるので、Smartyは{が入っていると判断してしまい、正しく解析できなくなり激しく文字化けします。回避策はググるとだいたい2パターンです。①デリミタ変更$smarty->left_delimiter = '{{';$smarty->right_delimiter = '}}';上記の例はview側のこれはPHPだよってタグを{{と}}に変更してやる方法、これはもうPC側とか管理側をガッツリ{}で組んでたので断念…②プリフィルタとポストフィルタを設定するSmartyテンプレのコンパイル時と出力結果ファイル保存時にエンコーディングを指定する方法です。しかし、この方法もフォルダ構成上SmartyライブラリはPC/SP含む全てのviewに影響を与えるので、全てのviewをSJIS変換されてしまうと困るためこれも断念…ですので、弊社としての対策はリテラルタグの挿入です。■例4 {literal}閲覧注意{/literal} 上記のように、デリミタコードを含む閲のような文字を入れても、リテラルタグを挿入すると文字化けしません。これは、『{literal}』タグで囲まれた中はPHPの変数はありませんよ~っていう意味に出来るからです。あと、Smartyはキャッシュが強力なので開発中は変更部分が切り替わらない、ヘルパーがうまく動作しないなどの不具合をちょいちょい起こしてくれます。うまく動かない時はキャッシュ削除を一度試してみてください。ではでは~!