作成日 2010/4/30
最終更新日 2010/5/6

静的テストを行う

 静的テスト(静的チェックとも言う)というのは、プログラムを実際には動作させず(※1)、プログラムソースを直接解析し(※2)、悪い点(※3)を挙げることを言います。
 このページでは実際に静的テストを行うツールにどのようなものがあり、何を行ってくれるのか、そして、静的テストを行うメリットについて簡単に説明します。

 ところで、静的テストってオブジェクト指向とは全然関係ないんじゃないかという突っ込みが聞こえてきそうなので、答えます。
 確かに、これ自体はそうです。しかし、静的テストツールの中にはオブジェクト指向設計、プログラミングの観点から指摘をしてくれるツールがあるので必ずしもそうとも言い切れないと思います(※4)。
 それから、プログラミングスキルと言うのは単に「プログラミングがうまい = スキルが高い」でないです。より短時間に低コストで作れるためのツールをどれだけ知っているかというのもプログラミングスキルの一部なので、これを機会にぜひとも意識してもらえたらと思います(※5)。
-----
※1:プログラムを動作させて行うテスト(チェック)は動的テスト(動的チェック)と言います。
単体テスト、結合テストなどは実際にプログラムを動作させて行うので、これらは動的テストの一種となります。
※2:プログラムから生成されたバイナリ(実行ファイル)を解析する場合もあります。
※3:悪い点とは、具体的にはバグや速度、冗長な記述、保守性、可読性などに関する点です。
※4:だるまもお世話になったことがあります。
※5:とはいうもののVBA,VB6で使用できるツールは少ない…。

1.静的テストとは
2.静的テストでチェックする内容
3.静的テストツール
4.静的テストを行うメリット
5.参考文献


1.静的テストとは

 冒頭で既に説明していますが、静的テスト(静的チェック)とはプログラムを実際には動作させず、プログラムソース(もしくはコンパイルによって得られたバイナリファイル)を直接解析し、バグにつながりそうなところ、コーディング規約違反箇所、速度などのパフォーマンスに影響が出る箇所、その他、保守性、可読性、セキュリティを指摘、改善することを言います。

 机上デバッグやコードレビューのことを言っているの?と思った方、それはそれで正しいのですが、静的テストと言った場合にはそれ専用のツールを使用して行うことを指すことが多いと思います。このページでも専用のツールを使用したチェックのことを指すと思ってください。
 
このページのトップへ

2.静的テストでチェックする内容

 静的テストでチェックする内容は使用するツールによるのですが、一部紹介と言う形で説明します。こんなのをチェックしてくれるんだくらいに理解して頂ければと思います。4と7はオブジェクト指向に特に関係するものです。

  1. バグの要因になりそうな箇所のチェック
    ツール名:lint 対応言語:C言語
    ツール名:FindBugs 対応言語:Java

  2. コーディング規約チェック
    ツール名:Checkstyle 対応言語:Java
    …クラス、メソッド、変数などの名前がルールに従っているか、その他の規約などを指摘してくれます。

  3. 速度
    ツール名:VBCheck 対応言語:Visual Basic 5.0 , 6.0
    …高速化のためにプログラムを改善する余地のある箇所を指摘してくれます(※1)。

  4. オブジェクト指向に関するチェック
    ツール名:C++test 対応言語:C/C++
    …体験版がありますが、残念ながら有償のツールです。そして、個人で購入するには値段が高すぎる(会社が買うのであればたいした値段ではないと思う。)。
    ちなみに、C++Testはオブジェクト指向に関するチェック以外のチェックもやってくれます(本当にいろいろやってくれる)。
    有償にもかかわらず、これを挙げた理由は、、、本当にツールとしては優れていると思ったからです。

  5. セキュリティに関するチェック
    ツール名:RATS 対応言語:C言語など

  6. 移植性に関するチェック
    ツール名:Code Advisor for Visual Basic 6.0 日本語版 対応言語:Visual Basic 6.0
    このツールはVB6.0のソースがコーディング規約に沿っているかを確認するツールなのですが、VB.NETへの移行に関して、問題がある箇所の報告も行ってくれます。

  7. 可読性・保守性などに関するチェック(ソフトウェアメトリクスのチェック)
    ツール名:Eclipse Metrics Plugin 対応言語:Java
    …メソッドの複雑度、LOC(メソッドのコード行数)、フィールド数、凝集度、結合度などをチェックします。

  8. ドキュメントに関するチェック
    ツール名:Checkstyle 対応言語:Java
    …すでに、Checkstyleについては挙げたのですが、このツールはJavadoc(Javaプログラム中に記載するドキュメント(詳細設計書と考えてください)出力用のコメント)の記載漏れなどもチェックしてくれます。


    ツール名:Doxygen 対応言語:C/C++,Java,IDLなど
    …Doxygenは本来は、Javadocのようにプログラム中に書かれたドキュメント生成用のコメントからHTML形式などのドキュメントを生成するツールなのですが、ツールを実行したときに、記載漏れ、ミスについて報告してくれるのでチェックツールとしても使用できます。


    ツール名:Microsoft Word 対応言語:日本語など
    …は?と思った方もいると思いますが、実は「です・ます(だ・である)」調のチェック、スペルチェックなどを行う機能があります。
    いや、実は仕様書やマニュアルを執筆するときに意外と使えるんです。文書の自動化(わかりやすいところでは図表番号)も結構行えるので、知っているとお得です。
