情報処理技術者試験の最近のブログ記事

 資格は仕事に役立つのか その1 単体テスト編2では、ブラックボックスについて書きました。今回は、ホワイトボックスと網羅についてです。

 単体テストの一つである構造テストは、テストの範囲をプログラムコードから分析しコード全てが網羅しているかどうかを調べます。プログラムコードから分析することにより本来起こらない条件もテスト出来ることからホワイトボックスなテスト(中身が見える)と言えます。

試験では、「命令網羅」、「判定条件網羅」、「条件網羅」、「判定条件/条件網羅」や「複数条件網羅」が出題されますが、通常はカバレッジツールを利用して、テストを行うのでチェックリストの作成段階では意識する事はありません。

カバレッジツールを利用していれば、カバレッジモニタで網羅の基準となる「C0」、「C1」、「S0」、「S1」が表示されるので簡単に状況を知ることができます。通常は100%になるようにテストします。チェックリストですべて100%になるようなテストを作成できれば一番好ましいのですが、チェックリストをすべて行っても網羅が100%にならない場合は追加テストなので補完します。

通常起こらないテストとは、例外処理が中心となるでしょう。例えば、JavaならDBに障害が起きてアクセスできない事を想定して、例外をわざとスローさせます。例外がキャッチできて適切にプログラムコードが想定した動作をするのかなどをチェックします。私はまだ通常時にIOExceptionが発生した事はないのですが、当然ここもわざと例外をスローさせて対応をみます。

プログラム作成から当然例外処理を意識して作成しているので、特に大変なの事はないですが、構造テストでしっかりとログを見ることが大事です。ログも当然単体テストの為、エビデンスを残すのですが、それだけではなく構造テストはすべてのパターンのログが出力されることになります。出力されたログで本当に内容がわかるのもチェックすると後々のテスト時の後戻りがなくなります。

ログの出力はすでに設計時にばっちりと決められていることが多いですが、ログ時に出力するメッセージやバグ用に出力する内容は変更できることもあります。変更できる時には、自分の能力を発揮するチャンスでもあります。単体テスト以降に続くテストは当然ですが、運用時に問題が起こった時にもログが重要だからです。



 カバレッジ(coverage)とは、コードの網羅度のことでステップ法に続いてテストの品質を決める要素でもあります。テスト数はテストを行う目標値として扱われるので最初に作成したテスト数の数をこなせば単体テストが終了するというわけではなく、ガバレッジが100%にならないと単体テストが終了と認めらないことのほうが多いでしょう。

ガバレッジと網羅の言い方は、私が経験した中では人それぞれなのでどちらでも言いように感じます。

 資格は仕事に役立つのか その1 単体テスト編1では、テスト数を決めるステップ法について書きましたが、今回の単体テスト編2は、ブラックボックスに付いてです。


 単体テストには、大きく分けて機能テストと構造テストに分ける事ができます。機能テストは、ブラックボックス技法を使い、構造テストは、ホワイトボックス技法を使います。

機能テストとは、テストの範囲を機能からテストすることにより仕様書通りに動作するかどうかを調べます。コードを意識しないことからブラックボックスなテスト(中が見えない)と言えます。ブラックボックスは、資格同様に「同値分割法」、「限界値分析法」がメインなのは、実際も同じと考えて良いでしょう。

私が苦労した点といえば、画面系のテストです。画面では、入力させない文字や最大入力桁のテストなどを行い項目が6以上になるとテスト数が増え大変でした。項目1つに大体15個で5項目なら組み合わせのテストで80ぐらいの数になっていました。プログラミングしながらテストをする為、15程度なら大したことはないのですが、単体テスト編1にも書きましたエビデンス(証拠)を残さないといけません。中には入力不可の文字テストなどのエビデンスが撮れない場合があり、その場合には「目視」と単体テスト書に記述する事もあります。

画面項目はテスト項目に応じてですが、DBがかかわってくると、テスト項目1個に対して3個ぐらい証拠の過程が必要でした。例えば、追加なら、登録する内容を示した画面、実際に処理が行われているコード(ビーンやポーターなどに適切に値が入っているか)、結果のメッセージ、DBのテーブルの中身、ログ(SQL文など)などです。画面で適切なテストが行われていれば、「同値分割法」、「限界値分析法」を行わなくても前提条件が終了している為、テスト数は低減できますが、当然追加の場合には主キーが既に行われているなどのテストがあります。1つテストを作成すれば(例えばDB関連のテスト)自ずとそれに従うテスト項目が浮かんでくるでしょう。

