質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C

    3448questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ソースコードだけで単体テスト設計書を作成する

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 1,205

ikatyan

score 1

単体テストの設計書をソースコードを見て作れと言われたのですが、
それが正しいことなのかどうか悩んでいます。

業務内容は、仕様書はなしで出来上がったソースコードを見て、if文の分岐を必ず一回は通るように試験ケースを設定し、入力値、出力値を設計書として書き出していくというものです。

疑問に思った点としましては、

  • 試験ケースが仕様書基準ではなく、ソースコード基準でつくられるため、もし出力値が仕様どおりでなくても、テストとしてはOKになってしまう。
  • そもそもテストとして成り立っているのかどうか。

プロの人から見た場合、仕様書なし、ソースコードのみでのテスト設計は正しいのかどうか、ご意見を伺いたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+9

疑問に思われている通り、テストとしては成立しません。

  • 指示をした人にテスト作成の意図を聞くのが一番早いですし、技術者のスキルとして聞き出す能力は必要とされると思います。(が、あんまりにもレベルが低そうな匂いがしてたら聞き辛い気持ちもわかります)

実際に何を意図しているかは聞かないと判明しないと思いますが、ありそうな推測を挙げてみます。

推測1
契約上の責任回避のための作業であるケース

推測するに「納品物としてのカバレッジ100%の単体テスト」が必要なだけであって、「品質を担保するためのテスト仕様書」は必要ではないということではないでしょうか。

膨大な量の「納品物としてのテスト仕様書」を納品し、検収させる(実際には全部目を通されることは無い)ことで責任問題を回避するための作業なんだと思います。

問題があったら、「仕様の解釈としての実装はテストケースの通りです。検収頂きましたよね?」と言い張ります。(法的に有効かどうかは別の話ですが。)

推測2
今後の修正でのデグレーションを防ぐための作業であるケース

今書かれているテスト設計書をベースに、ユニットテスト(自動テスト)を起こすつもりである。と希望的な観測をした場合は以下の様な意味で一定の意義はあるのかなと思います。

仕様としては結合テストのテストで担保し(こちらは仕様書ベースでテストを書くのかも)、単体テストは「テストを書いた時点から単体ベースでは変更がないことを担保する」ことに注力することで、今後単体レベルでの仕様変更はきちんと管理されるようになる。。。


追記
推測3
単語の定義の問題であるケース。
慣習的に「単体テストの設計書」と呼称されているものが実は「現在の仕様の確認/調査書」であるだけのケース。。。


追記2
推測1-2

推測1に近いですが、「とにかく納品物としてテスト仕様書が必要である(もしくは、になった)」ケース。
「発注側の組織内ルールとしてコードカバレッジ100%のテスト仕様書が必要」でかつ、「形式的には内部監査に耐えられる内容であること」が求められているが、予算/納期的に真面目に作るのは無理なので、今回の様なケースになることはありがちです。
受注時には約束してなかったテスト仕様書を当然の様に求められて、断り切れなかったとか、慣習的にそういった流れになってるとか。


推測2+3
網羅的な仕様確認の起点となるドキュメント作成であるケース。
実は、現在出来上がってるのものが、一種のプロトタイプ的なバージョンで、これをもとに最終仕様の検討などがされる場合にはあり得るケース。

まずは現在の仕様を把握し、わかっている範囲のテスト仕様書を書く(=現時点での単体詳細仕様書[主に正常系]が出来上がる)。
これをベースにして、全体の仕様書も作成する。
全体の仕様書が出来上がったら、単体仕様書をもう一度精査して、抜けているケースが無いかを確認していく。


