• ベストアンサー

バグの確認って

通常、作成したプログラムなどの動作確認というのはどのような方法で行うとほぼ誤りが0になるものですか? PerlとPHPを独学で学びましたが、プログラム稼働後、思いもよらないミスが見つかったり、動きが正確に動いていなかったり、となかなか自分では全てのデバックをしきれず、苦慮しています。 全てのパタンを網羅、ができるときはよいのですが、それが100通り、200通りとなってくると、、、結局見逃してしまったり、、、 皆さんのコツやアドバイスがありましたら教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • don_go
  • ベストアンサー率31% (336/1059)
回答No.2

>それが100通り、200通りとなってくると、、、 100通り、200通り・・・それが例え10000通りであろうと 20000通りであろうと全てのパターンをチェックするのが 業務システムの開発では当り前の事です。 #コーディング自体よりデバッグの方に、より多くの時間 #をかけます。 >皆さんのコツやアドバイスがありましたら教えてください。 デバッグを行う前にチェックする項目と予想される結果の 一覧リストを作成しておくこと。 またテストの手順は予め、ちゃんと決めておくこと。 #いきあたりばったりではデバッグの効果は薄くなります。

kujitan
質問者

お礼

御礼遅くなりました。 >100通り、200通り・・・それが例え10000通りであろうと >20000通りであろうと全てのパターンをチェックするのが >業務システムの開発では当り前の事です。 そうですよね。耳が痛いです・・・ >一覧リストを作成しておくこと。 >またテストの手順は予め、ちゃんと決めておくこと。 これはすぐにも対応できます。 確かにいきあたりばったりでやっていると、前にやったかもしれないことをもう一度やってみたり、やってないことが残ってしまったり、結局時間がかかってしまいますよね。 きちんとリスト化することで整理もできると思うので早速取り入れます。

その他の回答 (5)

回答No.6

先日も以下のような質問が、他のカテにてされていました。とりあえず紹介。 バグがない・・・本来、それが普通なの? http://oshiete1.goo.ne.jp/qa3228987.html ここからは、さらに踏み込んでグローバルな観点から回答を試みる。 まず始めに、公式サイト。 JSTQB TOP > シラバス(学習事項)・用語集 http://www.jstqb.jp/syllabus.html 上記のサイトから今だと、「ISTQBテスト技術者資格制度 Foundation Levelシラバス日本語版Ver.1.0.1 (Ver.2005)」のpdfファイルが落とせると思います。このシラバスの35ページにも書かれてある通り、一般的にテスト設計技法というのは以下の3つに大別できます。 (1)仕様ベース、ブラックボックスのテスト技法(同値分割法や境界値分析など。) (2)構造ベース、ホワイトボックスのテスト技法(命令網羅や条件網羅など。) (3)経験ベースのテスト技法(エラー推測、探索的テストなど。) それと、同様に上記シラバスの30ページでは、「欠陥の検出」という同じ目的のテスト技法として、以下の3つを挙げています。 ・レビュー(仕様書の内容を、関係者でチェックしてコメント。) ・静的解析(対象ソフトウェアを、実行せずにツールで分析。) ・動的テスト(テスト対象のソフトウェアを実行して確認。) PMの資格も実務経験も全くないのであんまり大それたことは言えませんが、対策としては恐らくコストをどれだけ掛けれるかによって異なってくると思われます。 (a)多少、コストが高くなってもいい場合 →同様のシステムでのテスト経験者を新たに雇って、エラー推測や探索的テストを行ってもらう。 (b)コストを出来るだけ抑えたい場合 →レビューを出来るだけ早く実施して、事前報告に徹する。

kujitan
質問者

お礼

御礼遅くなり申し訳ございません。 大変分かりやすいご丁寧な回答をありがとうございます。 どこまでコストをかけられるかは案件によって異なりますが、全くの他者にテストをしてもらう、という考えは思いついたことがありませんでした。 まず資料を参考にさせていただきます。 ありがとうございました。

  • W_H
  • ベストアンサー率47% (21/44)
回答No.5