-----
※1:速度については、ツールではチェックしきれない箇所(無駄なファイルアクセス、ネットワークアクセス、アルゴリズムなど)による場合があります。いきなりツールで解決するしようとするのではなく、まずはプログラムのいろんな箇所に時間測定用のログ出力を追加し、実行速度を測定、ボトルネックとなっている箇所の調査、プログラムを修正という手順を踏んだ方が良いです。

このページのトップへ

3.静的テストツール

 静的テストツールを紹介します。ツールが静的テストツールと謳ってなくても、静的テストツールとして使用できるものは挙げてあります。

■Visual Basic 6.0 用
 コンパイラのチェック
  …Object型の使用を極力やめたり、変数の宣言を強制することでチェックを強化できます。
 VBCheck
  …実行速度において改善余地のある箇所を報告します。
 Code Advisor for Visual Basic 6.0 日本語版
  …コーディング規約に沿っていない箇所やVB.NETへの移行に関して問題になる箇所を報告します。
 DevPartner Studio Professional Edition Code Review(有償)
  …VB.NETへの移行に関して問題になる箇所を報告します。また、VB.NET以降後のソースのチェックも行います。

■Java 用
 コンパイラのチェック
  …推奨されないクラスやメソッドを使用していないかのチェックが可能です。
 Checkstyle
  …クラス、メソッド、変数などの名前がルールに従っているか、その他の規約などを指摘してくれます。
 FindBugs
  …バグとなりそうな箇所を報告します。
 PMD
  …バグとなりそうな箇所を報告します。
 Fortify SCA(たぶん有償)
  …セキュリティに関するチェックを行います。

■C/C++ 用
 コンパイラのチェック
  …警告レベルを上げることで使用していない変数・引数などのチェックを行える場合があります。
 RATS
  …セキュリティに関するチェックを行います。
 lint
  …バグとなりそうな箇所を報告します。
 splint
  …バグとなりそうな箇所を報告します。
 C++test(有償)
  …コーディング規約、オブジェクト指向に関するチェック、ソフトウェアメトリクスに関するチェックなどいろいろなチェックを行ってくれます。
 Coverity Prevent Static Analysis for C/C++(有償)
  …バグとなりそうな箇所やセキュリティに関するチェックを行います。
 Fortify SCA(たぶん有償)
  …セキュリティに関するチェックを行います。

■ドキュメント 用
 Checkstyle
  …Javadocをチェックし不足している箇所をチェックします。
 Doc Check Doclet v 1.2 Beta
  …Javadocをチェックし不足している箇所をチェックします。
 Doxygen
  …すでに述べましたが、ドキュメント用コメントのチェックツールとしても使用できます。
 Microsoft Word
  …日本語で書いた文書のチェックを行うことができます。
このページのトップへ