次回は、ホワイトボックスに付いてです。

 プログラマを目指す学生であれば、何らかの資格取得を目指して勉強していると思います。資格を取得して勉強している時や友達との会話にもあるかもしれませんが、「資格は役立つのだろうか」という疑問です。「就職には有利になりそうだけど実際の仕事では役に立つのか」という疑問は、私も学生時代から勉強中に考えていたことです。そこで、私が仕事をしている中で、これは資格取得で役立った点を紹介していきます。また、資格は抽象的に説明されることが多いので参考書よりは偏ってしまうかもしれませんが、私が経験した範囲の実態で書こうと思っています。

 

 その1は、単体テストに付いてです。はじめに紹介するのが「単体テスト」と思われるかもしれませんが、アルバイトやはじめの仕事に単体テストを任されることもありますし、プログラミングには慣れていても単体テストはやったことがなかったりすると思います。私自身は、基本情報を勉強中に単体テストが実際にどのように行うのが分からなかった一つでもあります。

単体テストは、プログラマの仕事の範囲なので、資格では、「基本情報技術者試験」や「ソフトウェア開発技術者」などが、該当するでしょう。単体テストをするには、何をテストするかを記入するために、マトリックスを使用することが多いようです。マトリックスは、設計やテストに関係なく情報整理にも使われているため、「初級システムアドミニストレータ」でもテスト範囲です。はじめに言っておくと単体テストに限定しても「基本情報技術者試験」、「ソフトウェア開発技術者」や「初級システムアドミニストレータ」は仕事の役に立っていると私自身は感じています。

 単体テストの説明を少ししておきましょう。単体テストは、ウォータフォールモデルのプログラミングに該当します。テスト対象範囲は、自分が作成したモジュールのテストです。プログラミングが完了するとおおよそのテスト数を決め、チェックリスト(テスト内容)を作成しチェックリストに基づいてテストを行います。私自身は、プロジェクトにかかわった件数は少ないですが、テストを実施する場合は、チェックリストに基づいて証拠を取ることが多いということを聞きました。証拠の話は、参考書に記述さていないので参考になると思います。

テスト数を決めるのは、基本情報やソフ開で勉強したのがそのまま役立ちます。ただ、資格の場合、特に情報処理技術者試験は抽象的、学術的な事が問われるので、単体テストの経験が無いとより難しく考えてしまう説明が多いように感じます。ソフ開では、「ファンクションポイント」や「COCOMO」が中心となって出題されますが、それ以外にも「ハルステッドモデル」や「SLIM」などの説明が記述されていることから難しく考えてしまう点かもしれません。

私が経験したのが、ステップ法のNCLOC法です。LOC法は、ソースプログラムの行数からステップ数を決める方法で、1万行あれば、1万ステップ(10K)です。LOC法は、ただ単純なソースプログラムの行数ですが、NCLOC法ではコメント行を抜いた行数からステップ数を決めます。NCLOC法で10Kならどれくらいテスト数をこなせば良いかですが、独学などで勉強するのであれば、1割の1,000個を目標にテストを作成すると実態に近くなってくると思います。


 次回は、ブラックボックスに付いてです。

 明後日は情報処理技術者試験ですね。
来年から改正が行われると言う事で明後日の試験には全力で挑戦して欲しいです。私は、基本情報には一発で合格したのですが、ソフ開には何回も苦しみました。そこで私が合格するのに貢献した直前攻略を大公開します。説明は、ソフ開合格用の為説明が違うのではないかと思われるかもしれません。その点はご勘弁下さい。

 ソフ開の得点源に繋がる箇所は、以下の点と思われます。
1.待ち行列
2.稼働率
3.SQL
4.埋め込みSQL
5.暗号方式
6.OSI基本参照モデル

 以前に作成した情報ですので、古い情報等があると思いますがお役に立てれば幸いです。