バグの確認で誤りがゼロというのは、ほぼないと思ったほうがいいと思います。 プログラムはいつまでも試行段階。完璧なんてないというのが普通ですから。 一応ぼくの方法は、例えば掲示板のようなものであれば、書き込みができる正規の半角英数データを入れて、動作確認。次に全角文字で動作確認。次に項目を順番に入力せずに動作確認し、ここでエラー処置の仕方を見る。そして仕上げにエラーになるであろうデータを、わざと入れて動作確認をします。 と、まぁ、とにかく上のように攻撃を仕掛けまくります。たまにアドレスをいじって、故意にありもしないデータを送ったりとかもするときがあります。とにかく、プログラムがどんなデータをどのように処理するか、いろいろしなければいけませんね。 ただ、それよりもバグが起こりにくいプログラムを書いたほうがいいと思います。 例えば、よく使う処理を関数にして重複を防ぎ、ごちゃごちゃする処理も関数にして、一つ一つの流れが見えやすくしたり、if文には必ずelseをいれ、そこにはどのパターンにも当てはまらない、処理できないデータが行くようにする、などの工夫措置を加える方がいいと思います。(つまり、予測範囲内のデータはすべて条件式に記す。elseを残った処理の場合に当てない。) 大体バグは見えにくい、分かりにくいコードに多いので、見易さ、理解しやすさを意識すれば、多分バグも減るのではと思います。デバッグも楽になりますし。 最後に、ユーザーは最高のテスターと誰かが言いました。プログラムの構造を知る人間がいくら実験したところで、何も知らないユーザーがプログラマーでさえ見落としていたバグを見つけます。なぜなら、ユーザーには先入観(データと内部処理の関係)がないからです。なので、自分がユーザーとしてプログラムを使う。もしくは協力者に使ってもらうのが、一番楽なバグの確認法だと思います。人間、先入観が多い生き物ですから。

kujitan
質問者

お礼

御礼遅くなり申し訳ございません。 具体的な方法をご教示頂き大変ありがとうございます。 わたしも大変な先入観の持ち主で、いつもどこかで自分が作ったから間違いない、、とかたくなに信じちゃっています。 それでは見つけられないですよね。 見やすさ、理解しやすさを意識したプログラムが作れるよう、勉強もしていきたいと思います。 ありがとうございました。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

経験則で言える事は、まめにテストすることですかね。 ・機能単位・関数単位の試験を作成中にキッチリと行う。 全体が出来てから一気にテストしようとしない事。 ・各機能・各関数のテストが合格したら全体の機能の試験を行う。 ・機能単位・関数単位の試験で条件分岐の閾値試験を行う。 ・全体の機能の試験試験項目の一覧を作成してテストを行う。 異常値・例外値の動作試験の項目を必ず盛り込むこと。 それとソースコード自体にバグを発見する工夫をすることです。 ・例外値で異常動作しないように必ずガードを掛けておく。 switch~caseのdefaultやif~elsifならelseなどを省略せずに必ずエラーとして表示するように書くと異常動作していていも気づかない場合をあるていど防ぐことが出来ます。 ・関数のパラメータも想定外の値をガードする。 あんまりやりすぎると動作が重くなるので、テスト時だけ有効にするなどの工夫が必要。

kujitan
質問者

お礼

御礼遅くなり申し訳ございません。 >例外値で異常動作しないように必ずガードを掛けておく。 これはぜひ取り入れてみようと思います。 例外値でなんどかひどい思いをしました。。。 ありがとうございました。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.3

>>PerlとPHPを独学で学びましたが、プログラム稼働後、思いもよらないミスが見つかったり、動きが正確に動いていなかったり、となかなか自分では全てのデバックをしきれず、苦慮しています。 バグって、他人が結果を見れば「ここ明白にエラーじゃないか!」と、一目瞭然の見落としから、最近では原発耐震設計でもありましたが「想定外!」っていうような、そういうケースがあるって設計時点で「聞いてないよ!」というものまでありますからね。(原発の場合は、聞こえていたけど、真面目にやったら原発建設が不可になるのが見えていたから、30年以上も昔から知らんぷりするのがお約束だったようですが・・・まあ、いいかげんですね) アメリカで大陸間弾道弾の防衛システムが始めて稼動したとき、敵味方識別信号に応答しないので、「ミサイル攻撃!」って、のぼり来る「月」に対して迎撃体制に入ったとかね。ユーザからすれば、明らかにバグだけど、プログラマにとっては、これは「バグじゃない!!」って言いたいものまでイロイロあります。 さし当たっては、「一晩寝て頭すっきりして、他人の目で結果を見る」とバグが一目瞭然に判明ってことあります。 >>全てのパタンを網羅、ができるときはよいのですが、それが100通り、200通りとなってくると、、、結局見逃してしまったり、、、 そのとおりです。小さなプログラムでも全てのケースをカバーしようと、「徹底的経路テスト」でテストケースを作成すると、100通り、200通りじゃあなく、100兆にもなったりして、数千回も転生輪廻してテスト人生をおくっても完了しないとかね。 >>皆さんのコツやアドバイスがありましたら教えてください。 まじめにテストを考えると、テストケースの設計って、とても難しいのです。この分野では,Glenford J.Myers氏の著作がとても参考になります。同氏の「ソフトウエアの信頼性」「高信頼性ソフトウエア」や「ソフトウェアテストの技法(第二版)」(いずれも近代科学社)などを読まれるといいと思います。 ただ、もっと簡単で直感的なやり方は、「テストが不可能と思えるような複雑な(大きな)プログラム単位でテストをしない(作らない)」ってことですね。テスト単位が小さな関数になるように設計すれば、比較的綿密なテストケースの設計をやっても、ケース数の爆発的増大には、ならないでしょうから。 テストの計画って、単純にマニュアルに沿ってチェックするってのじゃあなく、あらゆるケースを想像しないといけないという創造的で大変な仕事なんです。