色々推測を書きましたが、結局は指示した人に聞かないとわからないと思いますので (角が立たない様に)意図を尋ねられればベストだとは思います。 例えば、「出来るだけ見やすい/使いやすいものを作りたいので、この資料って誰がどうやって使うものなのか教えていただけませんか?」という感じとかでしょうか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/19 12:55

    ご回答ありがとうございます。
    やはり、プロから見てもおかしいテストなのですね…。
    作成の意図については指示者に聞いてみたいと思います。
    個人的には推測1-2が近そうですね。

    キャンセル

  • 2017/11/21 20:42

    推測1-2

    私が経験したときは,納品するためだけにテスト仕様書やテストを実施していましたね.
    東証のシステム開発では,IA DAMというデータベース(?)を使っていましたが,開発現場の全員がそのDBの仕様を理解していなかったため,動いた結果をテスト予測として用いて,さらにその結果を結果としていました.
    そのため,必ず予測と結果は一致するため,全てテスト結果がOKでした.当たり前ですね.

    そんな現場もあるので,成長する気が無ければ,特に気にする必要は無いと思います.

    キャンセル

+2

単体テストの設計書をソースコードを見て作れと言われた
仕様書なし、ソースコードのみでのテスト設計は正しいのか

質問者の方の疑問はもっともです。
たとえば「テストの答案を採点基準にしたら、
必ず100点になっちゃうじゃん」みたいなことに思えるでしょう。

すなわち、「コードが仕様」と、コードから起こしたテストでは、
そのコードにバグが含まれていても、検証できないではないかと。
検証するためには、仕様とコードを分離する必要があるはずです。


――しかし、実態として、
仕様書がないままテストを作る」、
テスト仕様書はテスターが作る」、
という現場はよくあるのではないかと推測します。

改めてまず、テストの仕様書/設計書などを誰が書くべきか、考えてみます。

システム開発の教科書的には、ウォーターフォールならV字モデルで、
詳細設計と単体テストが連動しているはずなので、
詳細設計の設計者がテスト仕様書も書くのが基本でしょう。

しかし、設計者は人件費の単価が高いことが多く、
経営層がテスト仕様書を書かせたがらないこともあります。

また、アジャイルなら、テストファーストなどとの相性もあり、
プログラマがテスト(仕様書)を書くこともあるでしょう。

少なくとも、自分で実装したので、コードの挙動は理解できているので、
これも選択肢として十分有力だと思います。

しかしこれもやはり、経営層がさせたがらないことがあります。
プログラムを書く工数よりも、設計やテストやドキュメントなどを書く、
それ以外の工数の方が多いのが普通なので、負担だということです。

こうして、テスターがテスト仕様書を書く、という事態が発生します。


私がテストできないのは、どう考えても(仕様書を書かない)お前らが悪い!
と開き直っても生産的でないので、べき論ではなく、別の道も考えていきましょう。

ところで、「プログラミング」とは、狭義のコーディングだけでなく、
設計まで含んだ広義のプログラミングの意味もあります。

同様に、広義のテストには設計も含む、と考えることもできそうです。
もちろん、一般的にそう認識されている、というわけではないですが。

なぜ、そう考えることに意味があるのかというと、
設計の時点でテストを完全にカバーするのが難しいからです。具体例を考えます。

「ボタンを押すと入力を表示する」プログラムに対して、
「ボタンを押すと入力を表示する」ことを確かめるだけでは、不十分なテストです。

たとえば、どういう文字種を許容するのか、半角全角どちらでも良いのかとか、
電話番号や郵便番号ではハイフンを入れるか入れないかとか、
HTMLのタグなどが入力できてしまうと、脆弱性につながる……とか、
入力だけでも何十個もテストする項目がありえます。全部実施できるか別として。

すると、設計の時点で全部カバーしようとしても、
人的リソースが足りなくなる事態も想定可能、というか現実によくあるでしょう。
テスト仕様書ができている「べき」、といっても現実にできない。
だから、あふれた設計的要素がテストまで流れてくる。

テストに設計的要素などというと、違和感があるかもしれませんが、
最近では「探索的テスト」の手法も注目されているようです。