★OSI基本参照モデル

 アプリケーション層で、アプリケーションを決める。例えば、FTP及びHTTP等。
 プレゼンテーション層で、文字コードを決める。インターネットがJISな為WinからUNIXに送る場合は、シフトJISからJISに変え、JISからEUCに変換する。これがプレゼンテーション層の役割。それから通信データを暗号化する機能もある。
 セッション層で、コネクションを確立し、通信方式を決める。通信方式は半二重通信又は全二重通信に決める。
 トランスポート層で、パケットを分割(送信側)及び復元(受信側)する。パケットが紛失した場合は、再送し、信頼を高める。
 ネットワーク層で、相手までの通信経路を決定する。
 データリンク層で、フレームのシーケンス制御や誤り制御、フレームに誤りが発生した際の再送制御などを行う。
 物理層で、電気信号として、やり取りする。そのためにデジタル信号を電気信号に、電気信号をデジタル信号に変換する。

★待ち行列

 ラムダ=平均到着率(件/秒)
 ミュー=平均サービス率(件/秒)
 平均到着間隔=1/ラムダ(秒/件)
 平均サービス時間=1/ミュー(秒/件)

 p=ラムダ/ミュー=ラムダ×平均サービス時間

 Wq=p/(1-p)×平均サービス時間
 Ww=Wq+平均サービス時間

 平均サービス時間は、大体問題に示されているので忘れた場合はそこから導きます。平均サービス時間は、時間という言葉から秒/件と理解する。つまり、ラムダ、ミューは、その逆の件/秒になると覚えれば間違えない。
 p(ロー)は、利用率を求めるのだから、1秒間に来る、例えば人なら、人数をサービスする時間で割る事によって求まる。それが利用率又は使用率(利用率よりも使用している割合と覚えても大丈夫)。
 p/(1-p)は、待っている人の数です。Wq(平均待ち時間)は、待っている人の数に平均のサービス時間をかけることによって求めます。平均サービス時間を待っている人にかけるということは、すべて待っている人がサービスを終えた時間ということになる。
 Ww(平均応答時間)は、それに自分もサービスしてもらった時間を足せば良い。


★稼働率

 稼働率=MTBF/(MTBF+MTTR)

 (1)直列システム
   稼働率=X1×X2・・・・Xn
 (2)並列システム
   稼働率=1-(1-Xn)ⁿ
 (3)並列システム(m out of Nシステム)
   N個の部品のうち、m個が正常なら稼動するシステム。

   4 out of Nシステムの場合。
   1.すべてが故障している確率
     =(1-X)⁴
   2.4台のうち3台が故障している確率
     =₄C₁(1-X)³ ×X=4(1-X)³X
    よって、1-{(1-X)⁴+4(1-X)³X}
     =3X⁴-8X³+6X²


★SQLキーワード一覧

番号 コマンド 読み方 説明
1 ALTER オールト 表,定義域を変更する。
2 ANY エニー  
3 ASC   昇順
4 AUTHORIZATION オーソリゼーション 認可職別子,許可職別子。
5 BETWEEN ビットウィーン データ値の範囲の指定をする。
6 CHECK チェック 検査制約。
7 CLOSE クローズ カーソル操作を終了する。
8 COMMIT コミット データベースに対して行った更新操作を確定する。
9 CREATE クリエイト スキーマ,表,ビュー,定義域を定義する。
10 DECLARE デクレア 操作対象とする表を設定し,カーソルを割り当てる。
11 DEFAULT デフォルト 規定定義。
12 DELETE デリート 表に行を削除する。
13 DESC   降順
14 DISTINCT デシティンクト 重複を指定しない。
15 DROP ドロップ スキーマ,表,ビュー,定義域を削除する。
16 EXISTS EXISTS データ値の存在(不存在)の,検査の指定する。
17 FETCH フェッチ カーソルの位置にある行の値を取り出し,次の行に進める。
18 FOREIGN KEY フォーリンキー 外部キー制約。
19 GRANT グラント 表に対する操作権限を定義する。
20 GROUP BY グループ バイ グループ化にする
21 HAVING ハビング グループ化した後の条件
22 INSERT インサート 表に行を追加する。
23 LIKE ライク 文字列のパターン照合の指定をする。
24 OPEN オープン カーソル操作を開始し,カーソルを1行目に位置付ける。
25 ORDER BY オーダー バイ 並び替え
26 PRIMARY KEY プライマリーキー 主キー制約
27 REFERENCES リファレンス 参照
28 REVOKE リボック 表に対する操作権限を削除する。
29 ROLLBACK ロールバック データベースに対して行った更新操作を取り消す。
30 SELECT セレクト 表より,行,列のデータを抽出する。
31 SOME サム ANYと同じ
32 UNIQUE ユニーク 一意性制約。
33 UPDATE アップデート 表に行を変更する。
34 WHERE ウェアー 条件
35 WITH CHECK OPTION ウジ チェック ポットオン ビュー表の定義時に、拒否を指定する。

 