kujitan
質問者

お礼

御礼遅くなり申し訳ございません。 >テストが不可能と思えるような複雑な(大きな)プログラム単位でテ >ストをしない(作らない) そうですね。まず作る時に極力簡素化するといいのですね。 超初心者の私はどうしても力技でチェックどころ満載のプログラムしか書けません。。。 しっかり勉強してチェックもしやすいプログラム作りに努めたいと思います。

noname#39970
noname#39970
回答No.1
kujitan
質問者

お礼

御礼遅くなりました。 参考URLありがとうございました。 参考にさせていただきます。

関連するQ&A

  • 膨大な数の中からミスを探すことは?

    初めてこのような掲示板を利用します。 先日、職場の人との話の中で疑問というか腑に落ちないことがありみなさんの意見を知りたく 質問させていただきます。 パソコンのプログラムや何かの製品など新しいものを作るにあたり、その不具合やプログラム上の ミス等はできる限り少なくしないといけないのは当たり前のことだと思います。 その中で、人間があらゆるパターンや環境を想定して、ミスを探し出すという行為は必要不可欠だと私は考えます。 しかし、この「あらゆるパターンや環境」というのが膨大な数になり、すべてを網羅することができないという場合、ミスを探し出すという行為(=試験)は無駄な作業だと思われますか? 全パターンを人間が試験するということが、現実問題(日数・費用・人員数など)として不可能なとき、 そのできる範囲の1割のパターンでも想定し試験し、その中で何かミスが発見できたならラッキーで、見つからなかったとしても正常動作の確認として試験をやることの意味(たとえ1割であっても)があると私は考えるのですが・・・ 同僚は全パターンを網羅できないのならその1割を試験することに何の意味もない、寝ずに働いてみんなでがんばったという思い出が残るだけのことだ・・・と言っていました。 私の考え方が幼いのか、社会のことを何もわかっていないのか漠然と不安になり、質問させていただきました。わかりにくい文や例えだと思うのですが、回答をお待ちしております。

  • デバック中に、今いるディレクトリを調べる方法

    Perlのデバック中に今いるディレクトリを知りたい場合、一旦プログラムを終了して今いるディレクトリを書き出すコードを追加する以外に方法は無いでしょうか。 それだとディレクトリが移動しそうな場所すべてにコードを追加しないといけないので、結構面倒だと思います。 一番教えて欲しいのはデバッカー内で常に今いるディレクトリを教えてくれる変数のような類です。それができない場合、デバックから抜けることなく今いるディレクトリを知るコマンドのような類は無いでしょうか。 デバッカーとしては、Perlに標準のものの他に、Active Perl のPDKも持っています。

  • VisualBasic.NET以降の生コード見たい

    VisualBasic.NET以降の環境で書かれて実際に稼働した(又は稼働中)の生コードを参照できるサイトはないでしょうか・・・? vb2010にて中小企業での導入を目的に帳票プログラムを開発するため独学で参考書を読みベータ版を試作し続けているのですが、動きはしますが本の理屈通りでコード無駄が多いように感じます。。単に文法説明的なサンプルコードではなく生のコードが見てみたいのですが、そのようなサイトはありますでしょうか?アドバイス願います(><)

  • LInuxとWindowsでのPerlの動作の違い

    LinuxでCGI(Perl)プログラムを作っています。 いつも動きの確認は自分のPC(Linux)と友人のPC(LInux)で行なっていました。 そして、昨夜別の友人のPC(Windows XP)を使う機会があってついでにそのPC上でプログラムを動かしてみたら一部が正確に動作してくれませんでした。でも、その後自分のPCで実行すると正確に動作してました。 WindowsとLinuxで動作に差がでるものなのでしょうか?

    • ベストアンサー
    • Perl
  • メモリの不足による演算ミスは起きるのか?

    よろしくお願いします.現在以下のシステムでPerlでのテキスト処理を行っています. OS: Windows XP Pro CPU: E8400@3.6Ghz Mem: 2G+3G(Ramdisk化) メモリの残量が多いときは演算が正確に出力され,残りが200MBくらいの時(複数の処理を実行している)には,Perlの演算がおかしくなります. プログラムのミスではないと思います. このようなことは起きるのでしょうか. カテゴリーが少し違うかもしれませんが,よろしくお願いします.

  • Javaで・・・・

    以前、某パソコンスクールにJavaを習いに行こうと思い、その前にそのスクールの体験学習を受けました。 わけもわからず、とりあえずこのプログラムを打ち込んで下さいと言われたので、言われるとおりに打ち込みました。それで、コンパイルと実行をすると、そのプログラムは風車が120度回転するごとに赤、青、緑と羽の色が変わるものでした。 わけもわからずやったのですが、感動しました! それで、その後思ったのですが、それってJavaじゃなくてJavaScriptだったのかなと思いました。 JavaScriptについて僕は詳しくわかりません。ただ、動きのあるものと聞いたので、あの時のプログラムは動きがあったのでJavaScriptかなと思いました。 Javaでそういった動きのあるものって作れないんですか?開発環境?によっては作ることができるんですか? その体験学習のときはソースコードは30行くらいだったと思うんですが、独学でやるくらいでも簡単にできそうなんですが無理なんでしょうか? 考えると、独学で参考書を見てやってる感じだと、 ただ単に文字や数字を表示するものばかりで、そもそも、風車という画像を現すことが出てないし。 あの時のプログラムは一体なんだったんだろー?

    • ベストアンサー
    • Java
  • \+って何ですか

    初めてのperl第2版を読んでいます。 正規表現のパターンの位置指定の所で /\b\+\b/; という例が出てきます。 2つの単語境界"\b"に"\+"が挟まれています。 この例の説明には "x+y"にマッチするが、"++"や" + "にはマッチしない とあります。 実際にスクリプトを書いてみると確かにその通りで、本の誤りという可能性も消えてしまいました。 他にも"aa+bb"や"12+39"などはマッチし、"+"はマッチしませんでした。 この"\+"はいったい何を表しているのでしょうか。

    • ベストアンサー
    • Perl
  • PHPを5万円で習えるとしたら安いでしょうか?

    webの基礎知識を学ぶためパソコンスクールに通おうと思っています。 そこではフォトショ、イラレ、DreamWeaver、Fireworks、Flash、3deMaxを学ぶ予定です。 さらに3月までのキャンペーンを使うと実質的にプラス5万円程度でPHP(かPerl)を勉強できるとの話でした。 個人的にプログラム系を学ぶならJavaかなと思っていたので、PHPを取るかは迷っています。 少しでも基礎をやっていればその後違うプログラムソフトを勉強しようと思ったときに入りやすいならやっといて損はないのかな~とも思います。 それともプログラム系をやりたいと思ったときに独学でやっていくか・・・。 みなさんの意見を聞ければ幸いです。 フォトショなどすべて独学でやればいいという意見はとりあえず考えない方向でお願いします。あくまでもPHPについてお願いします。

  • PerlプログラムをJavaに変換する知識

    現在、新しいプロジェクトでタイトル通り「PerlプログラムをJavaに変換する」 プログラムをやっています。業務ロジックをJavaに変換するだけなので 大して難しくないと会社から言われてたんですが、Perlの解読に難航してます。 正直、Javaの知識はあります。ですが、3年以上前でSwingアプリでした。 それ以降は、VB6.0とVBAの開発に特化していた為、とても古い知識しか ないと自分でも痛感していました。 最近はWEBアプリでフレームワークは当たり前のJAVA開発。 独学で少しづつやっていたものの、壁にぶち当たっています。 Perlは尚更経験なんて皆無に等しいです。。。 JavaのSwingまでの知識で、本来PerlをJavaに変換するのって 容易に出来るものでしょうか?プログラム変換の経験者が いましたら、意見をお聞きしたいです。 開発環境はEclipseで規約等はきちんと設計されてますが。。。 やはり単純なスキル不足なのでしょうか(^^;;

  • 論理とは正解を導くための公式では無いのでしょうか?

    現在、論理の本を読んで勉強をしているのですが、書いてあることが「正しい前提を」「漏れ無く重ねて」「正解を導く」というものになっています。 ですが、これは私が求めている論理とは、少し違う気がするのです。 私が欲しい論理は、「前提が足りていなくても、論理が正確であれば正解が導き出されるもの」です。 うまく説明できないのですが、 論理とは、つまり説明の流れのパターンだと思うのです。 だから、状況に応じて正しいパターンを選択できれば、前提(情報)が足りていなくても、正しい解を出し、それを他の人に説明し納得させられるのではないでしょうか? 勿論、状況に応じて使えるパターンは色々だと思いますし、状況の読み違えなどでパターンの選択ミスなどはあるとは思いますが、 それは本人の選択ミスであって、パターン自体が間違っているわけではない。 全てのパターンを把握して、それを状況に応じて使い分けることができるなら、物事が曖昧でも正しい解を導き出すことができるのではないでしょうか? だってそうでないと、世の中というのは曖昧なことばかりで説明ができません。なのに、立派な大人たちは曖昧な世の中を前提とした上で説得力のある言葉をぶつけてきます。

専門家に質問してみよう