簡単に説明すると、設計書などがなくても、バグがありそうな部分を
自力で探索してテストする手法です。これを、設計書がないのなら、
設計的要素がテストの責務に分配されている、と私は解釈しています。

最初の話に戻って、テスト仕様書がないからテストが不可能かといえば、
テストに設計的要素が入ってくることで可能なのではないかと思います。
ただ、そのためには、テスターが要件や仕様を把握する必要があります。


正しいのかどうか

「正しくない」と切って捨てるのは簡単です。
それなのになぜ、わざわざこんなことを言うのか?
自分の方が正しいと思うと、正しさに安住してしまうからです。

最初に戻ると、質問文の状況では、従来のただの制御パステストです。
そこから先に発展するのか不明ですが、現状ではかけ離れてます。
たんなる検収のアリバイのために、形だけ作っているのかもしれない。

それでも、現在の状況だけ見て、可能性を切り捨ててしまうと、
数年後には時代遅れになってしまう可能性だってあります。

そもそも、昔はテストを書かないところも多かったようですし、
テストファーストとかも普及してなかったし、今と色々違います。

昔はリファクタリングより「動いているものをいじるな」が正しかった。
昔は「正しくなかった」ものが「正しくなってきた」んです。

だから、かくあるべき、という「べき」論よりも、
現実に対してできることを探っていく方が、
とくに変化の早いIT関連では有効な考え方です。

たとえば、質問者の方がテストの力をつけていくことで、
提案する余地のようなものができていくかもしれない。

もっと遠い未来では、出世したり、転職したり、独立したりして、
組織のテストのやり方を変えるかもしれない。
新しいテスト技法の先駆者になるかもしれません。

そのためには、「新しい正しさ」を目指す必要があります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/19 13:03

    ご回答ありがとうございます。
    やはりテスト設計のやり方としてはおかしいのですね。
    しっかりと最新のテスト手法などを勉強し、自分から提案することができるよう頑張っていきたいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    引き継いだPHPのスパゲッティソースを自動テストするには?

    テストの自動化でアドバイスをいただきたいです。 業務でphp+MySQLの電子商取引プロジェクトを引継ぎました。 そして、運用と新機能の実装を任される事になりました。 私が任さ

  • 解決済

    xUnitを使った時のコストについて

    これまでレガシーシステムを作っていたので、xUnitを使った事がありませんでした。 この度、一人でちょっとしたプロラムを作ることになったので、xUnitを試しに使ってみることにしま

  • 解決済

    スマートフォンアプリの審査後の最終テスト

    スマートフォンアプリのアプリストア公開後のテストに関してです。 スマートフォンアプリを開発中は、 実機でデバッグなどをしていると思います。 しかしながら、 最終的にどういった動

  • 解決済

    単体テスト、結合テストの方法について

    単体テスト、結合テストについて質問です。 私はこれらのテストについて以下のように考えております。 単体テストについて 単体テストはカバレッジが100%になることを確認するも

  • 解決済

    組み込みプログラミングのコメントについて

    いつもお世話になっております。 組み込み時のプログラミングについての質問です。 組み込みでのプログラミングは処理を早くしたり、使うメモリを減らすためにできるだけ短く

  • 受付中

    RaspberryPiによるカメラの映像取得

    実現したいこと RaspberryPiによるMLC202bG(カメラ)の映像取得 状況 サンプルコード(apps/singleSnap)での1枚画像保存の動作は確認できま

  • 解決済

    aspxの内容をaspx.vbから置換したい

    aspxに書かれた文字列の一部をプログラムから動的に置換を行いたいです。 実現できる方法をご存知の方、ご教授いただけますでしょうか。 引数などで変わる値ではなくて 下

  • 解決済

    cakephp1.3から2.x系にアップグレード テスト。

    cakephp1.3から2.8にアップしましたが、テストについてご質問です。 phpunitを使って、コンバージョンしたことにより、変換されたすべての箇所をテストするべきでし

同じタグがついた質問を見る

  • C

    3448questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。