★SQLの例

1.SQL-DDL(Data Description Language)

(1)表定義
 CREATE TABLE 社員 (
  社員番号 CHAR(5) NOT NULL,
  社員名   NCHAR(10) NOT NULL,
  性別    NCHAR(1) CHECK(性別 IN( '男', '女' ) ),
  所属番号 CHAR(3),
  PRIMARY KEY(社員番号),
  FOREIGN KEY(所属番号) REFERENCES 所属(所属番号)
 )
(2)ビュー表定義
 CREATE VIEW 表名( 列名 [, 列名...] )
 AS SELECT 列名 [,  列名...] )
 FROM 表名
 [GROUP BY 列名]
 [HAVING 条件]
 [ORDER BY 列名 [ASC] [DESC] ]

2.SQL-DML(Data Manipulate Language)

(1)挿入
 INSERT INTO 会員住所
  VALUES ( 1234,  'A市' )
*CHARなら列名に''をつける。
(2)更新
 UPDATE 会員住所
  SET 住所 = 'A市' 
 WHERE 会員番号 = 1234
(3)削除
 DELETE FROM 会員住所
 WHERE 利用者番号 = 1234


★SQL(埋め込みSQL)

(1)カーソル宣言
DECLARE カーソル名 CURSOR FOR SELECT文

(2)カーソルを開く
OPEN カーソル名

(3)1行の取り出し
FETCH カーソル名 INTO ホスト変数

(4)カーソルを閉じる
CLOSE カーソル名

非カーソルによる操作
(1)検索
SELECT 属性名 [, 属性名・・・]
 INTO ホスト変数
FROM 表名
[WHERE 条件]

EXEC SQL・・・始まり
END-EXEC・・・終わり


★セキュリティ(暗号方式等)

秘密かぎ暗号方式(共通かぎ暗号方式)は、DESが代表。
公開かぎ暗号方式
 受信者の公開かぎで暗号化し、受信者の秘密かぎで復号化する。
メッセージ認証
 改ざんを検出する。メッセージ認証子(MAC)は、秘密かぎ暗号に基づく、ハッシュ関数で生成される。
ハッシュ関数
 ハッシュ関数の特徴
 1.入力データの長さに関係なく出力データは固定。
  (例1)30 % 4 = 2
  (例2)(5 + 6 × 2) % 4 = 1
 2.出力データから入力データを求めることが困難
  (例)X % 4 = 0の場合。
   4の倍数のどれかとなるため困難。
 3.出力データが同じとなる入力データを見つけることが困難

 ハッシュ関数の利用例
 1.送信者側は、ハッシュ関数を使って、MD(メッセージダイジェスト)を作る。
 2.受信側も同じくMDを作る。
 3.送信側がMDを送信し、受信者側がそれを比較する。比較した結果、同じならば改ざんされていない。

 

 SQL文も固有のベンダーではない為、中途半端間が漂いますが、合格当時からの情報なのでこれだけ覚えればSQL関連の問題で満点を取る事も可能です。

最後に私が問題を行った順番をご紹介します。参考になるか分かりませんが、問題1から順々に行う必要が無い事が分かります。試験当日は、どのような内容になるか分かりませんが私が受けた時の問題を参考にします。

問6 データベース
問5 アルゴリズム関連
ここで、約1時間を想定します。最悪の場合は、1時間半かけても頑張って全部解きましょう。
次に自分の得な問題に挑戦しましょう。
私の場合は、セキュリティでした。
残り3問は、適当に解ける問題だけ解きましょう。
私の考えでは、問5及び問6で約6割。得な問題(複数あればなお良い)で出来れば100%。それに応じて残り3問を全部で半分くらい取れれば合格できます。
明日、1日ありますので頑張ってください。

参考URL
ソフトウェア開発技術者試験受験者の為の総合支援ページ