4.静的テストを行うメリット

 静的テストツールを使うには、そのツールについての勉強(使用法とか)をしたり、場合によっては購入したりといったデメリットがあるので、メリットがないとツールを使う気が起きないと思います。

 メリットを以下にあげますので、参考にしてください。
  1. 品質のよりプログラムをより短時間で作成できるようになる
    バグについては単体テストを行えば、確かにつぶせるのですが、単体テストは仕様書作成とその実施に時間がかかるので、それを行わずにバグがつぶせるのは大きなメリットです(※1)。

    机上デバッグ、コードレビューでもバグを取り除くことはできますが、机上でバッグ、コードレビューにもかなりの時間がかかります。それを短時間に、また繰り返し行うことができるようになる(バグ修正後、再度静的テストを行うという使い方)というのは、ものすごいメリットです(※2)。

  2. プログラマのプログラミングスキルの向上に役立つ
    ツールは、なぜ悪いのかといった理由まで、きちんと説明しているものが多いです。
    また、繰り返しチェックされる(嫌になることもありますが)ので、自然に暗記してしまいます(トラウマになる?)。

    セキュリティ関連のチェックについてはツールがないと無理です(ツールを使わない限り学習の機会が無い)ので、是非ともツールの導入を検討しましょう。

  3. プログラマへの教育にかかるコストを減らせる
    机上デバッグ、コードレビューというのは実はプログラマの教育も兼ねているのですが、それをツールがある程度行ってくれるようになるのでコストを減らせるということです。 
-----
※1:静的テストですべてのバグをつぶすことは不可能です。静的テストを行ったからといって動的テストである単体テストなどが不要になるといったことは一切ありません。しかし、単体テストの工数を減らすことはできます。
※2:静的テストを行う場合でも、机上デバッグ、コードレビューは1度はしたほうが良いです。なぜかというと、静的テストツールではプログラマの勘違いによるバグ、仕様バグ、無駄なアルゴリズムの使用、無駄なファイルアクセスなど、チェックできないものがあるためです。
このページのトップへ

5.参考文献

 このページを作成する際に参考にしたページや書籍などです。

番号

リンク先の名称

リンク先の説明

リンクした日

1 ソフトウェアテスト基本テクニック:第2回 静的テスト|gihyo.jp … 技術評論社 静的テストについての概要。 2010/4/30

2

静的コード解析 - Wikipedia Wikipediaのページ。静的テストツールがたくさん紹介されています。 2010/4/30

3

@IT:Java TIPS -- コーディング規約に従わないコードを検索する CheckStyleプラグインの紹介をしています。 2010/4/30
4 ツール  セキュリティ上の問題を発見するツールを紹介しています 2010/4/30
5 @IT:初めてのソフトウェアメトリクス(前編) ソフトウェアメトリクス(品質測定)について説明しています 2010/4/30
6 ソフトウェアメトリクスを意識する - だるまのエクセルVBA ソフトウェアメトリクス(品質測定)について説明しています 2010/4/30
7 プログラム解析ツール 静的テストツールを紹介してます。 2010/4/30



Prev Up Next  Top
このページのトップへ

このページの利用によって発生した、いかなる損害について、このホームページの作成者は責任を負いません。
このページの間違いや嘘を見つけた方、このページに書いて欲しい情報がある方はメールをお願いします。

Microsoft 、Windows 、Visual Basic 、 Word および Excel は米国Microsoft Corporationの米国およびその他の国における登録商標または商標です。
ここではWord® をワード 、Excel® をエクセル、Visual Basic® for Applications をVBAと表記する場合があります。
Mac 、Mac OS 、Mac OS X は米国Apple Computer,Inc.の登録商標または商標です。
JDK、JavaおよびすべてのJava関連の商標およびロゴは、米国および他の国における米国Sun Microsystems ,Inc.の商標または登録商標です。
FORTIFY SCAは、Fortify Software,Inc.の商標、または登録商標です。
Coverity、Coverity Preventは、Coverity, Inc. の商標です。
C++test は米国Parasoft社の登録商標です。
その他、社名および商品名、システム名称などは、一般に各社の商標または登録商標です。

このホームページの作成者はこれらの会社とはいっさい関係がありません。